diff options
| author | Fangrui Song <maskray@google.com> | 2020-01-23 11:52:03 -0800 |
|---|---|---|
| committer | Hans Wennborg <hans@chromium.org> | 2020-01-23 23:06:55 +0100 |
| commit | 26fd69afd9f3c6bb48b8a4e60578ea8ae919593f (patch) | |
| tree | 8c0b4aadfe7fea125f2adb3bf9a596c4d51234fe /lld/test | |
| parent | ed63454d984f2262ce332b9b15d49917be3eac98 (diff) | |
| download | bcm5719-llvm-26fd69afd9f3c6bb48b8a4e60578ea8ae919593f.tar.gz bcm5719-llvm-26fd69afd9f3c6bb48b8a4e60578ea8ae919593f.zip | |
[ELF] --no-dynamic-linker: don't emit undefined weak symbols to .dynsym
I felt really sad to push this commit for my selfish purpose to make
glibc -static-pie build with lld. Some code constructs in glibc require
R_X86_64_GOTPCREL/R_X86_64_REX_GOTPCRELX referencing undefined weak to
be resolved to a GOT entry not relocated by R_X86_64_GLOB_DAT (GNU ld
behavior), e.g.
csu/libc-start.c
if (__pthread_initialize_minimal != NULL)
__pthread_initialize_minimal ();
elf/dl-object.c
void
_dl_add_to_namespace_list (struct link_map *new, Lmid_t nsid)
{
/* We modify the list of loaded objects. */
__rtld_lock_lock_recursive (GL(dl_load_write_lock));
Emitting a GLOB_DAT will make the address equal &__ehdr_start (true
value) and cause elf/ldconfig to segfault. glibc really should move away
from weak references, which do not have defined semantics.
Temporarily special case --no-dynamic-linker.
(cherry picked from commit 0fbf28f7aae0ceb70071cac56de345e3ff04439c)
Diffstat (limited to 'lld/test')
| -rw-r--r-- | lld/test/ELF/weak-undef-no-dynamic-linker.s | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/lld/test/ELF/weak-undef-no-dynamic-linker.s b/lld/test/ELF/weak-undef-no-dynamic-linker.s new file mode 100644 index 00000000000..fa6936e1ef3 --- /dev/null +++ b/lld/test/ELF/weak-undef-no-dynamic-linker.s @@ -0,0 +1,15 @@ +# REQUIRES: x86 +# RUN: llvm-mc -filetype=obj -triple=x86_64 %s -o %t.o +# RUN: ld.lld -pie %t.o -o %t +# RUN: llvm-readobj --dyn-syms %t | FileCheck %s +# RUN: ld.lld -pie --no-dynamic-linker %t.o -o %t +# RUN: llvm-readobj --dyn-syms %t | FileCheck --check-prefix=NO %s + +## With --no-dynamic-linker, don't emit undefined weak symbols to .dynsym . +## This will suppress a relocation. +# CHECK: Name: foo +# NO-NOT: Name: foo + +.weak foo +cmpq $0, foo@GOTPCREL(%rip) +callq foo |

