summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lld/ELF/OutputSections.h2
-rw-r--r--lld/ELF/Target.cpp2
-rw-r--r--lld/ELF/Writer.cpp5
-rw-r--r--lld/test/elf2/tls.s8
4 files changed, 11 insertions, 6 deletions
diff --git a/lld/ELF/OutputSections.h b/lld/ELF/OutputSections.h
index 51c0fb0a688..8468da5b69f 100644
--- a/lld/ELF/OutputSections.h
+++ b/lld/ELF/OutputSections.h
@@ -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<ELFT> *Out<ELFT>::StrTab;
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
diff --git a/lld/ELF/Target.cpp b/lld/ELF/Target.cpp
index 7adc5c6de43..137dae39b3e 100644
--- a/lld/ELF/Target.cpp
+++ b/lld/ELF/Target.cpp
@@ -340,7 +340,7 @@ void X86_64TargetInfo::relocateOne(uint8_t *Loc, uint8_t *BufEnd, uint32_t Type,
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));
diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp
index d923712e59e..00dc4733d66 100644
--- a/lld/ELF/Writer.cpp
+++ b/lld/ELF/Writer.cpp
@@ -740,8 +740,11 @@ template <class ELFT> void Writer<ELFT>::assignAddresses() {
}
}
- 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()) {
diff --git a/lld/test/elf2/tls.s b/lld/test/elf2/tls.s
index 6b3cad13885..f947839628c 100644
--- a/lld/test/elf2/tls.s
+++ b/lld/test/elf2/tls.s
@@ -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
OpenPOWER on IntegriCloud