diff options
-rw-r--r-- | lld/ELF/LinkerScript.cpp | 9 | ||||
-rw-r--r-- | lld/test/ELF/linkerscript/multiple-tbss.s | 30 |
2 files changed, 35 insertions, 4 deletions
diff --git a/lld/ELF/LinkerScript.cpp b/lld/ELF/LinkerScript.cpp index 7edfacae97a..922c23e2862 100644 --- a/lld/ELF/LinkerScript.cpp +++ b/lld/ELF/LinkerScript.cpp @@ -357,11 +357,14 @@ static void assignSectionSymbol(SymbolAssignment *Cmd, Body->Value = Cmd->Expression(Sec->getVA() + Off); } +template <class ELFT> static bool isTbss(OutputSectionBase<ELFT> *Sec) { + return (Sec->getFlags() & SHF_TLS) && Sec->getType() == SHT_NOBITS; +} + template <class ELFT> void LinkerScript<ELFT>::output(InputSection<ELFT> *S) { if (!AlreadyOutputIS.insert(S).second) return; - bool IsTbss = - (CurOutSec->getFlags() & SHF_TLS) && CurOutSec->getType() == SHT_NOBITS; + bool IsTbss = isTbss(CurOutSec); uintX_t Pos = IsTbss ? Dot + ThreadBssOffset : Dot; Pos = alignTo(Pos, S->Alignment); @@ -398,7 +401,7 @@ void LinkerScript<ELFT>::switchTo(OutputSectionBase<ELFT> *Sec) { CurOutSec = Sec; Dot = alignTo(Dot, CurOutSec->getAlignment()); - CurOutSec->setVA(Dot); + CurOutSec->setVA(isTbss(CurOutSec) ? Dot + ThreadBssOffset : Dot); } template <class ELFT> void LinkerScript<ELFT>::process(BaseCommand &Base) { diff --git a/lld/test/ELF/linkerscript/multiple-tbss.s b/lld/test/ELF/linkerscript/multiple-tbss.s index d30ac057282..6bbbca92c23 100644 --- a/lld/test/ELF/linkerscript/multiple-tbss.s +++ b/lld/test/ELF/linkerscript/multiple-tbss.s @@ -2,7 +2,35 @@ # RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o # RUN: echo "SECTIONS { }" > %t.script # RUN: ld.lld -T %t.script %t.o -o %t -# RUN: llvm-readobj -l %t | FileCheck %s +# RUN: llvm-readobj -l -s %t | FileCheck %s + +# CHECK: Name: .tbss +# CHECK-NEXT: Type: SHT_NOBITS +# CHECK-NEXT: Flags [ +# CHECK-NEXT: SHF_ALLOC +# CHECK-NEXT: SHF_TLS +# CHECK-NEXT: SHF_WRITE +# CHECK-NEXT: ] +# CHECK-NEXT: Address: +# CHECK-NEXT: Offset: +# CHECK-NEXT: Size: 8 +# CHECK-NEXT: Link: +# CHECK-NEXT: Info: +# CHECK-NEXT: AddressAlignment: +# CHECK-NEXT: EntrySize: +# CHECK-NEXT: } +# CHECK-NEXT: Section { +# CHECK-NEXT: Index: +# CHECK-NEXT: Name: foo +# CHECK-NEXT: Type: SHT_NOBITS +# CHECK-NEXT: Flags [ +# CHECK-NEXT: SHF_ALLOC +# CHECK-NEXT: SHF_TLS +# CHECK-NEXT: SHF_WRITE +# CHECK-NEXT: ] +# CHECK-NEXT: Address: +# CHECK-NEXT: Offset: +# CHECK-NEXT: Size: 1 # CHECK: Type: PT_TLS # CHECK-NEXT: Offset: |