diff options
Diffstat (limited to 'Makerules')
-rw-r--r-- | Makerules | 64 |
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 |