https://gcc.gnu.org/g:34039b22adea4d7809dae53f809177d6dd1155d9
commit r16-6892-g34039b22adea4d7809dae53f809177d6dd1155d9 Author: Jakub Jelinek <[email protected]> Date: Mon Jan 19 09:45:10 2026 +0100 libatomic: Change installed libatomic_asneeded.a into a symlink [PR123650] So, apparently I've tripped over not just one linker bug with the libatomic/libgcc_s asneeded workaround for libtool bug, but two. One is that mold doesn't parse INPUT ( AS_NEEDED ( -latomic ) ) or INPUT ( AS_NEEDED ( -lgcc_s ) ) correctly, I think that just should be fixed in mold. Another one is that ld.bfd doesn't handle correctly INPUT ( libatomic.a ) when doing static linking with -flto. While that bug should be fixed too in the linker, the reason to install a linker script for a static library has been just my laziness, a symbolic link is more efficient, and even on hosts without symbolic link for a very small library like libatomic.a we can live with a cp -pR copy of it. Furthermore, when I was checking in the last patch (i.e. r16-6736 PR123396), git was loudly complaining about libatomic_asneeded.a being checked into repository when *.a is in .gitignored. So, the following patch revamps the libatomic_asneeded* handling. libatomic_asneeded.so is rewritten in the way that libgcc_s_asneeded.so is done and libatomic_asneeded.a installed using $(LN_S). 2026-01-19 Jakub Jelinek <[email protected]> PR libgcc/123650 * Makefile.am (toolexeclib_DATA): Remove. (all-local): For LIBAT_BUILD_ASNEEDED_SOLINK instead of installing libatomic_asneeded.{so,a} from top_srcdir cd into the destination directory, use echo to write libatomic_asneeded.so and $(LN_S) to symlink libatomic_asneeded.a to libatomic.a. (install-data-am): For LIBAT_BUILD_ASNEEDED_SOLINK depend on install-asneeded. (install-asneeded): New goal. * libatomic_asneeded.so: Remove. * libatomic_asneeded.a: Remove. * Makefile.in: Regenerate. Diff: --- libatomic/Makefile.am | 26 +++++++++++++--- libatomic/Makefile.in | 68 +++++++++++++++++------------------------ libatomic/libatomic_asneeded.a | 3 -- libatomic/libatomic_asneeded.so | 3 -- 4 files changed, 49 insertions(+), 51 deletions(-) diff --git a/libatomic/Makefile.am b/libatomic/Makefile.am index 2a10f7da8341..4fbd5ad4b771 100644 --- a/libatomic/Makefile.am +++ b/libatomic/Makefile.am @@ -40,9 +40,6 @@ AM_CCASFLAGS = $(XCFLAGS) AM_LDFLAGS = $(XLDFLAGS) $(SECTION_LDFLAGS) $(OPT_LDFLAGS) toolexeclib_LTLIBRARIES = libatomic.la -if LIBAT_BUILD_ASNEEDED_SOLINK -toolexeclib_DATA = libatomic_asneeded.so libatomic_asneeded.a -endif noinst_LTLIBRARIES = libatomic_convenience.la if LIBAT_BUILD_VERSIONED_SHLIB @@ -187,11 +184,30 @@ gcc_objdir = `pwd`/$(MULTIBUILDTOP)../../gcc/ all-local: libatomic.la $(LIBTOOL) --mode=install $(INSTALL_DATA) libatomic.la $(gcc_objdir)$(MULTISUBDIR)/ if LIBAT_BUILD_ASNEEDED_SOLINK - $(INSTALL_DATA) $(top_srcdir)/libatomic_asneeded.so $(gcc_objdir)$(MULTISUBDIR)/ - $(INSTALL_DATA) $(top_srcdir)/libatomic_asneeded.a $(gcc_objdir)$(MULTISUBDIR)/ + cd $(gcc_objdir)$(MULTISUBDIR) || exit 1; \ + (echo "/* GNU ld script"; \ + echo " Add DT_NEEDED entry for -latomic only if needed. */"; \ + echo "INPUT ( AS_NEEDED ( -latomic ) )" \ + ) > libatomic_asneeded.so; \ + rm -f libatomic_asneeded.a; \ + $(LN_S) libatomic.a libatomic_asneeded.a endif rm $(gcc_objdir)$(MULTISUBDIR)/libatomic.la +if LIBAT_BUILD_ASNEEDED_SOLINK +install-data-am: install-asneeded + +install-asneeded: install-toolexeclibLTLIBRARIES + $(MKDIR_P) "$(DESTDIR)$(toolexeclibdir)" || exit 1; \ + cd "$(DESTDIR)$(toolexeclibdir)" || exit 1; \ + (echo "/* GNU ld script"; \ + echo " Add DT_NEEDED entry for -latomic only if needed. */"; \ + echo "INPUT ( AS_NEEDED ( -latomic ) )" \ + ) > libatomic_asneeded.so; \ + rm -f libatomic_asneeded.a; \ + $(LN_S) libatomic.a libatomic_asneeded.a +endif + # target overrides -include $(tmake_file) diff --git a/libatomic/Makefile.in b/libatomic/Makefile.in index 73f553fc6c93..552ae4fb72c6 100644 --- a/libatomic/Makefile.in +++ b/libatomic/Makefile.in @@ -14,7 +14,6 @@ @SET_MAKE@ - VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ @@ -159,8 +158,7 @@ am__uninstall_files_from_dir = { \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } -am__installdirs = "$(DESTDIR)$(toolexeclibdir)" \ - "$(DESTDIR)$(toolexeclibdir)" +am__installdirs = "$(DESTDIR)$(toolexeclibdir)" LTLIBRARIES = $(noinst_LTLIBRARIES) $(toolexeclib_LTLIBRARIES) @ARCH_AARCH64_LINUX_TRUE@@PARTIAL_VXWORKS_FALSE@am__objects_1 = \ @ARCH_AARCH64_LINUX_TRUE@@PARTIAL_VXWORKS_FALSE@ atomic_16.lo @@ -246,7 +244,6 @@ am__can_run_installinfo = \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac -DATA = $(toolexeclib_DATA) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ @@ -425,7 +422,6 @@ AM_CFLAGS = $(XCFLAGS) AM_CCASFLAGS = $(XCFLAGS) AM_LDFLAGS = $(XLDFLAGS) $(SECTION_LDFLAGS) $(OPT_LDFLAGS) toolexeclib_LTLIBRARIES = libatomic.la -@LIBAT_BUILD_ASNEEDED_SOLINK_TRUE@toolexeclib_DATA = libatomic_asneeded.so libatomic_asneeded.a noinst_LTLIBRARIES = libatomic_convenience.la @LIBAT_BUILD_VERSIONED_SHLIB_FALSE@libatomic_version_script = @LIBAT_BUILD_VERSIONED_SHLIB_GNU_TRUE@@LIBAT_BUILD_VERSIONED_SHLIB_TRUE@libatomic_version_script = -Wl,--version-script,$(top_srcdir)/libatomic.map @@ -671,27 +667,6 @@ clean-libtool: distclean-libtool: -rm -f libtool config.lt -install-toolexeclibDATA: $(toolexeclib_DATA) - @$(NORMAL_INSTALL) - @list='$(toolexeclib_DATA)'; test -n "$(toolexeclibdir)" || list=; \ - if test -n "$$list"; then \ - echo " $(MKDIR_P) '$(DESTDIR)$(toolexeclibdir)'"; \ - $(MKDIR_P) "$(DESTDIR)$(toolexeclibdir)" || exit 1; \ - fi; \ - for p in $$list; do \ - if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ - echo "$$d$$p"; \ - done | $(am__base_list) | \ - while read files; do \ - echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(toolexeclibdir)'"; \ - $(INSTALL_DATA) $$files "$(DESTDIR)$(toolexeclibdir)" || exit $$?; \ - done - -uninstall-toolexeclibDATA: - @$(NORMAL_UNINSTALL) - @list='$(toolexeclib_DATA)'; test -n "$(toolexeclibdir)" || list=; \ - files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ - dir='$(DESTDIR)$(toolexeclibdir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. @@ -800,10 +775,10 @@ distclean-tags: -rm -f cscope.out cscope.in.out cscope.po.out cscope.files check-am: all-am check: check-recursive -all-am: Makefile $(LTLIBRARIES) $(DATA) auto-config.h all-local +all-am: Makefile $(LTLIBRARIES) auto-config.h all-local installdirs: installdirs-recursive installdirs-am: - for dir in "$(DESTDIR)$(toolexeclibdir)" "$(DESTDIR)$(toolexeclibdir)"; do \ + for dir in "$(DESTDIR)$(toolexeclibdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive @@ -861,14 +836,13 @@ info: info-recursive info-am: -install-data-am: +@LIBAT_BUILD_ASNEEDED_SOLINK_FALSE@install-data-am: install-dvi: install-dvi-recursive install-dvi-am: -install-exec-am: install-exec-local install-toolexeclibDATA \ - install-toolexeclibLTLIBRARIES +install-exec-am: install-exec-local install-toolexeclibLTLIBRARIES install-html: install-html-recursive @@ -911,8 +885,7 @@ ps: ps-recursive ps-am: -uninstall-am: uninstall-toolexeclibDATA \ - uninstall-toolexeclibLTLIBRARIES +uninstall-am: uninstall-toolexeclibLTLIBRARIES .MAKE: $(am__recursive_targets) all install-am install-strip @@ -927,14 +900,12 @@ uninstall-am: uninstall-toolexeclibDATA \ install-exec install-exec-am install-exec-local install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ - install-strip install-toolexeclibDATA \ - install-toolexeclibLTLIBRARIES installcheck installcheck-am \ - installdirs installdirs-am maintainer-clean \ + install-strip install-toolexeclibLTLIBRARIES installcheck \ + installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic maintainer-clean-local mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ mostlyclean-local pdf pdf-am ps ps-am tags tags-am uninstall \ - uninstall-am uninstall-toolexeclibDATA \ - uninstall-toolexeclibLTLIBRARIES + uninstall-am uninstall-toolexeclibLTLIBRARIES .PRECIOUS: Makefile @@ -960,10 +931,27 @@ vpath % $(strip $(search_path)) all-multi: $(libatomic_la_LIBADD) all-local: libatomic.la $(LIBTOOL) --mode=install $(INSTALL_DATA) libatomic.la $(gcc_objdir)$(MULTISUBDIR)/ -@LIBAT_BUILD_ASNEEDED_SOLINK_TRUE@ $(INSTALL_DATA) $(top_srcdir)/libatomic_asneeded.so $(gcc_objdir)$(MULTISUBDIR)/ -@LIBAT_BUILD_ASNEEDED_SOLINK_TRUE@ $(INSTALL_DATA) $(top_srcdir)/libatomic_asneeded.a $(gcc_objdir)$(MULTISUBDIR)/ +@LIBAT_BUILD_ASNEEDED_SOLINK_TRUE@ cd $(gcc_objdir)$(MULTISUBDIR) || exit 1; \ +@LIBAT_BUILD_ASNEEDED_SOLINK_TRUE@ (echo "/* GNU ld script"; \ +@LIBAT_BUILD_ASNEEDED_SOLINK_TRUE@ echo " Add DT_NEEDED entry for -latomic only if needed. */"; \ +@LIBAT_BUILD_ASNEEDED_SOLINK_TRUE@ echo "INPUT ( AS_NEEDED ( -latomic ) )" \ +@LIBAT_BUILD_ASNEEDED_SOLINK_TRUE@ ) > libatomic_asneeded.so; \ +@LIBAT_BUILD_ASNEEDED_SOLINK_TRUE@ rm -f libatomic_asneeded.a; \ +@LIBAT_BUILD_ASNEEDED_SOLINK_TRUE@ $(LN_S) libatomic.a libatomic_asneeded.a rm $(gcc_objdir)$(MULTISUBDIR)/libatomic.la +@LIBAT_BUILD_ASNEEDED_SOLINK_TRUE@install-data-am: install-asneeded + +@LIBAT_BUILD_ASNEEDED_SOLINK_TRUE@install-asneeded: install-toolexeclibLTLIBRARIES +@LIBAT_BUILD_ASNEEDED_SOLINK_TRUE@ $(MKDIR_P) "$(DESTDIR)$(toolexeclibdir)" || exit 1; \ +@LIBAT_BUILD_ASNEEDED_SOLINK_TRUE@ cd "$(DESTDIR)$(toolexeclibdir)" || exit 1; \ +@LIBAT_BUILD_ASNEEDED_SOLINK_TRUE@ (echo "/* GNU ld script"; \ +@LIBAT_BUILD_ASNEEDED_SOLINK_TRUE@ echo " Add DT_NEEDED entry for -latomic only if needed. */"; \ +@LIBAT_BUILD_ASNEEDED_SOLINK_TRUE@ echo "INPUT ( AS_NEEDED ( -latomic ) )" \ +@LIBAT_BUILD_ASNEEDED_SOLINK_TRUE@ ) > libatomic_asneeded.so; \ +@LIBAT_BUILD_ASNEEDED_SOLINK_TRUE@ rm -f libatomic_asneeded.a; \ +@LIBAT_BUILD_ASNEEDED_SOLINK_TRUE@ $(LN_S) libatomic.a libatomic_asneeded.a + # target overrides -include $(tmake_file) diff --git a/libatomic/libatomic_asneeded.a b/libatomic/libatomic_asneeded.a deleted file mode 100644 index 0190b40b97df..000000000000 --- a/libatomic/libatomic_asneeded.a +++ /dev/null @@ -1,3 +0,0 @@ -/* GNU ld script - Just link in libatomic.a. */ -INPUT ( libatomic.a ) diff --git a/libatomic/libatomic_asneeded.so b/libatomic/libatomic_asneeded.so deleted file mode 100644 index 3263af4b4159..000000000000 --- a/libatomic/libatomic_asneeded.so +++ /dev/null @@ -1,3 +0,0 @@ -/* GNU ld script - Add DT_NEEDED entry for -latomic only if needed. */ -INPUT ( AS_NEEDED ( -latomic ) )
