[llvm-dev] [EXTERNAL] Re: Linking issue with clang/libc++

Oleg Smolsky via llvm-dev llvm-dev at lists.llvm.org
Fri Sep 3 15:22:58 PDT 2021


On Fri, Sep 3, 2021 at 2:20 PM Fangrui Song <maskray at google.com> wrote:

> On 2021-09-03, Oleg Smolsky via llvm-dev wrote:
> >Wow, that's interesting! Thank you for hint, Anton!
> >
> >How did this dependency come into the build? I don't see any direct
> >references to the symbol... so, is it something acquired transitively?...
> I
> >am surprised that some (supposedly portable) code contains a buried libgcc
> >dependency... I'm not linking binary artifacts here...
>
> __divmodti4 is a library function for "Divides 128-bit signed integers w/
> remainder".
> Presumably libc++ has some int128 division which generates the reference.
> libc++ has int128 usage in chrono/filesystem/etc.  I suspect chrono may
> have int128 division, though I don't find the symbol in my build.
>

Oh, right! Thank you very much, Fangrui!

The issue comes down to the discrepancy between libgcc_s versions. I have
an alternative compiler and that's how Clang was built. That alternative
compiler has the right support library:

$ nm /opt/gcc-11/lib64/libgcc_s.so.1 | grep __divmodti4
00000000000061d0 T __divmodti4

And Clang's `ld` invocation has this trailer:

..."-lgcc_s" "-lgcc" "-lc" "-lgcc_s" "-lgcc"
"/usr/lib/gcc/x86_64-linux-gnu/5.4.0/crtend.o"
"/usr/lib/gcc/x86_64-linux-gnu/5.4.0/../../../x86_64-linux-gnu/crtn.o"

Here is it trying and failing to find the symbol in the system's compiler's
libs.

So, naturally, I can fix this with custom flags as well as
`--gcc-toolchain=/opt/gcc-11` (I forgot about that completely).

Thanks again!

Hopefully this message will help posterity...

Oleg.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20210903/d8978e28/attachment.html>


More information about the llvm-dev mailing list