> -----Original Message-----
> From: Joseph Myers <[email protected]>
> Sent: 11 October 2025 01:41
> To: Matthew Malcomson <[email protected]>
> Cc: Prathamesh Kulkarni <[email protected]>; Jonathan Wakely
> <[email protected]>; [email protected]; Thomas Schwinge
> <[email protected]>; Sam James <[email protected]>
> Subject: Re: libstdc++ DT_NEEDED on libatomic after PR81358
> 
> External email: Use caution opening links or attachments
> 
> 
> On Fri, 10 Oct 2025, Matthew Malcomson wrote:
> 
> > Questions for others:
> > 1) We'd like to double-check that this sounds like a problem before
> > trying to change it.
> > 2) Does this trigger thoughts of anything else to look out for?
> > 3) Would the best solution be to add some `--as-needed` push/pop
> state
> > arguments into the link line?
> 
> Yes, I'd expect libstdc++ to be linked (DT_NEEDED) with libatomic only
> if it actually has undefined references that libatomic resolves.
Hi Joseph,
Apologies for getting back late on this.

>From what I see, the issue with pseudo dependency on libatomic.so (DT_NEEDED) 
>probably comes from libatomic.so
being placed in gcc subdir, which is where toplevel libtool.m4 seems to pick it 
up from:

  for p in `eval "$output_verbose_link_cmd"`; do
    case $p in

    -L* | -R* | -l*)
       # Some compilers place space between "-{L,R}" and the path.
       # Remove the space.
       if test $p = "-L" ||
          test $p = "-R"; then
         prev=$p
         continue
       else
         prev=
       fi

       if test "$pre_test_object_deps_done" = no; then
         case $p in
         -L* | -R*)
           # Internal compiler library paths should come after those
           # provided the user.  The postdeps already come after the
           # user supplied libs so there is no need to process them.
           if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then
             _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}"
           else
             _LT_TAGVAR(compiler_lib_search_path, 
$1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}"
           fi
           ;;
         # The "-l" case would never come before the object being
         # linked, so don't bother handling this case.
         esac
       else
         if test -z "$_LT_TAGVAR(postdeps, $1)"; then
           _LT_TAGVAR(postdeps, $1)="${prev}${p}"
         else
           _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}"
         fi
       fi
       ;;


For eg, the generated libtool for libstdc++v3 shows:

# The directories searched by this compiler when creating a shared library.
compiler_lib_search_dirs="/home/prathameshk/gcc/stage1-build/aarch64-linux-gnu/libstdc++-v3/src
 /home/prathameshk/gcc/stage1-build/aarch64-linux-gnu/libstdc++-v3/src/.libs 
/home/prathameshk/gcc/stage1-build/aarch64-linux-gnu/libstdc++-v3/libsupc++/.libs
 /home/prathameshk/gcc/stage1-build/./gcc /lib/aarch64-linux-gnu 
/usr/lib/aarch64-linux-gnu /lib /usr/lib"

# Dependencies to place before and after the objects being linked to
# create a shared library.
predep_objects="/lib/aarch64-linux-gnu/crti.o 
/home/prathameshk/gcc/stage1-build/./gcc/crtbeginS.o"
postdep_objects="/home/prathameshk/gcc/stage1-build/./gcc/crtendS.o 
/lib/aarch64-linux-gnu/crtn.o"
predeps=""
postdeps=" -lgcc_s -latomic -lc -lgcc_s "

I was wondering if we could modify libtool.m4 to wrap the options around 
--as-needed/--no-as-needed
but I assume that'd only work for GNU ld (or a linker that supports these 
options), so it may perhaps not
be the the right approach ?

The following workaround seems to work to remove dependency of libatomic.so on 
libstdc++.so:

diff --git a/libstdc++-v3/configure.ac b/libstdc++-v3/configure.ac
index 339e7bb17a4..d5a5ef53e69 100644
--- a/libstdc++-v3/configure.ac
+++ b/libstdc++-v3/configure.ac
@@ -157,6 +157,9 @@ pic_mode='default'
 # Eliminate -lstdc++ addition to postdeps for cross compiles.
 postdeps_CXX=`echo " $postdeps_CXX " | sed 's, -lstdc++ ,,g'`

+# Eliminate -latomic addition to postdeps since the library doesn't depend on 
libatomic
+postdeps_CXX=`echo " $postdeps_CXX " | sed 's, -latomic , ,g'`
+
 # Possibly disable most of the library.
 ## TODO: Consider skipping unncessary tests altogether in this case, rather
 ## than just ignoring the results.  Faster /and/ more correct, win win.

With the patch, readelf --dynamic libstdc++.so no longer shows libatomic.so as 
dependency:
 0x0000000000000001 (NEEDED)             Shared library: [libm.so.6]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
 0x0000000000000001 (NEEDED)             Shared library: [libgcc_s.so.1]
 0x000000000000000e (SONAME)             Library soname: [libstdc++.so.6]

But I am not sure if this approach is entirely correct ?
If we choose to proceed with it, I will post a patch to similarly filter out 
-latomic for other target libraries that don't depend on libatomic.so but have 
the dependency introduced.

If this doesn't look correct, could you please suggest how to proceed ?

Signed-off-by: Prathamesh Kulkarni <[email protected]>

Thanks,
Prathamesh
> 
> --
> Joseph S. Myers
> [email protected]

Reply via email to