[lld] r252131 - [elf2] Fix R_X86_64_TPOFF32 handling.

Michael J. Spencer via llvm-commits llvm-commits at lists.llvm.org
Wed Nov 4 18:00:36 PST 2015


Author: mspencer
Date: Wed Nov  4 20:00:35 2015
New Revision: 252131

URL: http://llvm.org/viewvc/llvm-project?rev=252131&view=rev
Log:
[elf2] Fix R_X86_64_TPOFF32 handling.

For x86-64 the initial executable TLS block is placed directly before the
thread specific data register so compilers can directly access it via
R_X86_64_TPOFF32. Generate the correct (negative) offset for this case.

Modified:
    lld/trunk/ELF/OutputSections.h
    lld/trunk/ELF/Target.cpp
    lld/trunk/ELF/Writer.cpp
    lld/trunk/test/elf2/tls.s

Modified: lld/trunk/ELF/OutputSections.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/OutputSections.h?rev=252131&r1=252130&r2=252131&view=diff
==============================================================================
--- lld/trunk/ELF/OutputSections.h (original)
+++ lld/trunk/ELF/OutputSections.h Wed Nov  4 20:00:35 2015
@@ -372,6 +372,7 @@ template <class ELFT> struct Out {
   static SymbolTableSection<ELFT> *DynSymTab;
   static SymbolTableSection<ELFT> *SymTab;
   static uintX_t TlsInitImageVA;
+  static size_t TlsInitImageAlignedSize;
 };
 
 template <class ELFT> DynamicSection<ELFT> *Out<ELFT>::Dynamic;
@@ -392,6 +393,7 @@ template <class ELFT> StringTableSection
 template <class ELFT> SymbolTableSection<ELFT> *Out<ELFT>::DynSymTab;
 template <class ELFT> SymbolTableSection<ELFT> *Out<ELFT>::SymTab;
 template <class ELFT> typename Out<ELFT>::uintX_t Out<ELFT>::TlsInitImageVA;
+template <class ELFT> size_t Out<ELFT>::TlsInitImageAlignedSize;
 
 } // namespace elf2
 } // namespace lld

Modified: lld/trunk/ELF/Target.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Target.cpp?rev=252131&r1=252130&r2=252131&view=diff
==============================================================================
--- lld/trunk/ELF/Target.cpp (original)
+++ lld/trunk/ELF/Target.cpp Wed Nov  4 20:00:35 2015
@@ -340,7 +340,7 @@ void X86_64TargetInfo::relocateOne(uint8
     write32le(Loc, SA);
     break;
   case R_X86_64_TPOFF32:
-    write32le(Loc, SA);
+    write32le(Loc, SA - Out<llvm::object::ELF64LE>::TlsInitImageAlignedSize);
     break;
   default:
     error("unrecognized reloc " + Twine(Type));

Modified: lld/trunk/ELF/Writer.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Writer.cpp?rev=252131&r1=252130&r2=252131&view=diff
==============================================================================
--- lld/trunk/ELF/Writer.cpp (original)
+++ lld/trunk/ELF/Writer.cpp Wed Nov  4 20:00:35 2015
@@ -740,8 +740,11 @@ template <class ELFT> void Writer<ELFT>:
     }
   }
 
-  if (TlsPhdr.p_vaddr)
+  if (TlsPhdr.p_vaddr) {
     Phdrs[++PhdrIdx] = TlsPhdr;
+    Out<ELFT>::TlsInitImageAlignedSize =
+        RoundUpToAlignment(TlsPhdr.p_memsz, TlsPhdr.p_align);
+  }
 
   // Add an entry for .dynamic.
   if (isOutputDynamic()) {

Modified: lld/trunk/test/elf2/tls.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf2/tls.s?rev=252131&r1=252130&r2=252131&view=diff
==============================================================================
--- lld/trunk/test/elf2/tls.s (original)
+++ lld/trunk/test/elf2/tls.s Wed Nov  4 20:00:35 2015
@@ -164,7 +164,7 @@ d:
 
 // DIS:      Disassembly of section .text:
 // DIS-NEXT: _start:
-// DIS-NEXT:    11000: {{.+}} movl    %fs:8, %eax
-// DIS-NEXT:    11008: {{.+}} movl    %fs:0, %eax
-// DIS-NEXT:    11010: {{.+}} movl    %fs:12, %eax
-// DIS-NEXT:    11018: {{.+}} movl    %fs:4, %eax
+// DIS-NEXT:    11000: {{.+}} movl    %fs:-8, %eax
+// DIS-NEXT:    11008: {{.+}} movl    %fs:-16, %eax
+// DIS-NEXT:    11010: {{.+}} movl    %fs:-4, %eax
+// DIS-NEXT:    11018: {{.+}} movl    %fs:-12, %eax




More information about the llvm-commits mailing list