[llvm-dev] Demotion of shared symbols resolved from the dynamic linker.

Sean Fertile via llvm-dev llvm-dev at lists.llvm.org
Fri Feb 28 07:29:02 PST 2020


On PowerPC we have a failing address sanitizer test when linking with LLD.
The issue is that the symbol '__libc_stack_end' is resolved to an undefined
weak symbol when linking with LLD but not when linking (with the exact same
command/input) with other linkers. Tracing the symbol I see it is resolved
to a definition in the dynamic linker as expected:

/home/sfertile/LLVM_MonoRepo/build/lib/clang/11.0.0/lib/linux/libclang_rt.asan-powerpc64le.a(sanitizer_linux.cpp.o):
reference to __libc_stack_end
/lib/powerpc64le-linux-gnu/libpthread.so.0: reference to __libc_stack_end
/lib/powerpc64le-linux-gnu/ld64.so.2: shared definition of __libc_stack_end
<internal>: reference to __libc_stack_end

The last line in the trace output shows where we demote the shared
definition to an undefined symbol here:
https://github.com/llvm/llvm-project/blob/c8bfed05e21f945b5ac71cd01d62e2854a8ddcf9/lld/ELF/Driver.cpp#L1505

I'm guessing the fix is that if `needsInterpSection()` is true then the
dynamic linker should be marked as needed. Its going to end up in the
DT_NEEDED anyway so the symbols can't become dangling references. In my
case then, the demotion won't happen and everything works as expected. Is
this the right direction?
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20200228/e8612768/attachment.html>


More information about the llvm-dev mailing list