https://gcc.gnu.org/bugzilla/show_bug.cgi?id=123396
Bug ID: 123396
Summary: [16 Regression] libstdc++ uselessly linked against
-latomic
Product: gcc
Version: 16.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: libstdc++
Assignee: unassigned at gcc dot gnu.org
Reporter: jakub at gcc dot gnu.org
Target Milestone: ---
I bet since r16-4315 but haven't verified libstdc++.so.6.0.35 is uselessly
linked against libatomic.so.1 even on targets where nothing is needed from that
library.
That is a significant waste of resources.
I have no idea what causes it though, that commit added
--push-state --as-needed -latomic --pop-state
to *link_gcc_c_sequence, so normally -latomic should be only linked in when
needed.
The libstdc++ link invocation is like
/bin/sh ../libtool --tag CXX --mode=link /home/jakub/src/gcc/obj32/./gcc/xgcc
-shared-libgcc -B/home/jakub/src/gcc/obj32/./gcc -nostdinc++
-L/home/jakub/src/gcc/obj32/x86_64-pc-linux-gnu/libstdc++-v3/src
-L/home/jakub/src/gcc/obj32/x86_64-pc-linux-gnu/libstdc++-v3/src/.libs
-L/home/jakub/src/gcc/obj32/x86_64-pc-linux-gnu/libstdc++-v3/libsupc++/.libs
-B/usr/local/x86_64-pc-linux-gnu/bin/ -B/usr/local/x86_64-pc-linux-gnu/lib/
-isystem /usr/local/x86_64-pc-linux-gnu/include -isystem
/usr/local/x86_64-pc-linux-gnu/sys-include -fchecking=1 -Wl,-O1 -Wl,-z,relro
-Wl,--gc-sections -std=gnu++98 -fPIC -DPIC -fno-implicit-templates -Wall
-Wextra -Wwrite-strings -Wcast-qual -Wabi=19 -fdiagnostics-show-location=once
-ffunction-sections -fdata-sections -frandom-seed=libstdc++.la -o
libstdc++.la -version-info 6:35:0 -Wl,--version-script=libstdc++-symbols.ver
-lm -rpath /usr/local/lib/../lib64 compatibility.lo
compatibility-debug_list.lo compatibility-debug_list-2.lo
compatibility-atomic-c++0x.lo compatibility-c++0x.lo compatibility-chrono.lo
compatibility-condvar.lo compatibility-thread-c++0x.lo
../libsupc++/libsupc++convenience.la ../src/c++98/libc++98convenience.la
../src/c++11/libc++11convenience.la ../src/c++17/libc++17convenience.la
../src/c++20/libc++20convenience.la
and contains no atomic,
find .. -name \*.la | xargs grep atomic
is empty.
Yet
libtool: link: /home/jakub/src/gcc/obj32/./gcc/xgcc -shared-libgcc
-B/home/jakub/src/gcc/obj32/./gcc -nostdinc++
-L/home/jakub/src/gcc/obj32/x86_64-pc-linux-gnu/libstdc++-v3/src
-L/home/jakub/src/gcc/obj32/x86_64-pc-linux-gnu/libstdc++-v3/src/.libs
-L/home/jakub/src/gcc/obj32/x86_64-pc-linux-gnu/libstdc++-v3/libsupc++/.libs
-B/usr/local/x86_64-pc-linux-gnu/bin/ -B/usr/local/x86_64-pc-linux-gnu/lib/
-isystem /usr/local/x86_64-pc-linux-gnu/include -isystem
/usr/local/x86_64-pc-linux-gnu/sys-include -fchecking=1 -fPIC -DPIC
-D_GLIBCXX_SHARED -shared -nostdlib /lib/../lib64/crti.o
/home/jakub/src/gcc/obj32/./gcc/crtbeginS.o .libs/compatibility.o
.libs/compatibility-debug_list.o .libs/compatibility-debug_list-2.o
.libs/compatibility-atomic-c++0x.o .libs/compatibility-c++0x.o
.libs/compatibility-chrono.o .libs/compatibility-condvar.o
.libs/compatibility-thread-c++0x.o -Wl,--whole-archive
../libsupc++/.libs/libsupc++convenience.a
../src/c++98/.libs/libc++98convenience.a
../src/c++11/.libs/libc++11convenience.a
../src/c++17/.libs/libc++17convenience.a
../src/c++20/.libs/libc++20convenience.a -Wl,--no-whole-archive
-L/home/jakub/src/gcc/obj32/x86_64-pc-linux-gnu/libstdc++-v3/libsupc++/.libs
-L/home/jakub/src/gcc/obj32/x86_64-pc-linux-gnu/libstdc++-v3/src
-L/home/jakub/src/gcc/obj32/x86_64-pc-linux-gnu/libstdc++-v3/src/.libs -lm
-L/home/jakub/src/gcc/obj32/./gcc -L/lib/../lib64 -L/usr/lib/../lib64 -L/lib
-L/usr/lib -latomic -lc -lgcc_s /home/jakub/src/gcc/obj32/./gcc/crtendS.o
/lib/../lib64/crtn.o -Wl,-O1 -Wl,-z -Wl,relro -Wl,--gc-sections
-Wl,--version-script=libstdc++-symbols.ver -Wl,-soname -Wl,libstdc++.so.6 -o
.libs/libstdc++.so.6.0.35
So is it libtool which just ignores --push-state/--as-needed/--pop-state and
just adds the library because why not?