summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2016-04-01 12:54:27 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2016-04-01 12:54:27 +0000
commitb97f4beec44e0658c4d844ae7ac05a79561ec144 (patch)
tree0be7d1da6d050901f42c8ac96620edba640a8dfd
parent8c488419070de9d3347b87eec666fce3ce36c258 (diff)
downloadbcm5719-llvm-b97f4beec44e0658c4d844ae7ac05a79561ec144.tar.gz
bcm5719-llvm-b97f4beec44e0658c4d844ae7ac05a79561ec144.zip
Avoid creating duplicated relocations.
llvm-svn: 265139
-rw-r--r--lld/ELF/Writer.cpp8
-rw-r--r--lld/test/ELF/Inputs/tls-got-entry.s13
-rw-r--r--lld/test/ELF/tls-got-entry.s25
3 files changed, 43 insertions, 3 deletions
diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp
index 5f474999013..d2b6335fe61 100644
--- a/lld/ELF/Writer.cpp
+++ b/lld/ELF/Writer.cpp
@@ -295,9 +295,11 @@ static unsigned handleTlsRelocation(uint32_t Type, SymbolBody &Body,
}
if (!Body.isPreemptible())
return 1;
- Out<ELFT>::Got->addEntry(Body);
- Out<ELFT>::RelaDyn->addReloc(
- {Target->TlsGotRel, DynamicReloc<ELFT>::Off_Got, false, &Body});
+ if (!Body.isInGot()) {
+ Out<ELFT>::Got->addEntry(Body);
+ Out<ELFT>::RelaDyn->addReloc(
+ {Target->TlsGotRel, DynamicReloc<ELFT>::Off_Got, false, &Body});
+ }
return 2;
}
return 0;
diff --git a/lld/test/ELF/Inputs/tls-got-entry.s b/lld/test/ELF/Inputs/tls-got-entry.s
new file mode 100644
index 00000000000..e1e09a3306a
--- /dev/null
+++ b/lld/test/ELF/Inputs/tls-got-entry.s
@@ -0,0 +1,13 @@
+.globl __tls_get_addr
+.align 16, 0x90
+.type __tls_get_addr,@function
+__tls_get_addr:
+
+.type tlsshared0,@object
+.section .tbss,"awT",@nobits
+.globl tlsshared0
+.align 4
+tlsshared0:
+ .long 0
+ .size tlsshared0, 4
+
diff --git a/lld/test/ELF/tls-got-entry.s b/lld/test/ELF/tls-got-entry.s
new file mode 100644
index 00000000000..c7b96697ab3
--- /dev/null
+++ b/lld/test/ELF/tls-got-entry.s
@@ -0,0 +1,25 @@
+// REQUIRES: x86
+// RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t.o
+// RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %p/Inputs/tls-got-entry.s -o %tso.o
+// RUN: ld.lld -shared %tso.o -o %t.so
+// RUN: ld.lld %t.o %t.so -o %t1
+// RUN: llvm-readobj -r %t1 | FileCheck %s
+
+// CHECK: Relocations [
+// CHECK-NEXT: Section ({{.*}}) .rela.dyn {
+// CHECK-NEXT: R_X86_64_TPOFF64 tlsshared0 0x0
+// CHECK-NEXT: }
+// CHECK-NEXT: ]
+
+.globl _start
+_start:
+ .byte 0x66
+ leaq tlsshared0@tlsgd(%rip),%rdi
+ .word 0x6666
+ rex64
+ call __tls_get_addr@plt
+ .byte 0x66
+ leaq tlsshared0@tlsgd(%rip),%rdi
+ .word 0x6666
+ rex64
+ call __tls_get_addr@plt
OpenPOWER on IntegriCloud