[PATCH] Link static C++ tests against libatomic.a if needed

H.J. Lu hjl.tools@gmail.com
Tue May 5 14:08:36 GMT 2026


On Tue, May 5, 2026 at 8:36 PM Adhemerval Zanella Netto
<adhemerval.zanella@linaro.org> wrote:
>
>
>
> On 05/05/26 09:33, H.J. Lu wrote:
> > On Tue, May 5, 2026 at 8:27 PM Adhemerval Zanella Netto
> > <adhemerval.zanella@linaro.org> wrote:
> >>
> >>
> >>
> >> On 04/05/26 22:50, H.J. Lu wrote:
> >>> On Tue, May 5, 2026 at 9:42 AM Sam James <sam@gentoo.org> wrote:
> >>>>
> >>>> "H.J. Lu" <hjl.tools@gmail.com> writes:
> >>>>
> >>>>> On Mon, May 4, 2026 at 10:33 AM H.J. Lu <hjl.tools@gmail.com> wrote:
> >>>>>>
> >>>>>> Define cxx-static-link-libatomic to -latomic if DT_NEEDED entries in
> >>>>>> libstdc++.so include libatomic.so.  Update link-extra-libs-static to
> >>>>>> include $(cxx-static-link-libatomic) if -lstdc++ is used.
> >>>>>>
> >>>>>> Tested with sparcv8-linux-gnu-leon3 and sparcv9-linux-gnu using
> >>>>>> uild-many-glibcs.py.  This fixes BZ #34121.
> >>>>>>
> >>>>>
> >>>>> FWIW, sparc g++ does pass -latomic_asneeded to ld.  But glibc tests
> >>>>> are built with -nostdlib -nostartfiles using gcc, not g++.
> >>>>
> >>>> https://inbox.sourceware.org/gcc-patches/CACb0b4m+ex47Tpyp1qvW9+0p4onyEvsfXeXE_4zZrteMO5q5EQ@mail.gmail.com/
> >>>>
> >>>> I don't remember what happened with that, there were a few issues with
> >>>> the libatomic autolinking so I lost track.
> >>>
> >>> One way to fix the gcc is to create libstdc++.a as linker script, similar to
> >>>
> >>> [hjl@gnu-tgl-3 x86-glibc]$ cat /usr/lib64/libm.a
> >>> /* GNU ld script
> >>> */
> >>> OUTPUT_FORMAT(elf64-x86-64)
> >>> GROUP ( /usr/lib64/libm-2.43.a /usr/lib64/libmvec.a )
> >>> [hjl@gnu-tgl-3 x86-glibc]$
> >>>
> >>> to include libatomic.a in libstdc++.a if needed.  But I don't know if it works
> >>> everywhere.
> >>>
> >>
> >> It seems gcc-16 has another issue, it also fails on building glibc after a bootstrap
> >> with build-many-glibcs.py with:
> >>
> >> [..-m32 -mlong-double-128 -mcpu=v9 -o /home/azanella/Projects/glibc/build/sparcv9-linux-gnu-gcc16/support/links-dso-program -pie  -Wl,-O1 -nostdlib -nostartfiles [...]
> >> [...]/sparc64-linux-gnu/sparc64-glibc-linux-gnu/bin/ld: [...]/sparc64-linux-gnu/bin/../lib/gcc/sparc64-glibc-linux-gnu/16.1.1/../../../../sparc64-glibc-linux-gnu/lib/../lib/libstdc++.so: undefined reference to `__atomic_fetch_add_4@LIBATOMIC_1.0'
> >> [...]//sparc64-glibc-lisparc64-linux-gnunux-gnu/bin/ld: [...]/sparc64-linux-gnu/bin/../lib/gcc/sparc64-glibc-linux-gnu/16.1.1/../../../../sparc64-glibc-linux-gnu/lib/../lib/libstdc++.so: undefined reference to `__atomic_fetch_sub_4@LIBATOMIC_1.0'
> >>
> >> And dumping the linker invocation, it shows another issue:
> >>
> >> ld: warning: libatomic.so.1, needed by [...]/sparc64-linux-gnu/bin/../lib/gcc/sparc64-glibc-linux-gnu/16.1.1/../../../../sparc64-glibc-linux-gnu/lib/../lib/libstdc++.so, not found (try using -rpath or -rpath-link)
> >
> > Which version of binutils are you using?  Binutils master branch works
> > for me for sparc64-glibc-linux-gnu.
>
> It is a pretty recent one:
>
> $ ./bin/sparc64-glibc-linux-gnu-ld -v
> GNU ld (GNU Binutils) 2.46.0.20260504

For some reason, my ld works:

$ ./install/compilers/sparc64-linux-gnu/bin/sparc64-glibc-linux-gnu-ld -V
GNU ld (GNU Binutils) 2.46.50.20260503
  Supported emulations:
   elf64_sparc
   elf32_sparc

Please try the enclosed patch.  If it works for you, I will change it
for both dynamic and static C++ executables.

-- 
H.J.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: libatomic.patch
Type: text/x-patch
Size: 2810 bytes
Desc: not available
URL: <https://sourceware.org/pipermail/libc-alpha/attachments/20260505/a30c544f/attachment.bin>


More information about the Libc-alpha mailing list