diff options
-rw-r--r-- | lld/ELF/Symbols.cpp | 2 | ||||
-rw-r--r-- | lld/test/ELF/tls-relocatable.s | 21 |
2 files changed, 22 insertions, 1 deletions
diff --git a/lld/ELF/Symbols.cpp b/lld/ELF/Symbols.cpp index 83efc8d5350..94a362282c6 100644 --- a/lld/ELF/Symbols.cpp +++ b/lld/ELF/Symbols.cpp @@ -59,7 +59,7 @@ static typename ELFT::uint getSymVA(const SymbolBody &Body, Addend = 0; } uintX_t VA = (SC->OutSec ? SC->OutSec->getVA() : 0) + SC->getOffset(Offset); - if (D.isTls()) + if (D.isTls() && !Config->Relocatable) return VA - Out<ELFT>::TlsPhdr->p_vaddr; return VA; } diff --git a/lld/test/ELF/tls-relocatable.s b/lld/test/ELF/tls-relocatable.s new file mode 100644 index 00000000000..2743861c1de --- /dev/null +++ b/lld/test/ELF/tls-relocatable.s @@ -0,0 +1,21 @@ +// REQUIRES: x86 +// RUN: llvm-mc -filetype=obj -triple=i686-pc-linux %s -o %t.o +// RUN: ld.lld %t.o -r -o %tr.o +// RUN: ld.lld %tr.o -shared -o %t1 +// RUN: llvm-readobj -t %t1 | FileCheck %s + +// CHECK: Symbol { +// CHECK: Name: tls0 +// CHECK-NEXT: Value: 0x0 +// CHECK-NEXT: Size: 0 +// CHECK-NEXT: Binding: Global +// CHECK-NEXT: Type: TLS +// CHECK-NEXT: Other: 0 +// CHECK-NEXT: Section: .tdata +// CHECK-NEXT: } + +.type tls0,@object +.section .tdata,"awT",@progbits +.globl tls0 +tls0: + .long 0 |