[lld] r361088 - [ELF][X86] Fix R_RELAX_TLS_GD_TO_LE_NEG and R_NEG_TLS after D62059

Fangrui Song via llvm-commits llvm-commits at lists.llvm.org
Fri May 17 18:58:41 PDT 2019


Author: maskray
Date: Fri May 17 18:58:40 2019
New Revision: 361088

URL: http://llvm.org/viewvc/llvm-project?rev=361088&view=rev
Log:
[ELF][X86] Fix R_RELAX_TLS_GD_TO_LE_NEG and R_NEG_TLS after D62059

After D62059, we don't align p_memsz of PT_TLS to p_align. The
getRelocTargetVA formula should align it instead.

It becomes clear that R_NEG_TLS and R_TLS are opposite from each other.

In i386-tls-le-align.s, I put ret after call ___tls_get_addr at plt as
otherwise ld.bfd would reject the relaxation:
TLS transition from R_386_TLS_GD to R_386_TLS_LE_32 against `a' at 0x3 in section `.text' failed

Modified:
    lld/trunk/ELF/InputSection.cpp
    lld/trunk/test/ELF/i386-tls-le-align.s

Modified: lld/trunk/ELF/InputSection.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/InputSection.cpp?rev=361088&r1=361087&r2=361088&view=diff
==============================================================================
--- lld/trunk/ELF/InputSection.cpp (original)
+++ lld/trunk/ELF/InputSection.cpp Fri May 17 18:58:40 2019
@@ -752,7 +752,7 @@ static uint64_t getRelocTargetVA(const I
     return Sym.getVA(A) + getTlsTpOffset();
   case R_RELAX_TLS_GD_TO_LE_NEG:
   case R_NEG_TLS:
-    return Out::TlsPhdr->p_memsz - Sym.getVA(A);
+    return -(Sym.getVA(A) + getTlsTpOffset());
   case R_SIZE:
     return Sym.getSize() + A;
   case R_TLSDESC:

Modified: lld/trunk/test/ELF/i386-tls-le-align.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/i386-tls-le-align.s?rev=361088&r1=361087&r2=361088&view=diff
==============================================================================
--- lld/trunk/test/ELF/i386-tls-le-align.s (original)
+++ lld/trunk/test/ELF/i386-tls-le-align.s Fri May 17 18:58:40 2019
@@ -5,10 +5,23 @@
 
 # -alignTo(p_memsz, p_align) = -alignTo(4, 64) = -64
 
-# CHECK: movl %gs:0xffffffc0, %eax
-
+# CHECK:      movl %gs:0xffffffc0, %eax
   movl %gs:a at NTPOFF, %eax
 
+# CHECK-NEXT: subl $0x40, %edx
+  subl $a at tpoff, %edx
+
+# GD to LE relaxation.
+# CHECK-NEXT: movl %gs:0x0, %eax
+# CHECK-NEXT: subl $0x40, %eax
+  leal a at tlsgd(,%ebx,1), %eax
+  call ___tls_get_addr at plt
+  ret
+
+.globl ___tls_get_addr
+.type ___tls_get_addr, at function
+___tls_get_addr:
+
 .section .tbss,"awT"
 .align 64
 a:




More information about the llvm-commits mailing list