aboutsummaryrefslogtreecommitdiff
path: root/Makerules
diff options
context:
space:
mode:
Diffstat (limited to 'Makerules')
-rw-r--r--Makerules64
1 files changed, 55 insertions, 9 deletions
diff --git a/Makerules b/Makerules
index 5f938dd102..78089e6b4a 100644
--- a/Makerules
+++ b/Makerules
@@ -413,29 +413,75 @@ endif
lib%.so: lib%_pic.a $(+preinit) $(+postinit) $(+interp)
$(build-shlib)
-define build-shlib
-$(LINK.o) -shared -Wl,-O1 -o $@ $(sysdep-LDFLAGS) $(config-LDFLAGS) \
+define build-shlib-helper
+$(LINK.o) -shared -Wl,-O1 $(sysdep-LDFLAGS) $(config-LDFLAGS) \
$(extra-B-$(@F:lib%.so=%).so) -B$(csu-objpfx) \
$(extra-B-$(@F:lib%.so=%).so) $(load-map-file) \
-Wl,-soname=lib$(libprefix)$(@F:lib%.so=%).so$($(@F)-version) \
$(LDFLAGS.so) $(LDFLAGS-$(@F:lib%.so=%).so) \
- -L$(subst :, -L,$(rpath-link)) -Wl,-rpath-link=$(rpath-link) \
- -Wl,--whole-archive \
+ -L$(subst :, -L,$(rpath-link)) -Wl,-rpath-link=$(rpath-link)
+endef
+
+ifeq (yes,$(elf))
+# binutils only position loadable notes into the first page for binaries,
+# not for shared objects
+define build-shlib
+$(build-shlib-helper) \
+ -o $@.new $(csu-objpfx)/abi-note.o -Wl,--verbose \
+ $(LDLIBS-$(@F:lib%.so=%).so) 2>&1 | \
+ sed -e '/^=========/,/^=========/!d;/^=========/d' \
+ -e 's/^.*\.hash[ ]*:.*$$/ .note.ABI-tag : { *(.note.ABI-tag) } &/' \
+ > $@.lds; \
+ rm -f $@.new; \
+ $(build-shlib-helper) -o $@ -T $@.lds \
+ -Wl,--whole-archive $(csu-objpfx)/abi-note.o \
+ $(filter-out $(map-file) $(+preinit) $(+postinit),$^) \
+ $(no-whole-archive) $(LDLIBS-$(@F:lib%.so=%).so); \
+ rm -f $@.lds
+endef
+else
+define build-shlib
+$(build-shlib-helper) \
+ -o $@ -Wl,--whole-archive \
$(filter-out $(map-file) $(+preinit) $(+postinit),$^) \
$(no-whole-archive) $(LDLIBS-$(@F:lib%.so=%).so)
endef
+endif
+
+define build-module-helper
+$(LINK.o) -shared $(sysdep-LDFLAGS) $(config-LDFLAGS) \
+ -B$(csu-objpfx) $(load-map-file) \
+ $(LDFLAGS.so) $(LDFLAGS-$(@F:%.so=%).so) \
+ -L$(subst :, -L,$(rpath-link)) -Wl,-rpath-link=$(rpath-link)
+endef
# This macro is similar to build-shlib but it does not define a soname
# and it does not depend on the destination name to start with `lib'.
+ifeq (yes,$(elf))
+# binutils only position loadable notes into the first page for binaries,
+# not for shared objects
define build-module
-$(LINK.o) -shared -o $@ $(sysdep-LDFLAGS) $(config-LDFLAGS) \
- -B$(csu-objpfx) $(load-map-file) \
- $(LDFLAGS.so) $(LDFLAGS-$(@F:%.so=%).so) \
- -L$(subst :, -L,$(rpath-link)) -Wl,-rpath-link=$(rpath-link) \
- -Wl,--whole-archive \
+$(build-module-helper) \
+ -o $@.new $(csu-objpfx)/abi-note.o -Wl,--verbose \
+ $(LDLIBS-$(@F:lib%.so=%).so) 2>&1 | \
+ sed -e '/^=========/,/^=========/!d;/^=========/d' \
+ -e 's/^.*\.hash[ ]*:.*$$/ .note.ABI-tag : { *(.note.ABI-tag) } &/' \
+ > $@.lds; \
+ rm -f $@.new; \
+ $(build-module-helper) -o $@ -T $@.lds \
+ -Wl,--whole-archive $(csu-objpfx)/abi-note.o \
+ $(filter-out $(map-file) $(+preinit) $(+postinit),$^) \
+ $(no-whole-archive) $(LDLIBS-$(@F:lib%.so=%).so); \
+ rm -f $@.lds
+endef
+else
+define build-module
+$(build-module-helper) \
+ -o $@ -Wl,--whole-archive \
$(filter-out $(map-file) $(+preinit) $(+postinit),$^) \
$(no-whole-archive) $(LDLIBS-$(@F:%.so=%).so)
endef
+endif
# Don't try to use -lc when making libc.so itself.
# Also omits crti.o and crtn.o, which we do not want