From 52bf0ebfdf48fa7e07257336e53a586088ee4df1 Mon Sep 17 00:00:00 2001 From: "Michael J. Spencer" Date: Thu, 1 Oct 2015 21:15:02 +0000 Subject: [PATCH] [lld][elf2] Sort output sections. Sort by: ALLOC ALLOC && NOBITS ALLOC & EXEC ALLOC & EXEC && NOBITS ALLOC & WRITE ALLOC & WRITE && NOBITS (ignoring NOBITS) The dynamic section is finalized early because it adds strings to the dynamic string table, which comes before the dynamic table. llvm-svn: 249071 --- lld/ELF/OutputSections.cpp | 3 + lld/ELF/Writer.cpp | 46 ++++++++- lld/test/elf2/basic-aarch64.s | 36 +++---- lld/test/elf2/basic-mips.s | 144 +++++++++++++--------------- lld/test/elf2/basic.s | 34 +++---- lld/test/elf2/basic32.s | 34 +++---- lld/test/elf2/basic32be.s | 34 +++---- lld/test/elf2/basic64be.s | 36 +++---- lld/test/elf2/bss.s | 11 --- lld/test/elf2/discard-none.s | 4 +- lld/test/elf2/dynamic-reloc-index.s | 2 +- lld/test/elf2/dynamic-reloc.s | 20 ++-- lld/test/elf2/got.s | 18 ++-- lld/test/elf2/local-dynamic.s | 10 +- lld/test/elf2/plt-i686.s | 34 +++---- lld/test/elf2/plt.s | 36 +++---- lld/test/elf2/relocation-common.s | 4 +- lld/test/elf2/relocation-i686.s | 16 ++-- lld/test/elf2/relocation-local.s | 6 +- lld/test/elf2/relocation.s | 44 ++++----- lld/test/elf2/section-layout.s | 28 ++++++ lld/test/elf2/shared.s | 49 +++++----- lld/test/elf2/symbols.s | 20 ++-- 23 files changed, 358 insertions(+), 311 deletions(-) create mode 100644 lld/test/elf2/section-layout.s diff --git a/lld/ELF/OutputSections.cpp b/lld/ELF/OutputSections.cpp index ad58e75c11f2..9c89de3148e2 100644 --- a/lld/ELF/OutputSections.cpp +++ b/lld/ELF/OutputSections.cpp @@ -183,6 +183,9 @@ DynamicSection::DynamicSection(SymbolTable &SymTab, } template void DynamicSection::finalize() { + if (this->Header.sh_size) + return; // Already finalized. + typename Base::HeaderT &Header = this->Header; Header.sh_link = DynStrSec.getSectionIndex(); diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp index 72abb200e9ad..f937d1c411d6 100644 --- a/lld/ELF/Writer.cpp +++ b/lld/ELF/Writer.cpp @@ -371,7 +371,6 @@ template void Writer::createSections() { BssSec.setSize(Off); OutputSections.push_back(&SymTabSec); - OutputSections.push_back(&StrTabSec); if (needsDynamicSections()) { if (needsInterpSection()) @@ -392,12 +391,53 @@ template void Writer::createSections() { OutputSections.begin(), OutputSections.end(), [](OutputSectionBase *A, OutputSectionBase *B) { - // Place SHF_ALLOC sections first. - return (A->getFlags() & SHF_ALLOC) && !(B->getFlags() & SHF_ALLOC); + uintX_t AFlags = A->getFlags(); + uintX_t BFlags = B->getFlags(); + + // Allocatable sections go first to reduce the total PT_LOAD size and + // so debug info doesn't change addresses in actual code. + bool AIsAlloc = AFlags & SHF_ALLOC; + bool BIsAlloc = BFlags & SHF_ALLOC; + if (AIsAlloc != BIsAlloc) + return AIsAlloc; + + // We don't have any special requirements for the relative order of + // two non allocatable sections. + if (!AIsAlloc) + return false; + + // We want the read only sections first so that they go in the PT_LOAD + // covering the program headers at the start of the file. + bool AIsWritable = AFlags & SHF_WRITE; + bool BIsWritable = BFlags & SHF_WRITE; + if (AIsWritable != BIsWritable) + return BIsWritable; + + // For a corresponding reason, put non exec sections first (the program + // header PT_LOAD is not executable). + bool AIsExec = AFlags & SHF_EXECINSTR; + bool BIsExec = BFlags & SHF_EXECINSTR; + if (AIsExec != BIsExec) + return BIsExec; + + // If we got here we know that both A and B and in the same PT_LOAD. + // The last requirement we have is to put nobits section last. The + // reason is that the only thing the dynamic linker will see about + // them is a p_memsz that is larger than p_filesz. Seeing that it + // zeros the end of the PT_LOAD, so that has to correspond to the + // nobits sections. + return A->getType() != SHT_NOBITS && B->getType() == SHT_NOBITS; }); + // Always put StrTabSec last so that no section names are added to it after + // it's finalized. + OutputSections.push_back(&StrTabSec); + for (unsigned I = 0, N = OutputSections.size(); I < N; ++I) OutputSections[I]->setSectionIndex(I + 1); + + // Fill the DynStrSec early. + DynamicSec.finalize(); } template diff --git a/lld/test/elf2/basic-aarch64.s b/lld/test/elf2/basic-aarch64.s index 8ba1bc9edd28..89a68ef2d1b4 100644 --- a/lld/test/elf2/basic-aarch64.s +++ b/lld/test/elf2/basic-aarch64.s @@ -53,22 +53,6 @@ _start: # CHECK-NEXT: } # CHECK-NEXT: Section { # CHECK-NEXT: Index: 1 -# CHECK-NEXT: Name: .bss -# CHECK-NEXT: Type: SHT_NOBITS (0x8) -# CHECK-NEXT: Flags [ (0x3) -# CHECK-NEXT: SHF_ALLOC (0x2) -# CHECK-NEXT: SHF_WRITE (0x1) -# CHECK-NEXT: ] -# CHECK-NEXT: Address: 0x11000 -# CHECK-NEXT: Offset: 0x1000 -# CHECK-NEXT: Size: 0 -# CHECK-NEXT: Link: 0 -# CHECK-NEXT: Info: 0 -# CHECK-NEXT: AddressAlignment: 4 -# CHECK-NEXT: EntrySize: 0 -# CHECK-NEXT: } -# CHECK-NEXT: Section { -# CHECK-NEXT: Index: 2 # CHECK-NEXT: Name: .text # CHECK-NEXT: Type: SHT_PROGBITS (0x1) # CHECK-NEXT: Flags [ (0x6) @@ -84,7 +68,7 @@ _start: # CHECK-NEXT: EntrySize: 0 # CHECK-NEXT: } # CHECK-NEXT: Section { -# CHECK-NEXT: Index: 3 +# CHECK-NEXT: Index: 2 # CHECK-NEXT: Name: .data # CHECK-NEXT: Type: SHT_PROGBITS (0x1) # CHECK-NEXT: Flags [ (0x3) @@ -100,6 +84,22 @@ _start: # CHECK-NEXT: EntrySize: 0 # CHECK-NEXT: } # CHECK-NEXT: Section { +# CHECK-NEXT: Index: 3 +# CHECK-NEXT: Name: .bss +# CHECK-NEXT: Type: SHT_NOBITS (0x8) +# CHECK-NEXT: Flags [ (0x3) +# CHECK-NEXT: SHF_ALLOC (0x2) +# CHECK-NEXT: SHF_WRITE (0x1) +# CHECK-NEXT: ] +# CHECK-NEXT: Address: 0x1100C +# CHECK-NEXT: Offset: 0x100C +# CHECK-NEXT: Size: 0 +# CHECK-NEXT: Link: 0 +# CHECK-NEXT: Info: 0 +# CHECK-NEXT: AddressAlignment: 4 +# CHECK-NEXT: EntrySize: 0 +# CHECK-NEXT: } +# CHECK-NEXT: Section { # CHECK-NEXT: Index: 4 # CHECK-NEXT: Name: .symtab # CHECK-NEXT: Type: SHT_SYMTAB (0x2) @@ -145,7 +145,7 @@ _start: # CHECK-NEXT: Binding: Local (0x0) # CHECK-NEXT: Type: None (0x0) # CHECK-NEXT: Other: 0 -# CHECK-NEXT: Section: .text (0x2) +# CHECK-NEXT: Section: .text # CHECK-NEXT: } # CHECK-NEXT: Symbol { # CHECK-NEXT: Name: _start (7) diff --git a/lld/test/elf2/basic-mips.s b/lld/test/elf2/basic-mips.s index 15a5b7c20a16..2e067ac422f9 100644 --- a/lld/test/elf2/basic-mips.s +++ b/lld/test/elf2/basic-mips.s @@ -25,14 +25,14 @@ __start: # CHECK-NEXT: Type: Executable (0x2) # CHECK-NEXT: Machine: EM_MIPS (0x8) # CHECK-NEXT: Version: 1 -# CHECK-NEXT: Entry: 0x11000 +# CHECK-NEXT: Entry: 0x12000 # CHECK-NEXT: ProgramHeaderOffset: 0x34 -# CHECK-NEXT: SectionHeaderOffset: 0x2094 +# CHECK-NEXT: SectionHeaderOffset: 0x2074 # CHECK-NEXT: Flags [ (0x0) # CHECK-NEXT: ] # CHECK-NEXT: HeaderSize: 52 # CHECK-NEXT: ProgramHeaderEntrySize: 32 -# CHECK-NEXT: ProgramHeaderCount: 3 +# CHECK-NEXT: ProgramHeaderCount: 2 # CHECK-NEXT: SectionHeaderEntrySize: 40 # CHECK-NEXT: SectionHeaderCount: 8 # CHECK-NEXT: StringTableSectionIndex: 7 @@ -54,61 +54,13 @@ __start: # CHECK-NEXT: } # CHECK-NEXT: Section { # CHECK-NEXT: Index: 1 -# CHECK-NEXT: Name: .bss (15) -# CHECK-NEXT: Type: SHT_NOBITS (0x8) -# CHECK-NEXT: Flags [ (0x3) -# CHECK-NEXT: SHF_ALLOC (0x2) -# CHECK-NEXT: SHF_WRITE (0x1) -# CHECK-NEXT: ] -# CHECK-NEXT: Address: 0x11000 -# CHECK-NEXT: Offset: 0x1000 -# CHECK-NEXT: Size: 0 -# CHECK-NEXT: Link: 0 -# CHECK-NEXT: Info: 0 -# CHECK-NEXT: AddressAlignment: 16 -# CHECK-NEXT: EntrySize: 0 -# CHECK-NEXT: } -# CHECK-NEXT: Section { -# CHECK-NEXT: Index: 2 -# CHECK-NEXT: Name: .text (1) -# CHECK-NEXT: Type: SHT_PROGBITS (0x1) -# CHECK-NEXT: Flags [ (0x6) -# CHECK-NEXT: SHF_ALLOC (0x2) -# CHECK-NEXT: SHF_EXECINSTR (0x4) -# CHECK-NEXT: ] -# CHECK-NEXT: Address: 0x11000 -# CHECK-NEXT: Offset: 0x1000 -# CHECK-NEXT: Size: 12 -# CHECK-NEXT: Link: 0 -# CHECK-NEXT: Info: 0 -# CHECK-NEXT: AddressAlignment: 16 -# CHECK-NEXT: EntrySize: 0 -# CHECK-NEXT: } -# CHECK-NEXT: Section { -# CHECK-NEXT: Index: 3 -# CHECK-NEXT: Name: .data (60) -# CHECK-NEXT: Type: SHT_PROGBITS (0x1) -# CHECK-NEXT: Flags [ (0x3) -# CHECK-NEXT: SHF_ALLOC (0x2) -# CHECK-NEXT: SHF_WRITE (0x1) -# CHECK-NEXT: ] -# CHECK-NEXT: Address: 0x11010 -# CHECK-NEXT: Offset: 0x1010 -# CHECK-NEXT: Size: 0 -# CHECK-NEXT: Link: 0 -# CHECK-NEXT: Info: 0 -# CHECK-NEXT: AddressAlignment: 16 -# CHECK-NEXT: EntrySize: 0 -# CHECK-NEXT: } -# CHECK-NEXT: Section { -# CHECK-NEXT: Index: 4 # CHECK-NEXT: Name: .reginfo (35) # CHECK-NEXT: Type: SHT_MIPS_REGINFO (0x70000006) # CHECK-NEXT: Flags [ (0x2) # CHECK-NEXT: SHF_ALLOC (0x2) # CHECK-NEXT: ] -# CHECK-NEXT: Address: 0x12000 -# CHECK-NEXT: Offset: 0x2000 +# CHECK-NEXT: Address: 0x11000 +# CHECK-NEXT: Offset: 0x1000 # CHECK-NEXT: Size: 24 # CHECK-NEXT: Link: 0 # CHECK-NEXT: Info: 0 @@ -116,14 +68,14 @@ __start: # CHECK-NEXT: EntrySize: 0 # CHECK-NEXT: } # CHECK-NEXT: Section { -# CHECK-NEXT: Index: 5 +# CHECK-NEXT: Index: 2 # CHECK-NEXT: Name: .MIPS.abiflags (20) # CHECK-NEXT: Type: SHT_MIPS_ABIFLAGS (0x7000002A) # CHECK-NEXT: Flags [ (0x2) # CHECK-NEXT: SHF_ALLOC (0x2) # CHECK-NEXT: ] -# CHECK-NEXT: Address: 0x12018 -# CHECK-NEXT: Offset: 0x2018 +# CHECK-NEXT: Address: 0x11018 +# CHECK-NEXT: Offset: 0x1018 # CHECK-NEXT: Size: 24 # CHECK-NEXT: Link: 0 # CHECK-NEXT: Info: 0 @@ -131,13 +83,61 @@ __start: # CHECK-NEXT: EntrySize: 0 # CHECK-NEXT: } # CHECK-NEXT: Section { +# CHECK-NEXT: Index: 3 +# CHECK-NEXT: Name: .text (1) +# CHECK-NEXT: Type: SHT_PROGBITS (0x1) +# CHECK-NEXT: Flags [ (0x6) +# CHECK-NEXT: SHF_ALLOC (0x2) +# CHECK-NEXT: SHF_EXECINSTR (0x4) +# CHECK-NEXT: ] +# CHECK-NEXT: Address: 0x12000 +# CHECK-NEXT: Offset: 0x2000 +# CHECK-NEXT: Size: 12 +# CHECK-NEXT: Link: 0 +# CHECK-NEXT: Info: 0 +# CHECK-NEXT: AddressAlignment: 16 +# CHECK-NEXT: EntrySize: 0 +# CHECK-NEXT: } +# CHECK-NEXT: Section { +# CHECK-NEXT: Index: 4 +# CHECK-NEXT: Name: .data (60) +# CHECK-NEXT: Type: SHT_PROGBITS (0x1) +# CHECK-NEXT: Flags [ (0x3) +# CHECK-NEXT: SHF_ALLOC (0x2) +# CHECK-NEXT: SHF_WRITE (0x1) +# CHECK-NEXT: ] +# CHECK-NEXT: Address: 0x12010 +# CHECK-NEXT: Offset: 0x2010 +# CHECK-NEXT: Size: 0 +# CHECK-NEXT: Link: 0 +# CHECK-NEXT: Info: 0 +# CHECK-NEXT: AddressAlignment: 16 +# CHECK-NEXT: EntrySize: 0 +# CHECK-NEXT: } +# CHECK-NEXT: Section { +# CHECK-NEXT: Index: 5 +# CHECK-NEXT: Name: .bss (15) +# CHECK-NEXT: Type: SHT_NOBITS (0x8) +# CHECK-NEXT: Flags [ (0x3) +# CHECK-NEXT: SHF_ALLOC (0x2) +# CHECK-NEXT: SHF_WRITE (0x1) +# CHECK-NEXT: ] +# CHECK-NEXT: Address: 0x12010 +# CHECK-NEXT: Offset: 0x2010 +# CHECK-NEXT: Size: 0 +# CHECK-NEXT: Link: 0 +# CHECK-NEXT: Info: 0 +# CHECK-NEXT: AddressAlignment: 16 +# CHECK-NEXT: EntrySize: 0 +# CHECK-NEXT: } +# CHECK-NEXT: Section { # CHECK-NEXT: Index: 6 # CHECK-NEXT: Name: .symtab (52) # CHECK-NEXT: Type: SHT_SYMTAB (0x2) # CHECK-NEXT: Flags [ (0x0) # CHECK-NEXT: ] # CHECK-NEXT: Address: 0x0 -# CHECK-NEXT: Offset: 0x2030 +# CHECK-NEXT: Offset: 0x2010 # CHECK-NEXT: Size: 32 # CHECK-NEXT: Link: 7 # CHECK-NEXT: Info: 1 @@ -151,7 +151,7 @@ __start: # CHECK-NEXT: Flags [ (0x0) # CHECK-NEXT: ] # CHECK-NEXT: Address: 0x0 -# CHECK-NEXT: Offset: 0x2050 +# CHECK-NEXT: Offset: 0x2030 # CHECK-NEXT: Size: 66 # CHECK-NEXT: Link: 0 # CHECK-NEXT: Info: 0 @@ -171,12 +171,12 @@ __start: # CHECK-NEXT: } # CHECK-NEXT: Symbol { # CHECK-NEXT: Name: __start (7) -# CHECK-NEXT: Value: 0x11000 +# CHECK-NEXT: Value: 0x12000 # CHECK-NEXT: Size: 0 # CHECK-NEXT: Binding: Global (0x1) # CHECK-NEXT: Type: None (0x0) # CHECK-NEXT: Other: 0 -# CHECK-NEXT: Section: .text (0x2) +# CHECK-NEXT: Section: .text # CHECK-NEXT: } # CHECK-NEXT: ] # CHECK-NEXT: ProgramHeaders [ @@ -185,8 +185,8 @@ __start: # CHECK-NEXT: Offset: 0x0 # CHECK-NEXT: VirtualAddress: 0x10000 # CHECK-NEXT: PhysicalAddress: 0x10000 -# CHECK-NEXT: FileSize: 148 -# CHECK-NEXT: MemSize: 148 +# CHECK-NEXT: FileSize: 4144 +# CHECK-NEXT: MemSize: 4144 # CHECK-NEXT: Flags [ (0x4) # CHECK-NEXT: PF_R (0x4) # CHECK-NEXT: ] @@ -194,26 +194,14 @@ __start: # CHECK-NEXT: } # CHECK-NEXT: ProgramHeader { # CHECK-NEXT: Type: PT_LOAD (0x1) -# CHECK-NEXT: Offset: 0x1000 -# CHECK-NEXT: VirtualAddress: 0x11000 -# CHECK-NEXT: PhysicalAddress: 0x11000 -# CHECK-NEXT: FileSize: 16 -# CHECK-NEXT: MemSize: 16 -# CHECK-NEXT: Flags [ (0x5) -# CHECK-NEXT: PF_R (0x4) -# CHECK-NEXT: PF_X (0x1) -# CHECK-NEXT: ] -# CHECK-NEXT: Alignment: 4096 -# CHECK-NEXT: } -# CHECK-NEXT: ProgramHeader { -# CHECK-NEXT: Type: PT_LOAD (0x1) # CHECK-NEXT: Offset: 0x2000 # CHECK-NEXT: VirtualAddress: 0x12000 # CHECK-NEXT: PhysicalAddress: 0x12000 -# CHECK-NEXT: FileSize: 48 -# CHECK-NEXT: MemSize: 48 -# CHECK-NEXT: Flags [ (0x4) +# CHECK-NEXT: FileSize: 16 +# CHECK-NEXT: MemSize: 16 +# CHECK-NEXT: Flags [ (0x5) # CHECK-NEXT: PF_R (0x4) +# CHECK-NEXT: PF_X (0x1) # CHECK-NEXT: ] # CHECK-NEXT: Alignment: 4096 # CHECK-NEXT: } diff --git a/lld/test/elf2/basic.s b/lld/test/elf2/basic.s index 1504251fb6a6..dca96f857624 100644 --- a/lld/test/elf2/basic.s +++ b/lld/test/elf2/basic.s @@ -54,22 +54,6 @@ _start: # CHECK-NEXT: } # CHECK-NEXT: Section { # CHECK-NEXT: Index: 1 -# CHECK-NEXT: Name: .bss -# CHECK-NEXT: Type: SHT_NOBITS (0x8) -# CHECK-NEXT: Flags [ (0x3) -# CHECK-NEXT: SHF_ALLOC (0x2) -# CHECK-NEXT: SHF_WRITE (0x1) -# CHECK-NEXT: ] -# CHECK-NEXT: Address: 0x11000 -# CHECK-NEXT: Offset: 0x1000 -# CHECK-NEXT: Size: 0 -# CHECK-NEXT: Link: 0 -# CHECK-NEXT: Info: 0 -# CHECK-NEXT: AddressAlignment: 4 -# CHECK-NEXT: EntrySize: 0 -# CHECK-NEXT: } -# CHECK-NEXT: Section { -# CHECK-NEXT: Index: 2 # CHECK-NEXT: Name: .text # CHECK-NEXT: Type: SHT_PROGBITS (0x1) # CHECK-NEXT: Flags [ (0x6) @@ -85,7 +69,7 @@ _start: # CHECK-NEXT: EntrySize: 0 # CHECK-NEXT: } # CHECK-NEXT: Section { -# CHECK-NEXT: Index: 3 +# CHECK-NEXT: Index: 2 # CHECK-NEXT: Name: .data # CHECK-NEXT: Type: SHT_PROGBITS (0x1) # CHECK-NEXT: Flags [ (0x3) @@ -101,6 +85,22 @@ _start: # CHECK-NEXT: EntrySize: 0 # CHECK-NEXT: } # CHECK-NEXT: Section { +# CHECK-NEXT: Index: 3 +# CHECK-NEXT: Name: .bss +# CHECK-NEXT: Type: SHT_NOBITS (0x8) +# CHECK-NEXT: Flags [ (0x3) +# CHECK-NEXT: SHF_ALLOC (0x2) +# CHECK-NEXT: SHF_WRITE (0x1) +# CHECK-NEXT: ] +# CHECK-NEXT: Address: 0x11010 +# CHECK-NEXT: Offset: 0x1010 +# CHECK-NEXT: Size: 0 +# CHECK-NEXT: Link: 0 +# CHECK-NEXT: Info: 0 +# CHECK-NEXT: AddressAlignment: 4 +# CHECK-NEXT: EntrySize: 0 +# CHECK-NEXT: } +# CHECK-NEXT: Section { # CHECK-NEXT: Index: 4 # CHECK-NEXT: Name: .symtab # CHECK-NEXT: Type: SHT_SYMTAB (0x2) diff --git a/lld/test/elf2/basic32.s b/lld/test/elf2/basic32.s index edafbe41d1aa..bad5750ed1c7 100644 --- a/lld/test/elf2/basic32.s +++ b/lld/test/elf2/basic32.s @@ -52,22 +52,6 @@ _start: # CHECK-NEXT: } # CHECK-NEXT: Section { # CHECK-NEXT: Index: 1 -# CHECK-NEXT: Name: .bss -# CHECK-NEXT: Type: SHT_NOBITS (0x8) -# CHECK-NEXT: Flags [ (0x3) -# CHECK-NEXT: SHF_ALLOC (0x2) -# CHECK-NEXT: SHF_WRITE (0x1) -# CHECK-NEXT: ] -# CHECK-NEXT: Address: 0x11000 -# CHECK-NEXT: Offset: 0x1000 -# CHECK-NEXT: Size: 0 -# CHECK-NEXT: Link: 0 -# CHECK-NEXT: Info: 0 -# CHECK-NEXT: AddressAlignment: 4 -# CHECK-NEXT: EntrySize: 0 -# CHECK-NEXT: } -# CHECK-NEXT: Section { -# CHECK-NEXT: Index: 2 # CHECK-NEXT: Name: .text # CHECK-NEXT: Type: SHT_PROGBITS (0x1) # CHECK-NEXT: Flags [ (0x6) @@ -83,7 +67,7 @@ _start: # CHECK-NEXT: EntrySize: 0 # CHECK-NEXT: } # CHECK-NEXT: Section { -# CHECK-NEXT: Index: 3 +# CHECK-NEXT: Index: 2 # CHECK-NEXT: Name: .data # CHECK-NEXT: Type: SHT_PROGBITS (0x1) # CHECK-NEXT: Flags [ (0x3) @@ -99,6 +83,22 @@ _start: # CHECK-NEXT: EntrySize: 0 # CHECK-NEXT: } # CHECK-NEXT: Section { +# CHECK-NEXT: Index: 3 +# CHECK-NEXT: Name: .bss +# CHECK-NEXT: Type: SHT_NOBITS (0x8) +# CHECK-NEXT: Flags [ (0x3) +# CHECK-NEXT: SHF_ALLOC (0x2) +# CHECK-NEXT: SHF_WRITE (0x1) +# CHECK-NEXT: ] +# CHECK-NEXT: Address: 0x1100C +# CHECK-NEXT: Offset: 0x100C +# CHECK-NEXT: Size: 0 +# CHECK-NEXT: Link: 0 +# CHECK-NEXT: Info: 0 +# CHECK-NEXT: AddressAlignment: 4 +# CHECK-NEXT: EntrySize: 0 +# CHECK-NEXT: } +# CHECK-NEXT: Section { # CHECK-NEXT: Index: 4 # CHECK-NEXT: Name: .symtab # CHECK-NEXT: Type: SHT_SYMTAB diff --git a/lld/test/elf2/basic32be.s b/lld/test/elf2/basic32be.s index 1f5e46a586d8..5d1cfee9e433 100644 --- a/lld/test/elf2/basic32be.s +++ b/lld/test/elf2/basic32be.s @@ -52,22 +52,6 @@ _start: # CHECK-NEXT: } # CHECK-NEXT: Section { # CHECK-NEXT: Index: 1 -# CHECK-NEXT: Name: .bss -# CHECK-NEXT: Type: SHT_NOBITS (0x8) -# CHECK-NEXT: Flags [ (0x3) -# CHECK-NEXT: SHF_ALLOC (0x2) -# CHECK-NEXT: SHF_WRITE (0x1) -# CHECK-NEXT: ] -# CHECK-NEXT: Address: 0x11000 -# CHECK-NEXT: Offset: 0x1000 -# CHECK-NEXT: Size: 0 -# CHECK-NEXT: Link: 0 -# CHECK-NEXT: Info: 0 -# CHECK-NEXT: AddressAlignment: 4 -# CHECK-NEXT: EntrySize: 0 -# CHECK-NEXT: } -# CHECK-NEXT: Section { -# CHECK-NEXT: Index: 2 # CHECK-NEXT: Name: .text # CHECK-NEXT: Type: SHT_PROGBITS (0x1) # CHECK-NEXT: Flags [ (0x6) @@ -83,7 +67,7 @@ _start: # CHECK-NEXT: EntrySize: 0 # CHECK-NEXT: } # CHECK-NEXT: Section { -# CHECK-NEXT: Index: 3 +# CHECK-NEXT: Index: 2 # CHECK-NEXT: Name: .data # CHECK-NEXT: Type: SHT_PROGBITS (0x1) # CHECK-NEXT: Flags [ (0x3) @@ -99,6 +83,22 @@ _start: # CHECK-NEXT: EntrySize: 0 # CHECK-NEXT: } # CHECK-NEXT: Section { +# CHECK-NEXT: Index: 3 +# CHECK-NEXT: Name: .bss +# CHECK-NEXT: Type: SHT_NOBITS (0x8) +# CHECK-NEXT: Flags [ (0x3) +# CHECK-NEXT: SHF_ALLOC (0x2) +# CHECK-NEXT: SHF_WRITE (0x1) +# CHECK-NEXT: ] +# CHECK-NEXT: Address: 0x1100C +# CHECK-NEXT: Offset: 0x100C +# CHECK-NEXT: Size: 0 +# CHECK-NEXT: Link: 0 +# CHECK-NEXT: Info: 0 +# CHECK-NEXT: AddressAlignment: 4 +# CHECK-NEXT: EntrySize: 0 +# CHECK-NEXT: } +# CHECK-NEXT: Section { # CHECK-NEXT: Index: 4 # CHECK-NEXT: Name: .symtab # CHECK-NEXT: Type: SHT_SYMTAB diff --git a/lld/test/elf2/basic64be.s b/lld/test/elf2/basic64be.s index 842312a0726b..01b85f673ae8 100644 --- a/lld/test/elf2/basic64be.s +++ b/lld/test/elf2/basic64be.s @@ -59,22 +59,6 @@ _start: # CHECK-NEXT: } # CHECK-NEXT: Section { # CHECK-NEXT: Index: 1 -# CHECK-NEXT: Name: .bss -# CHECK-NEXT: Type: SHT_NOBITS (0x8) -# CHECK-NEXT: Flags [ (0x3) -# CHECK-NEXT: SHF_ALLOC (0x2) -# CHECK-NEXT: SHF_WRITE (0x1) -# CHECK-NEXT: ] -# CHECK-NEXT: Address: 0x11000 -# CHECK-NEXT: Offset: 0x1000 -# CHECK-NEXT: Size: 0 -# CHECK-NEXT: Link: 0 -# CHECK-NEXT: Info: 0 -# CHECK-NEXT: AddressAlignment: 4 -# CHECK-NEXT: EntrySize: 0 -# CHECK-NEXT: } -# CHECK-NEXT: Section { -# CHECK-NEXT: Index: 2 # CHECK-NEXT: Name: .text # CHECK-NEXT: Type: SHT_PROGBITS (0x1) # CHECK-NEXT: Flags [ (0x6) @@ -92,7 +76,7 @@ _start: # CHECK: ) # CHECK-NEXT: } # CHECK-NEXT: Section { -# CHECK-NEXT: Index: 3 +# CHECK-NEXT: Index: 2 # CHECK-NEXT: Name: .data # CHECK-NEXT: Type: SHT_PROGBITS (0x1) # CHECK-NEXT: Flags [ (0x3) @@ -110,7 +94,7 @@ _start: # CHECK: ) # CHECK-NEXT: } # CHECK-NEXT: Section { -# CHECK-NEXT: Index: 4 +# CHECK-NEXT: Index: 3 # CHECK-NEXT: Name: .opd # CHECK-NEXT: Type: SHT_PROGBITS (0x1) # CHECK-NEXT: Flags [ (0x3) @@ -130,6 +114,22 @@ _start: # CHECK-NEXT: ) # CHECK-NEXT: } # CHECK-NEXT: Section { +# CHECK-NEXT: Index: 4 +# CHECK-NEXT: Name: .bss +# CHECK-NEXT: Type: SHT_NOBITS (0x8) +# CHECK-NEXT: Flags [ (0x3) +# CHECK-NEXT: SHF_ALLOC (0x2) +# CHECK-NEXT: SHF_WRITE (0x1) +# CHECK-NEXT: ] +# CHECK-NEXT: Address: 0x12018 +# CHECK-NEXT: Offset: 0x2018 +# CHECK-NEXT: Size: 0 +# CHECK-NEXT: Link: 0 +# CHECK-NEXT: Info: 0 +# CHECK-NEXT: AddressAlignment: 4 +# CHECK-NEXT: EntrySize: 0 +# CHECK-NEXT: } +# CHECK-NEXT: Section { # CHECK-NEXT: Index: 5 # CHECK-NEXT: Name: .symtab # CHECK-NEXT: Type: SHT_SYMTAB diff --git a/lld/test/elf2/bss.s b/lld/test/elf2/bss.s index e8ca6be4b343..0fa8fe4b0954 100644 --- a/lld/test/elf2/bss.s +++ b/lld/test/elf2/bss.s @@ -19,17 +19,6 @@ // CHECK-NEXT: AddressAlignment: 4 // CHECK-NEXT: EntrySize: 0 // CHECK-NEXT: } -// CHECK-NEXT: Section { -// CHECK-NEXT: Index: -// CHECK-NEXT: Name: -// CHECK-NEXT: Type: -// CHECK-NEXT: Flags [ -// CHECK-NEXT: SHF_ALLOC -// CHECK-NEXT: SHF_EXECINSTR -// CHECK-NEXT: ] -// CHECK-NEXT: Address: -// CHECK-NEXT: Offset: 0x1000 - .global _start _start: diff --git a/lld/test/elf2/discard-none.s b/lld/test/elf2/discard-none.s index 2c3d798dec76..77005348f96a 100644 --- a/lld/test/elf2/discard-none.s +++ b/lld/test/elf2/discard-none.s @@ -40,7 +40,7 @@ // CHECK-NEXT: } // CHECK-NEXT: Symbol { // CHECK-NEXT: Name: .Lmyothervar -// CHECK-NEXT: Value: 0x1000 +// CHECK-NEXT: Value: 0x102C // CHECK-NEXT: Size: 0 // CHECK-NEXT: Binding: Local // CHECK-NEXT: Type: None @@ -49,7 +49,7 @@ // CHECK-NEXT: } // CHECK-NEXT: Symbol { // CHECK-NEXT: Name: .Lmyvar -// CHECK-NEXT: Value: 0x1000 +// CHECK-NEXT: Value: 0x102C // CHECK-NEXT: Size: 0 // CHECK-NEXT: Binding: Local // CHECK-NEXT: Type: None diff --git a/lld/test/elf2/dynamic-reloc-index.s b/lld/test/elf2/dynamic-reloc-index.s index 294595b9fb95..da4df34395c5 100644 --- a/lld/test/elf2/dynamic-reloc-index.s +++ b/lld/test/elf2/dynamic-reloc-index.s @@ -8,7 +8,7 @@ // CHECK: Relocations [ // CHECK-NEXT: Section ({{.*}}) .rela.dyn { -// CHECK-NEXT: 0x11000 R_X86_64_64 bar 0x0 +// CHECK-NEXT: 0x12000 R_X86_64_64 bar 0x0 // CHECK-NEXT: } // CHECK-NEXT: ] diff --git a/lld/test/elf2/dynamic-reloc.s b/lld/test/elf2/dynamic-reloc.s index 5a4b55157da6..75cfde9ec4ad 100644 --- a/lld/test/elf2/dynamic-reloc.s +++ b/lld/test/elf2/dynamic-reloc.s @@ -6,15 +6,7 @@ // RUN: llvm-readobj -dynamic-table -r --expand-relocs -s %t | FileCheck %s // REQUIRES: x86 -// CHECK: Name: .text -// CHECK-NEXT: Type: SHT_PROGBITS -// CHECK-NEXT: Flags [ -// CHECK-NEXT: SHF_ALLOC -// CHECK-NEXT: SHF_EXECINSTR -// CHECK-NEXT: ] -// CHECK-NEXT: Address: [[ADDR:.*]] - -// CHECK: Index: 4 +// CHECK: Index: 1 // CHECK-NEXT: Name: .dynsym // CHECK: Name: .rela.dyn @@ -25,11 +17,19 @@ // CHECK-NEXT: Address: [[RELAADDR:.*]] // CHECK-NEXT: Offset: // CHECK-NEXT: Size: [[RELASIZE:.*]] -// CHECK-NEXT: Link: 4 +// CHECK-NEXT: Link: 1 // CHECK-NEXT: Info: 0 // CHECK-NEXT: AddressAlignment: 8 // CHECK-NEXT: EntrySize: 24 +// CHECK: Name: .text +// CHECK-NEXT: Type: SHT_PROGBITS +// CHECK-NEXT: Flags [ +// CHECK-NEXT: SHF_ALLOC +// CHECK-NEXT: SHF_EXECINSTR +// CHECK-NEXT: ] +// CHECK-NEXT: Address: [[ADDR:.*]] + // CHECK: Relocations [ // CHECK-NEXT: Section ({{.*}}) .rela.dyn { // CHECK-NEXT: Relocation { diff --git a/lld/test/elf2/got.s b/lld/test/elf2/got.s index aaff3a1df545..3e248919e7aa 100644 --- a/lld/test/elf2/got.s +++ b/lld/test/elf2/got.s @@ -12,7 +12,7 @@ // CHECK-NEXT: SHF_ALLOC // CHECK-NEXT: SHF_WRITE // CHECK-NEXT: ] -// CHECK-NEXT: Address: 0x15000 +// CHECK-NEXT: Address: 0x130A0 // CHECK-NEXT: Offset: // CHECK-NEXT: Size: 16 // CHECK-NEXT: Link: 0 @@ -21,22 +21,22 @@ // CHECK: Relocations [ // CHECK-NEXT: Section ({{.*}}) .rela.dyn { -// CHECK-NEXT: 0x15000 R_X86_64_GLOB_DAT bar 0x0 -// CHECK-NEXT: 0x15008 R_X86_64_GLOB_DAT zed 0x0 +// CHECK-NEXT: 0x130A0 R_X86_64_GLOB_DAT bar 0x0 +// CHECK-NEXT: 0x130A8 R_X86_64_GLOB_DAT zed 0x0 // CHECK-NEXT: } // CHECK-NEXT: ] // Unfortunately FileCheck can't do math, so we have to check for explicit // values: -// 0x15000 - (0x11000 + 2) - 4 = 16378 -// 0x15000 - (0x11006 + 2) - 4 = 16372 -// 0x15008 - (0x1100c + 2) - 4 = 16374 +// 0x130A0 - (0x12000 + 2) - 4 = 4250 +// 0x130A0 - (0x12006 + 2) - 4 = 4244 +// 0x130A8 - (0x1200c + 2) - 4 = 4246 // DISASM: _start: -// DISASM-NEXT: 11000: ff 25 fa 3f 00 00 jmpq *16378(%rip) -// DISASM-NEXT: 11006: ff 25 f4 3f 00 00 jmpq *16372(%rip) -// DISASM-NEXT: 1100c: ff 25 f6 3f 00 00 jmpq *16374(%rip) +// DISASM-NEXT: 12000: {{.*}} jmpq *4250(%rip) +// DISASM-NEXT: 12006: {{.*}} jmpq *4244(%rip) +// DISASM-NEXT: 1200c: {{.*}} jmpq *4246(%rip) .global _start _start: diff --git a/lld/test/elf2/local-dynamic.s b/lld/test/elf2/local-dynamic.s index d95909dcac41..503f3aa3e81e 100644 --- a/lld/test/elf2/local-dynamic.s +++ b/lld/test/elf2/local-dynamic.s @@ -16,7 +16,7 @@ // CHECK-NEXT: } // CHECK-NEXT: Symbol { // CHECK-NEXT: Name: blah -// CHECK-NEXT: Value: 0x1000 +// CHECK-NEXT: Value: 0x1050 // CHECK-NEXT: Size: 0 // CHECK-NEXT: Binding: Local // CHECK-NEXT: Type: None @@ -25,7 +25,7 @@ // CHECK-NEXT: } // CHECK-NEXT: Symbol { // CHECK-NEXT: Name: foo -// CHECK-NEXT: Value: 0x1000 +// CHECK-NEXT: Value: 0x1050 // CHECK-NEXT: Size: 0 // CHECK-NEXT: Binding: Local // CHECK-NEXT: Type: None @@ -34,7 +34,7 @@ // CHECK-NEXT: } // CHECK-NEXT: Symbol { // CHECK-NEXT: Name: goo -// CHECK-NEXT: Value: 0x1000 +// CHECK-NEXT: Value: 0x1050 // CHECK-NEXT: Size: 0 // CHECK-NEXT: Binding: Local // CHECK-NEXT: Type: None @@ -43,7 +43,7 @@ // CHECK-NEXT: } // CHECK-NEXT: Symbol { // CHECK-NEXT: Name: _start -// CHECK-NEXT: Value: 0x1000 +// CHECK-NEXT: Value: 0x1050 // CHECK-NEXT: Size: 0 // CHECK-NEXT: Binding: Global // CHECK-NEXT: Type: None @@ -64,7 +64,7 @@ // CHECK-NEXT: } // CHECK-NEXT: Symbol { // CHECK-NEXT: Name: _start@ -// CHECK-NEXT: Value: 0x1000 +// CHECK-NEXT: Value: 0x1050 // CHECK-NEXT: Size: 0 // CHECK-NEXT: Binding: Global // CHECK-NEXT: Type: None diff --git a/lld/test/elf2/plt-i686.s b/lld/test/elf2/plt-i686.s index 8891f9e35420..1fa1b604ef6e 100644 --- a/lld/test/elf2/plt-i686.s +++ b/lld/test/elf2/plt-i686.s @@ -12,7 +12,7 @@ // CHECK-NEXT: SHF_ALLOC // CHECK-NEXT: SHF_EXECINSTR // CHECK-NEXT: ] -// CHECK-NEXT: Address: 0x16000 +// CHECK-NEXT: Address: 0x12010 // CHECK-NEXT: Offset: // CHECK-NEXT: Size: 16 // CHECK-NEXT: Link: 0 @@ -21,34 +21,34 @@ // CHECK: Relocations [ // CHECK-NEXT: Section ({{.*}}) .rel.dyn { -// CHECK-NEXT: 0x15000 R_386_GLOB_DAT bar 0x0 -// CHECK-NEXT: 0x15004 R_386_GLOB_DAT zed 0x0 +// CHECK-NEXT: 0x13050 R_386_GLOB_DAT bar 0x0 +// CHECK-NEXT: 0x13054 R_386_GLOB_DAT zed 0x0 // CHECK-NEXT: } // CHECK-NEXT: ] // Unfortunately FileCheck can't do math, so we have to check for explicit // values: -// 0x16000 - (0x11000 + 1) - 4 = 20475 -// 0x16000 - (0x11005 + 1) - 4 = 20470 -// 0x16008 - (0x1100a + 1) - 4 = 20473 +// 0x12010 - (0x12000 + 1) - 4 = 11 +// 0x12010 - (0x12005 + 1) - 4 = 2 +// 0x12018 - (0x1200a + 1) - 4 = 9 // DISASM: _start: -// DISASM-NEXT: 11000: e9 fb 4f 00 00 jmp 20475 -// DISASM-NEXT: 11005: e9 f6 4f 00 00 jmp 20470 -// DISASM-NEXT: 1100a: e9 f9 4f 00 00 jmp 20473 +// DISASM-NEXT: 12000: e9 0b 00 00 00 jmp 11 +// DISASM-NEXT: 12005: e9 06 00 00 00 jmp 6 +// DISASM-NEXT: 1200a: e9 09 00 00 00 jmp 9 -// 0x15000 = 86016 -// 0x15004 = 86020 +// 0x13050 = 77904 +// 0x13054 = 77908 // DISASM: Disassembly of section .plt: // DISASM-NEXT: .plt: -// DISASM-NEXT: 16000: ff 25 00 50 01 00 jmpl *86016 -// DISASM-NEXT: 16006: 90 nop -// DISASM-NEXT: 16007: 90 nop -// DISASM-NEXT: 16008: ff 25 04 50 01 00 jmpl *86020 -// DISASM-NEXT: 1600e: 90 nop -// DISASM-NEXT: 1600f: 90 nop +// DISASM-NEXT: 12010: ff 25 {{.*}} jmpl *77904 +// DISASM-NEXT: 12016: 90 nop +// DISASM-NEXT: 12017: 90 nop +// DISASM-NEXT: 12018: ff 25 {{.*}} jmpl *77908 +// DISASM-NEXT: 1201e: 90 nop +// DISASM-NEXT: 1201f: 90 nop .global _start _start: diff --git a/lld/test/elf2/plt.s b/lld/test/elf2/plt.s index 914b3e349dfc..261ca9b96149 100644 --- a/lld/test/elf2/plt.s +++ b/lld/test/elf2/plt.s @@ -12,7 +12,7 @@ // CHECK-NEXT: SHF_ALLOC // CHECK-NEXT: SHF_EXECINSTR // CHECK-NEXT: ] -// CHECK-NEXT: Address: 0x16000 +// CHECK-NEXT: Address: 0x12020 // CHECK-NEXT: Offset: // CHECK-NEXT: Size: 24 // CHECK-NEXT: Link: 0 @@ -21,35 +21,35 @@ // CHECK: Relocations [ // CHECK-NEXT: Section ({{.*}}) .rela.dyn { -// CHECK-NEXT: 0x15000 R_X86_64_GLOB_DAT bar 0x0 -// CHECK-NEXT: 0x15008 R_X86_64_GLOB_DAT zed 0x0 -// CHECK-NEXT: 0x15010 R_X86_64_GLOB_DAT _start 0x0 +// CHECK-NEXT: 0x130A0 R_X86_64_GLOB_DAT bar 0x0 +// CHECK-NEXT: 0x130A8 R_X86_64_GLOB_DAT zed 0x0 +// CHECK-NEXT: 0x130B0 R_X86_64_GLOB_DAT _start 0x0 // CHECK-NEXT: } // CHECK-NEXT: ] // Unfortunately FileCheck can't do math, so we have to check for explicit // values: -// 0x16000 - (0x11000 + 1) - 4 = 20475 -// 0x16000 - (0x11005 + 1) - 4 = 20470 -// 0x16008 - (0x1100a + 1) - 4 = 20473 +// 0x12020 - (0x12000 + 1) - 4 = 27 +// 0x12020 - (0x12005 + 1) - 4 = 22 +// 0x12028 - (0x1200a + 1) - 4 = 25 // DISASM: _start: -// DISASM-NEXT: 11000: e9 fb 4f 00 00 jmp 20475 -// DISASM-NEXT: 11005: e9 f6 4f 00 00 jmp 20470 -// DISASM-NEXT: 1100a: e9 f9 4f 00 00 jmp 20473 +// DISASM-NEXT: 12000: e9 {{.*}} jmp 27 +// DISASM-NEXT: 12005: e9 {{.*}} jmp 22 +// DISASM-NEXT: 1200a: e9 {{.*}} jmp 25 -// 0x15000 - 0x16006 = -4102 -// 0x15008 - 0x1600e = -4102 +// 0x130A0 - 0x12026 = 4218 +// 0x130A8 - 0x1202e = 4218 // DISASM: Disassembly of section .plt: // DISASM-NEXT: .plt: -// DISASM-NEXT: 16000: ff 25 fa ef ff ff jmpq *-4102(%rip) -// DISASM-NEXT: 16006: 90 nop -// DISASM-NEXT: 16007: 90 nop -// DISASM-NEXT: 16008: ff 25 fa ef ff ff jmpq *-4102(%rip) -// DISASM-NEXT: 1600e: 90 nop -// DISASM-NEXT: 1600f: 90 nop +// DISASM-NEXT: 12020: ff 25 {{.*}} jmpq *4218(%rip) +// DISASM-NEXT: 12026: 90 nop +// DISASM-NEXT: 12027: 90 nop +// DISASM-NEXT: 12028: ff 25 {{.*}} jmpq *4218(%rip) +// DISASM-NEXT: 1202e: 90 nop +// DISASM-NEXT: 1202f: 90 nop .global _start _start: diff --git a/lld/test/elf2/relocation-common.s b/lld/test/elf2/relocation-common.s index 68eca0195c16..8822ea7b7213 100644 --- a/lld/test/elf2/relocation-common.s +++ b/lld/test/elf2/relocation-common.s @@ -10,5 +10,5 @@ _start: .global sym1 .comm sym1,4,4 -// CHECK: 12000: {{.*}} movl $1, -4106(%rip) -// CHECK: 0000000000011000 g .bss 00000004 sym1 +// CHECK: 11000: {{.*}} movl $1, 4086(%rip) +// CHECK: 0000000000012000 g .bss 00000004 sym1 diff --git a/lld/test/elf2/relocation-i686.s b/lld/test/elf2/relocation-i686.s index d02821587e0b..6208b82ca3be 100644 --- a/lld/test/elf2/relocation-i686.s +++ b/lld/test/elf2/relocation-i686.s @@ -27,14 +27,14 @@ R_386_PC32_2: // CHECK: Disassembly of section .R_386_32: // CHECK-NEXT: R_386_32: -// CHECK-NEXT: 11000: {{.*}} movl $69633, %edx +// CHECK-NEXT: 12000: {{.*}} movl $73729, %edx // CHECK: Disassembly of section .R_386_PC32: // CHECK-NEXT: R_386_PC32: -// CHECK-NEXT: 11005: e8 04 00 00 00 calll 4 +// CHECK-NEXT: 12005: e8 04 00 00 00 calll 4 // CHECK: R_386_PC32_2: -// CHECK-NEXT: 1100e: 90 nop +// CHECK-NEXT: 1200e: 90 nop // Create a .got movl bar@GOT, %eax @@ -46,23 +46,23 @@ movl bar@GOT, %eax // ADDR-NEXT: SHF_ALLOC // ADDR-NEXT: SHF_WRITE // ADDR-NEXT: ] -// ADDR-NEXT: Address: 0x15000 +// ADDR-NEXT: Address: 0x13050 .section .R_386_GOTPC,"ax",@progbits R_386_GOTPC: movl $_GLOBAL_OFFSET_TABLE_, %eax -// 0x15000 - 0x11014 = 16364 +// 0x13050 - 0x12014 = 4156 // CHECK: Disassembly of section .R_386_GOTPC: // CHECK-NEXT: R_386_GOTPC: -// CHECK-NEXT: 11014: {{.*}} movl $16364, %eax +// CHECK-NEXT: 12014: {{.*}} movl $4156, %eax .section .dynamic_reloc, "ax",@progbits call bar+4 // CHECK: Disassembly of section .dynamic_reloc: // CHECK-NEXT: .dynamic_reloc: -// CHECK-NEXT: 11019: e8 00 00 00 00 calll 0 +// CHECK-NEXT: 12019: e8 00 00 00 00 calll 0 .section .R_386_GOT32,"ax",@progbits .global R_386_GOT32 @@ -71,4 +71,4 @@ R_386_GOT32: // This is the second symbol in the got, so the offset is 4. // CHECK: Disassembly of section .R_386_GOT32: // CHECK-NEXT: R_386_GOT32: -// CHECK-NEXT: 1101e: {{.*}} movl 4, %eax +// CHECK-NEXT: 1201e: {{.*}} movl 4, %eax diff --git a/lld/test/elf2/relocation-local.s b/lld/test/elf2/relocation-local.s index 5042c79a86b7..3adba3d73d53 100644 --- a/lld/test/elf2/relocation-local.s +++ b/lld/test/elf2/relocation-local.s @@ -20,7 +20,7 @@ R_X86_64_32: // constants in hex. // CHECK: Disassembly of section .text2: // CHECK-NEXT: R_X86_64_32: -// CHECK-NEXT: 1100c: {{.*}} movl $69644, %edx +// CHECK-NEXT: 12009: {{.*}} movl $73737, %edx .section .R_X86_64_32S,"ax",@progbits R_X86_64_32S: @@ -28,11 +28,11 @@ R_X86_64_32S: // CHECK: Disassembly of section .R_X86_64_32S: // CHECK-NEXT: R_X86_64_32S: -// CHECK-NEXT: {{.*}}: {{.*}} movq -978935, %rdx +// CHECK-NEXT: {{.*}}: {{.*}} movq -974839, %rdx .section .R_X86_64_64,"a",@progbits R_X86_64_64: .quad R_X86_64_64 // CHECK: Contents of section .R_X86_64_64: -// CHECK-NEXT: 12000 00200100 00000000 +// CHECK-NEXT: 11000 00100100 00000000 diff --git a/lld/test/elf2/relocation.s b/lld/test/elf2/relocation.s index 4046f2b8ffae..b56dcd8d1ec9 100644 --- a/lld/test/elf2/relocation.s +++ b/lld/test/elf2/relocation.s @@ -6,13 +6,23 @@ // RUN: llvm-objdump -s -d %t3 | FileCheck %s // REQUIRES: x86 +// SEC: Name: .plt +// SEC-NEXT: Type: SHT_PROGBITS +// SEC-NEXT: Flags [ +// SEC-NEXT: SHF_ALLOC +// SEC-NEXT: SHF_EXECINSTR +// SEC-NEXT: ] +// SEC-NEXT: Address: 0x12020 +// SEC-NEXT: Offset: 0x2020 +// SEC-NEXT: Size: 8 + // SEC: Name: .got // SEC-NEXT: Type: SHT_PROGBITS // SEC-NEXT: Flags [ // SEC-NEXT: SHF_ALLOC // SEC-NEXT: SHF_WRITE // SEC-NEXT: ] -// SEC-NEXT: Address: 0x15000 +// SEC-NEXT: Address: 0x130A0 // SEC-NEXT: Offset: // SEC-NEXT: Size: 16 // SEC-NEXT: Link: 0 @@ -21,16 +31,6 @@ // SEC-NEXT: EntrySize: 0 // SEC-NEXT: } -// SEC: Name: .plt -// SEC-NEXT: Type: SHT_PROGBITS -// SEC-NEXT: Flags [ -// SEC-NEXT: SHF_ALLOC -// SEC-NEXT: SHF_EXECINSTR -// SEC-NEXT: ] -// SEC-NEXT: Address: 0x16000 -// SEC-NEXT: Offset: 0x6000 -// SEC-NEXT: Size: 8 - .section .text,"ax",@progbits,unique,1 .global _start _start: @@ -44,11 +44,11 @@ lulz: // CHECK: Disassembly of section .text: // CHECK-NEXT: _start: -// CHECK-NEXT: 11000: e8 04 00 00 00 callq 4 -// CHECK-NEXT: 11005: +// CHECK-NEXT: 12000: e8 04 00 00 00 callq 4 +// CHECK-NEXT: 12005: // CHECK: lulz: -// CHECK-NEXT: 11009: 90 nop +// CHECK-NEXT: 12009: 90 nop .section .text2,"ax",@progbits @@ -60,7 +60,7 @@ R_X86_64_32: // constants in hex. // CHECK: Disassembly of section .text2: // CHECK-NEXT: R_X86_64_32: -// CHECK-NEXT: 1100c: {{.*}} movl $69644, %edx +// CHECK-NEXT: 1200a: {{.*}} movl $73738, %edx .section .R_X86_64_32S,"ax",@progbits .global R_X86_64_32S @@ -69,16 +69,16 @@ R_X86_64_32S: // CHECK: Disassembly of section .R_X86_64_32S: // CHECK-NEXT: R_X86_64_32S: -// CHECK-NEXT: {{.*}}: {{.*}} movq -978935, %rdx +// CHECK-NEXT: {{.*}}: {{.*}} movq -974839, %rdx .section .R_X86_64_PC32,"ax",@progbits .global R_X86_64_PC32 R_X86_64_PC32: call bar -// 0x16000 - (0x11019 + 5) = 20450 +// 0x12020 - (0x12017 + 5) = 4 // CHECK: Disassembly of section .R_X86_64_PC32: // CHECK-NEXT: R_X86_64_PC32: -// CHECK-NEXT: 11019: e8 e2 4f 00 00 callq 20450 +// CHECK-NEXT: 12017: e8 04 00 00 00 callq 4 .section .R_X86_64_64,"a",@progbits .global R_X86_64_64 @@ -86,14 +86,14 @@ R_X86_64_64: .quad R_X86_64_64 // CHECK: Contents of section .R_X86_64_64: -// CHECK-NEXT: 12000 00200100 00000000 +// CHECK-NEXT: 11000 00100100 00000000 .section .R_X86_64_GOTPCREL,"a",@progbits .global R_X86_64_GOTPCREL R_X86_64_GOTPCREL: .long R_X86_64_GOTPCREL@gotpcrel -// 0x15008 - 0x12008 = 12288 -// 12288 = 0x00300000 in little endian +// 0x130A8 - 0x11008 = 8352 +// 8352 = 0x80200000 in little endian // CHECK: Contents of section .R_X86_64_GOTPCREL -// CHECK-NEXT: 12008 00300000 +// CHECK-NEXT: 11008 a0200000 diff --git a/lld/test/elf2/section-layout.s b/lld/test/elf2/section-layout.s new file mode 100644 index 000000000000..24cb94807f0d --- /dev/null +++ b/lld/test/elf2/section-layout.s @@ -0,0 +1,28 @@ +# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t +# RUN: lld -flavor gnu2 %t -o %tout +# RUN: llvm-readobj -sections %tout | FileCheck %s +# REQUIRES: x86 + +# Check that sections are laid out in the correct order. + +.global _start +.text +_start: + +.section h,"" +.section g,"",@nobits +.section f,"aw",@nobits +.section e,"aw" +.section d,"ax",@nobits +.section c,"ax" +.section b,"a",@nobits +.section a,"a" + +// CHECK: Name: a +// CHECK: Name: b +// CHECK: Name: c +// CHECK: Name: d +// CHECK: Name: e +// CHECK: Name: f +// CHECK: Name: h +// CHECK: Name: g diff --git a/lld/test/elf2/shared.s b/lld/test/elf2/shared.s index dcda240ee105..6d0224966741 100644 --- a/lld/test/elf2/shared.s +++ b/lld/test/elf2/shared.s @@ -14,7 +14,7 @@ // SO-NEXT: Flags [ // SO-NEXT: ] // SO-NEXT: Address: -// SO-NEXT: Offset: 0x300C +// SO-NEXT: Offset: 0x2030 // SO-NEXT: Size: // SO-NEXT: Link: // SO-NEXT: Info: @@ -39,14 +39,14 @@ // CHECK-NEXT: } // test that .hash is linked to .dynsym -// CHECK: Index: 5 +// CHECK: Index: 2 // CHECK-NEXT: Name: .dynsym // CHECK-NEXT: Type: SHT_DYNSYM // CHECK-NEXT: Flags [ // CHECK-NEXT: SHF_ALLOC // CHECK-NEXT: ] // CHECK-NEXT: Address: [[DYNSYMADDR:.*]] -// CHECK-NEXT: Offset: 0x201C +// CHECK-NEXT: Offset: 0x101C // CHECK-NEXT: Size: // CHECK-NEXT: Link: [[DYNSTR:.*]] // CHECK-NEXT: Info: 1 @@ -60,7 +60,7 @@ // CHECK-NEXT: ) // CHECK-NEXT: } // CHECK-NEXT: Section { -// CHECK-NEXT: Index: 6 +// CHECK-NEXT: Index: 3 // CHECK-NEXT: Name: .hash // CHECK-NEXT: Type: SHT_HASH // CHECK-NEXT: Flags [ @@ -69,29 +69,11 @@ // CHECK-NEXT: Address: [[HASHADDR:.*]] // CHECK-NEXT: Offset: // CHECK-NEXT: Size: -// CHECK-NEXT: Link: 5 +// CHECK-NEXT: Link: 2 // CHECK-NEXT: Info: 0 // CHECK-NEXT: AddressAlignment: 4 // CHECK-NEXT: EntrySize: 4 - -// CHECK: Name: .dynamic -// CHECK-NEXT: Type: SHT_DYNAMIC -// CHECK-NEXT: Flags [ -// CHECK-NEXT: SHF_ALLOC -// CHECK-NEXT: SHF_WRITE -// CHECK-NEXT: ] -// CHECK-NEXT: Address: [[ADDR:.*]] -// CHECK-NEXT: Offset: [[OFFSET:.*]] -// CHECK-NEXT: Size: [[SIZE:.*]] -// CHECK-NEXT: Link: [[DYNSTR]] -// CHECK-NEXT: Info: 0 -// CHECK-NEXT: AddressAlignment: [[ALIGN:.*]] -// CHECK-NEXT: EntrySize: 8 -// CHECK-NEXT: SectionData ( -// CHECK: ) -// CHECK-NEXT: } - // CHECK: Index: [[DYNSTR]] // CHECK-NEXT: Name: .dynstr // CHECK-NEXT: Type: SHT_STRTAB @@ -122,6 +104,23 @@ // CHECK-NEXT: AddressAlignment: // CHECK-NEXT: EntrySize: [[RELENT:.*]] +// CHECK: Name: .dynamic +// CHECK-NEXT: Type: SHT_DYNAMIC +// CHECK-NEXT: Flags [ +// CHECK-NEXT: SHF_ALLOC +// CHECK-NEXT: SHF_WRITE +// CHECK-NEXT: ] +// CHECK-NEXT: Address: [[ADDR:.*]] +// CHECK-NEXT: Offset: [[OFFSET:.*]] +// CHECK-NEXT: Size: [[SIZE:.*]] +// CHECK-NEXT: Link: [[DYNSTR]] +// CHECK-NEXT: Info: 0 +// CHECK-NEXT: AddressAlignment: [[ALIGN:.*]] +// CHECK-NEXT: EntrySize: 8 +// CHECK-NEXT: SectionData ( +// CHECK: ) +// CHECK-NEXT: } + // CHECK: Name: .symtab // CHECK-NEXT: Type: SHT_SYMTAB // CHECK-NEXT: Flags [ @@ -146,7 +145,7 @@ // CHECK-NEXT: } // CHECK-NEXT: Symbol { // CHECK-NEXT: Name: _start -// CHECK-NEXT: Value: 0x11000 +// CHECK-NEXT: Value: 0x12000 // CHECK-NEXT: Size: 0 // CHECK-NEXT: Binding: Global // CHECK-NEXT: Type: None @@ -185,7 +184,7 @@ // CHECK-NEXT: } // CHECK-NEXT: Symbol { // CHECK-NEXT: Name: _start@ -// CHECK-NEXT: Value: 0x11000 +// CHECK-NEXT: Value: 0x12000 // CHECK-NEXT: Size: 0 // CHECK-NEXT: Binding: Global // CHECK-NEXT: Type: Non diff --git a/lld/test/elf2/symbols.s b/lld/test/elf2/symbols.s index 607048d0407a..27e6fb7d16be 100644 --- a/lld/test/elf2/symbols.s +++ b/lld/test/elf2/symbols.s @@ -45,15 +45,12 @@ hidden: .internal internal internal: -// CHECK: Name: .bss +// CHECK: Name: foobar // CHECK-NEXT: Type: SHT_NOBITS // CHECK-NEXT: Flags [ // CHECK-NEXT: SHF_ALLOC -// CHECK-NEXT: SHF_WRITE // CHECK-NEXT: ] // CHECK-NEXT: Address: 0x11000 -// CHECK-NEXT: Offset: 0x1000 -// CHECK-NEXT: Size: 4 // CHECK: Name: .text // CHECK-NEXT: Type: SHT_PROGBITS @@ -63,12 +60,15 @@ internal: // CHECK-NEXT: ] // CHECK-NEXT: Address: 0x12000 -// CHECK: Name: foobar +// CHECK: Name: .bss // CHECK-NEXT: Type: SHT_NOBITS // CHECK-NEXT: Flags [ // CHECK-NEXT: SHF_ALLOC +// CHECK-NEXT: SHF_WRITE // CHECK-NEXT: ] // CHECK-NEXT: Address: 0x13000 +// CHECK-NEXT: Offset: 0x2000 +// CHECK-NEXT: Size: 4 // CHECK: Symbols [ // CHECK-NEXT: Symbol { @@ -109,7 +109,7 @@ internal: // CHECK-NEXT: } // CHECK-NEXT: Symbol { // CHECK-NEXT: Name: common -// CHECK-NEXT: Value: 0x11000 +// CHECK-NEXT: Value: 0x13000 // CHECK-NEXT: Size: 4 // CHECK-NEXT: Binding: Global // CHECK-NEXT: Type: Object @@ -127,7 +127,7 @@ internal: // CHECK-NEXT: } // CHECK-NEXT: Symbol { // CHECK-NEXT: Name: protected -// CHECK-NEXT: Value: 0x13008 +// CHECK-NEXT: Value: 0x11008 // CHECK-NEXT: Size: 0 // CHECK-NEXT: Binding: Global // CHECK-NEXT: Type: None @@ -136,7 +136,7 @@ internal: // CHECK-NEXT: } // CHECK-NEXT: Symbol { // CHECK-NEXT: Name: zed -// CHECK-NEXT: Value: 0x13000 +// CHECK-NEXT: Value: 0x11000 // CHECK-NEXT: Size: 0 // CHECK-NEXT: Binding: Global (0x1) // CHECK-NEXT: Type: None @@ -145,7 +145,7 @@ internal: // CHECK-NEXT: } // CHECK-NEXT: Symbol { // CHECK-NEXT: Name: zed2 -// CHECK-NEXT: Value: 0x13004 +// CHECK-NEXT: Value: 0x11004 // CHECK-NEXT: Size: 0 // CHECK-NEXT: Binding: Global // CHECK-NEXT: Type: None @@ -154,7 +154,7 @@ internal: // CHECK-NEXT: } // CHECK-NEXT: Symbol { // CHECK-NEXT: Name: zed3 -// CHECK-NEXT: Value: 0x13008 +// CHECK-NEXT: Value: 0x11008 // CHECK-NEXT: Size: 4 // CHECK-NEXT: Binding: Global // CHECK-NEXT: Type: None