[gcc r16-6892] libatomic: Change installed libatomic_asneeded.a into a symlink [PR123650]
Jakub Jelinek
jakub@gcc.gnu.org
Mon Jan 19 08:46:19 GMT 2026
https://gcc.gnu.org/g:34039b22adea4d7809dae53f809177d6dd1155d9
commit r16-6892-g34039b22adea4d7809dae53f809177d6dd1155d9
Author: Jakub Jelinek <jakub@redhat.com>
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 <jakub@redhat.com>
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 ) )
More information about the Gcc-cvs
mailing list