about summary refs log tree commit diff
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