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 ) )

Reply via email to