<p dir="ltr">Heh, thanks - I remember hitting the fact that binutils LD didn't implement this reloc either (GCC would produce 32 bits of zeros, then the 32 bit reloc - I implementdd it in Clang to juse use the 64 bit reloc instead) had a bug or something for about a decade about it. That's how I found out I wasn't using gold... (Gold doesn't have this bug) :)</p>
<div class="gmail_quote">On Mar 10, 2016 11:02 AM, "George Rimar via llvm-commits" <<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a>> wrote:<br type="attribution"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: grimar<br>
Date: Thu Mar 10 12:57:17 2016<br>
New Revision: 263150<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=263150&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=263150&view=rev</a><br>
Log:<br>
[ELF] - Fixed handling R_X86_64_DTPOFF64 relocation relaxation<br>
<br>
R_X86_64_DTPOFF64 was not handled properly.<br>
Next sample app was impossible to link before this patch:<br>
<br>
~/pg/release/bin/clang -target x86_64-pc-linux testthread.cpp -c -g<br>
~/pg/d+a/bin/ld.lld testthread.o<br>
"Unknown TLS optimization" (value was 17)<br>
<br>
__thread int x = 0;<br>
void _start() {<br>
}<br>
<br>
It works fine now.<br>
<br>
Differential revision: <a href="http://reviews.llvm.org/D18039" rel="noreferrer" target="_blank">http://reviews.llvm.org/D18039</a><br>
<br>
Modified:<br>
    lld/trunk/ELF/Target.cpp<br>
    lld/trunk/test/ELF/tls-opt.s<br>
<br>
Modified: lld/trunk/ELF/Target.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Target.cpp?rev=263150&r1=263149&r2=263150&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Target.cpp?rev=263150&r1=263149&r2=263150&view=diff</a><br>
==============================================================================<br>
--- lld/trunk/ELF/Target.cpp (original)<br>
+++ lld/trunk/ELF/Target.cpp Thu Mar 10 12:57:17 2016<br>
@@ -895,6 +895,9 @@ size_t X86_64TargetInfo::relaxTls(uint8_<br>
   case R_X86_64_DTPOFF32:<br>
     relocateOne(Loc, BufEnd, R_X86_64_TPOFF32, P, SA);<br>
     return 0;<br>
+  case R_X86_64_DTPOFF64:<br>
+    write64le(Loc, SA - Out<ELF64LE>::TlsPhdr->p_memsz);<br>
+    return 0;<br>
   case R_X86_64_GOTTPOFF:<br>
     relocateTlsIeToLe(Loc, BufEnd, P, SA);<br>
     return 0;<br>
<br>
Modified: lld/trunk/test/ELF/tls-opt.s<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/tls-opt.s?rev=263150&r1=263149&r2=263150&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/tls-opt.s?rev=263150&r1=263149&r2=263150&view=diff</a><br>
==============================================================================<br>
--- lld/trunk/test/ELF/tls-opt.s (original)<br>
+++ lld/trunk/test/ELF/tls-opt.s Thu Mar 10 12:57:17 2016<br>
@@ -35,6 +35,11 @@<br>
 // DISASM-NEXT: 1109a: 48 8d 80 f8 ff ff ff                leaq -8(%rax), %rax<br>
 // DISASM-NEXT: 110a1: 64 48 8b 04 25 00 00 00 00          movq %fs:0, %rax<br>
 // DISASM-NEXT: 110aa: 48 8d 80 fc ff ff ff                leaq -4(%rax), %rax<br>
+// LD to LE (2):<br>
+// DISASM:      _DTPOFF64_1:<br>
+// DISASM-NEXT: 110b1: f8<br>
+// DISASM:      _DTPOFF64_2:<br>
+// DISASM-NEXT: 110ba: fc<br>
<br>
 .type tls0,@object<br>
 .section .tbss,"awT",@nobits<br>
@@ -91,3 +96,12 @@ _start:<br>
  .word 0x6666<br>
  rex64<br>
  call __tls_get_addr@plt<br>
+<br>
+ //LD to LE (2):<br>
+_DTPOFF64_1:<br>
+ .quad tls0@DTPOFF<br>
+ nop<br>
+<br>
+_DTPOFF64_2:<br>
+ .quad tls1@DTPOFF<br>
+ nop<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div>