summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lld/ELF/Symbols.cpp2
-rw-r--r--lld/test/ELF/tls-relocatable.s21
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
OpenPOWER on IntegriCloud