[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