From 348731aeed4b5974f4ba6f6eebd0d3a19d5632d2 Mon Sep 17 00:00:00 2001 From: Fangrui Song Date: Sat, 18 May 2019 00:43:10 +0000 Subject: [PATCH] [ELF] Fix TP offset of TLS Variant I after D62059 As Ryan Prichard pointed out, after D62059, the TP offset is incorrect. Add x86-64-tls-le-align.s to check this. Better formulae for both variants should take p_vaddr%p_align into account (offset%p_align = p_vaddr%p_align is a basic ELF requirement), but I can't find a way to test the behavior. llvm-svn: 361084 --- lld/ELF/InputSection.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lld/ELF/InputSection.cpp b/lld/ELF/InputSection.cpp index 1bf67e2a3380a..72a2c298d5e5c 100644 --- a/lld/ELF/InputSection.cpp +++ b/lld/ELF/InputSection.cpp @@ -598,7 +598,7 @@ static int64_t getTlsTpOffset() { case EM_386: case EM_X86_64: // Variant 2. The TLS segment is located just before the thread pointer. - return -Out::TlsPhdr->p_memsz; + return -alignTo(Out::TlsPhdr->p_memsz, Out::TlsPhdr->p_align); case EM_PPC64: // The thread pointer points to a fixed offset from the start of the // executable's TLS segment. An offset of 0x7000 allows a signed 16-bit