aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Majnemer <david.majnemer@gmail.com>2016-03-15 06:41:02 +0000
committerDavid Majnemer <david.majnemer@gmail.com>2016-03-15 06:41:02 +0000
commit22a19a9aceeaa5fa0560d58f701b01e7b753a1b0 (patch)
treeec55581359193de20f3f8d5355d8bece6fa067e0
parent0c2adbc7a081dc554283836f82b6850f19499ed5 (diff)
downloadllvm-22a19a9aceeaa5fa0560d58f701b01e7b753a1b0.zip
llvm-22a19a9aceeaa5fa0560d58f701b01e7b753a1b0.tar.gz
llvm-22a19a9aceeaa5fa0560d58f701b01e7b753a1b0.tar.bz2
[COFF] Use the correct size of the TLS directory
The TLS directory has a different layout depending on the bitness of the machine the image will run on. LLD would always use the 64-bit TLS directory for the data directory entry instead of an appropriately sized TLS directory. llvm-svn: 263539
-rw-r--r--lld/COFF/Writer.cpp4
-rw-r--r--lld/test/COFF/tls32.test2
2 files changed, 4 insertions, 2 deletions
diff --git a/lld/COFF/Writer.cpp b/lld/COFF/Writer.cpp
index a3e5c20..5f5adaa 100644
--- a/lld/COFF/Writer.cpp
+++ b/lld/COFF/Writer.cpp
@@ -596,7 +596,9 @@ template <typename PEHeaderTy> void Writer::writeHeader() {
if (Symbol *Sym = Symtab->findUnderscore("_tls_used")) {
if (Defined *B = dyn_cast<Defined>(Sym->Body)) {
Dir[TLS_TABLE].RelativeVirtualAddress = B->getRVA();
- Dir[TLS_TABLE].Size = 40;
+ Dir[TLS_TABLE].Size = Config->is64()
+ ? sizeof(object::coff_tls_directory64)
+ : sizeof(object::coff_tls_directory32);
}
}
if (Symbol *Sym = Symtab->findUnderscore("_load_config_used")) {
diff --git a/lld/test/COFF/tls32.test b/lld/test/COFF/tls32.test
index 4fe020e..a16af05 100644
--- a/lld/test/COFF/tls32.test
+++ b/lld/test/COFF/tls32.test
@@ -3,7 +3,7 @@
# RUN: llvm-readobj -file-headers %t.exe | FileCheck %s
# CHECK: TLSTableRVA: 0x1000
-# CHECK: TLSTableSize: 0x28
+# CHECK: TLSTableSize: 0x18
---
header: