forked from OSchip/llvm-project
ELF: Create a string table.
For now only the sections are in it, but it already makes the output easier to read and test. llvm-svn: 244702
This commit is contained in:
parent
4f89fdad9f
commit
6b83b90b6a
|
|
@ -15,6 +15,7 @@ add_llvm_library(lldELF2
|
|||
LINK_COMPONENTS
|
||||
Object
|
||||
Option
|
||||
MC
|
||||
Support
|
||||
)
|
||||
|
||||
|
|
|
|||
|
|
@ -12,7 +12,9 @@
|
|||
#include "Error.h"
|
||||
#include "SymbolTable.h"
|
||||
#include "Writer.h"
|
||||
|
||||
#include "llvm/ADT/DenseMap.h"
|
||||
#include "llvm/MC/StringTableBuilder.h"
|
||||
#include "llvm/Support/FileOutputBuffer.h"
|
||||
|
||||
using namespace llvm;
|
||||
|
|
@ -41,6 +43,8 @@ public:
|
|||
void addSectionChunk(SectionChunk<ELFT> *C);
|
||||
std::vector<Chunk *> &getChunks() { return Chunks; }
|
||||
void writeHeaderTo(Elf_Shdr *SHdr);
|
||||
StringRef getName() { return Name; }
|
||||
void setNameOffset(uintX_t Offset) { Header.sh_name = Offset; }
|
||||
|
||||
// Returns the size of the section in the output file.
|
||||
uintX_t getSize() { return Header.sh_size; }
|
||||
|
|
@ -73,6 +77,10 @@ private:
|
|||
uintX_t FileSize;
|
||||
uintX_t SizeOfHeaders;
|
||||
uintX_t SectionHeaderOff;
|
||||
uintX_t StringTableOff;
|
||||
unsigned StringTableIndex;
|
||||
StringTableBuilder StrTabBuilder;
|
||||
unsigned NumSections;
|
||||
|
||||
std::vector<std::unique_ptr<Chunk>> Chunks;
|
||||
};
|
||||
|
|
@ -160,10 +168,26 @@ template <class ELFT> void Writer<ELFT>::assignAddresses() {
|
|||
Sec->setFileOffset(FileOff);
|
||||
VA += RoundUpToAlignment(Sec->getSize(), PageSize);
|
||||
FileOff += RoundUpToAlignment(Sec->getSize(), 8);
|
||||
StrTabBuilder.add(Sec->getName());
|
||||
}
|
||||
|
||||
// Regular sections.
|
||||
NumSections = OutputSections.size();
|
||||
|
||||
// First dummy section.
|
||||
NumSections++;
|
||||
|
||||
// String table.
|
||||
StrTabBuilder.add(".strtab");
|
||||
StringTableIndex = NumSections;
|
||||
StringTableOff = FileOff;
|
||||
StrTabBuilder.finalize(StringTableBuilder::ELF);
|
||||
FileOff += StrTabBuilder.data().size();
|
||||
NumSections++;
|
||||
|
||||
// Add space for section headers.
|
||||
SectionHeaderOff = FileOff;
|
||||
FileOff += (OutputSections.size() + 1) * sizeof(Elf_Shdr_Impl<ELFT>);
|
||||
FileOff += NumSections * sizeof(Elf_Shdr_Impl<ELFT>);
|
||||
FileSize = SizeOfHeaders + RoundUpToAlignment(FileOff - SizeOfHeaders, 8);
|
||||
}
|
||||
|
||||
|
|
@ -192,8 +216,8 @@ template <class ELFT> void Writer<ELFT>::writeHeader() {
|
|||
EHdr->e_phentsize = sizeof(Elf_Phdr_Impl<ELFT>);
|
||||
EHdr->e_phnum = 1;
|
||||
EHdr->e_shentsize = sizeof(Elf_Shdr_Impl<ELFT>);
|
||||
EHdr->e_shnum = OutputSections.size() + 1;
|
||||
EHdr->e_shstrndx = 0;
|
||||
EHdr->e_shnum = NumSections;
|
||||
EHdr->e_shstrndx = StringTableIndex;
|
||||
|
||||
auto PHdrs = reinterpret_cast<Elf_Phdr_Impl<ELFT> *>(Buf + EHdr->e_phoff);
|
||||
PHdrs->p_type = PT_LOAD;
|
||||
|
|
@ -208,8 +232,22 @@ template <class ELFT> void Writer<ELFT>::writeHeader() {
|
|||
auto SHdrs = reinterpret_cast<Elf_Shdr_Impl<ELFT> *>(Buf + EHdr->e_shoff);
|
||||
// First entry is null.
|
||||
++SHdrs;
|
||||
for (OutputSection<ELFT> *Sec : OutputSections)
|
||||
for (OutputSection<ELFT> *Sec : OutputSections) {
|
||||
Sec->setNameOffset(StrTabBuilder.getOffset(Sec->getName()));
|
||||
Sec->writeHeaderTo(SHdrs++);
|
||||
}
|
||||
|
||||
// String table.
|
||||
SHdrs->sh_name = StrTabBuilder.getOffset(".strtab");
|
||||
SHdrs->sh_type = SHT_STRTAB;
|
||||
SHdrs->sh_flags = 0;
|
||||
SHdrs->sh_addr = 0;
|
||||
SHdrs->sh_offset = StringTableOff;
|
||||
SHdrs->sh_size = StrTabBuilder.data().size();
|
||||
SHdrs->sh_link = 0;
|
||||
SHdrs->sh_info = 0;
|
||||
SHdrs->sh_addralign = 1;
|
||||
SHdrs->sh_entsize = 0;
|
||||
}
|
||||
|
||||
template <class ELFT> void Writer<ELFT>::openFile(StringRef Path) {
|
||||
|
|
@ -225,4 +263,8 @@ template <class ELFT> void Writer<ELFT>::writeSections() {
|
|||
for (Chunk *C : Sec->getChunks())
|
||||
C->writeTo(Buf);
|
||||
}
|
||||
|
||||
// String table.
|
||||
StringRef Data = StrTabBuilder.data();
|
||||
memcpy(Buf + StringTableOff, Data.data(), Data.size());
|
||||
}
|
||||
|
|
|
|||
|
|
@ -25,15 +25,15 @@ _start:
|
|||
# CHECK-NEXT: Version: 1
|
||||
# CHECK-NEXT: Entry: 0x401000
|
||||
# CHECK-NEXT: ProgramHeaderOffset: 0x40
|
||||
# CHECK-NEXT: SectionHeaderOffset: 0x1010
|
||||
# CHECK-NEXT: SectionHeaderOffset: 0x102A
|
||||
# CHECK-NEXT: Flags [ (0x0)
|
||||
# CHECK-NEXT: ]
|
||||
# CHECK-NEXT: HeaderSize: 64
|
||||
# CHECK-NEXT: ProgramHeaderEntrySize: 56
|
||||
# CHECK-NEXT: ProgramHeaderCount: 1
|
||||
# CHECK-NEXT: SectionHeaderEntrySize: 64
|
||||
# CHECK-NEXT: SectionHeaderCount: 4
|
||||
# CHECK-NEXT: StringTableSectionIndex: 0
|
||||
# CHECK-NEXT: SectionHeaderCount: 5
|
||||
# CHECK-NEXT: StringTableSectionIndex: 4
|
||||
# CHECK-NEXT: }
|
||||
# CHECK-NEXT: Sections [
|
||||
# CHECK-NEXT: Section {
|
||||
|
|
@ -52,7 +52,7 @@ _start:
|
|||
# CHECK-NEXT: }
|
||||
# CHECK-NEXT: Section {
|
||||
# CHECK-NEXT: Index: 1
|
||||
# CHECK-NEXT: Name: (0)
|
||||
# CHECK-NEXT: Name: .text
|
||||
# CHECK-NEXT: Type: SHT_PROGBITS (0x1)
|
||||
# CHECK-NEXT: Flags [ (0x6)
|
||||
# CHECK-NEXT: SHF_ALLOC (0x2)
|
||||
|
|
@ -68,7 +68,7 @@ _start:
|
|||
# CHECK-NEXT: }
|
||||
# CHECK-NEXT: Section {
|
||||
# CHECK-NEXT: Index: 2
|
||||
# CHECK-NEXT: Name: (0)
|
||||
# CHECK-NEXT: Name: .data
|
||||
# CHECK-NEXT: Type: SHT_PROGBITS (0x1)
|
||||
# CHECK-NEXT: Flags [ (0x3)
|
||||
# CHECK-NEXT: SHF_ALLOC (0x2)
|
||||
|
|
@ -84,7 +84,7 @@ _start:
|
|||
# CHECK-NEXT: }
|
||||
# CHECK-NEXT: Section {
|
||||
# CHECK-NEXT: Index: 3
|
||||
# CHECK-NEXT: Name: (0)
|
||||
# CHECK-NEXT: Name: .bss
|
||||
# CHECK-NEXT: Type: SHT_NOBITS (0x8)
|
||||
# CHECK-NEXT: Flags [ (0x3)
|
||||
# CHECK-NEXT: SHF_ALLOC (0x2)
|
||||
|
|
@ -98,6 +98,20 @@ _start:
|
|||
# CHECK-NEXT: AddressAlignment: 0
|
||||
# CHECK-NEXT: EntrySize: 0
|
||||
# CHECK-NEXT: }
|
||||
# CHECK-NEXT: Section {
|
||||
# CHECK-NEXT: Index: 4
|
||||
# CHECK-NEXT: Name: .strtab (12)
|
||||
# CHECK-NEXT: Type: SHT_STRTAB (0x3)
|
||||
# CHECK-NEXT: Flags [ (0x0)
|
||||
# CHECK-NEXT: ]
|
||||
# CHECK-NEXT: Address: 0x0
|
||||
# CHECK-NEXT: Offset: 0x1010
|
||||
# CHECK-NEXT: Size: 26
|
||||
# CHECK-NEXT: Link: 0
|
||||
# CHECK-NEXT: Info: 0
|
||||
# CHECK-NEXT: AddressAlignment: 1
|
||||
# CHECK-NEXT: EntrySize: 0
|
||||
# CHECK-NEXT: }
|
||||
# CHECK-NEXT: ]
|
||||
# CHECK-NEXT: ProgramHeaders [
|
||||
# CHECK-NEXT: ProgramHeader {
|
||||
|
|
@ -105,8 +119,8 @@ _start:
|
|||
# CHECK-NEXT: Offset: 0x0
|
||||
# CHECK-NEXT: VirtualAddress: 0x400000
|
||||
# CHECK-NEXT: PhysicalAddress: 0x400000
|
||||
# CHECK-NEXT: FileSize: 4368
|
||||
# CHECK-NEXT: MemSize: 4368
|
||||
# CHECK-NEXT: FileSize: 4464
|
||||
# CHECK-NEXT: MemSize: 4464
|
||||
# CHECK-NEXT: Flags [ (0x5)
|
||||
# CHECK-NEXT: PF_R (0x4)
|
||||
# CHECK-NEXT: PF_X (0x1)
|
||||
|
|
|
|||
|
|
@ -25,15 +25,15 @@ _start:
|
|||
# CHECK-NEXT: Version: 1
|
||||
# CHECK-NEXT: Entry: 0x401000
|
||||
# CHECK-NEXT: ProgramHeaderOffset: 0x34
|
||||
# CHECK-NEXT: SectionHeaderOffset: 0x1010
|
||||
# CHECK-NEXT: SectionHeaderOffset: 0x102A
|
||||
# CHECK-NEXT: Flags [ (0x0)
|
||||
# CHECK-NEXT: ]
|
||||
# CHECK-NEXT: HeaderSize: 52
|
||||
# CHECK-NEXT: ProgramHeaderEntrySize: 32
|
||||
# CHECK-NEXT: ProgramHeaderCount: 1
|
||||
# CHECK-NEXT: SectionHeaderEntrySize: 40
|
||||
# CHECK-NEXT: SectionHeaderCount: 4
|
||||
# CHECK-NEXT: StringTableSectionIndex: 0
|
||||
# CHECK-NEXT: SectionHeaderCount: 5
|
||||
# CHECK-NEXT: StringTableSectionIndex: 4
|
||||
# CHECK-NEXT: }
|
||||
# CHECK-NEXT: Sections [
|
||||
# CHECK-NEXT: Section {
|
||||
|
|
@ -52,7 +52,7 @@ _start:
|
|||
# CHECK-NEXT: }
|
||||
# CHECK-NEXT: Section {
|
||||
# CHECK-NEXT: Index: 1
|
||||
# CHECK-NEXT: Name: (0)
|
||||
# CHECK-NEXT: Name: .text
|
||||
# CHECK-NEXT: Type: SHT_PROGBITS (0x1)
|
||||
# CHECK-NEXT: Flags [ (0x6)
|
||||
# CHECK-NEXT: SHF_ALLOC (0x2)
|
||||
|
|
@ -68,7 +68,7 @@ _start:
|
|||
# CHECK-NEXT: }
|
||||
# CHECK-NEXT: Section {
|
||||
# CHECK-NEXT: Index: 2
|
||||
# CHECK-NEXT: Name: (0)
|
||||
# CHECK-NEXT: Name: .data
|
||||
# CHECK-NEXT: Type: SHT_PROGBITS (0x1)
|
||||
# CHECK-NEXT: Flags [ (0x3)
|
||||
# CHECK-NEXT: SHF_ALLOC (0x2)
|
||||
|
|
@ -84,7 +84,7 @@ _start:
|
|||
# CHECK-NEXT: }
|
||||
# CHECK-NEXT: Section {
|
||||
# CHECK-NEXT: Index: 3
|
||||
# CHECK-NEXT: Name: (0)
|
||||
# CHECK-NEXT: Name: .bss
|
||||
# CHECK-NEXT: Type: SHT_NOBITS (0x8)
|
||||
# CHECK-NEXT: Flags [ (0x3)
|
||||
# CHECK-NEXT: SHF_ALLOC (0x2)
|
||||
|
|
@ -98,6 +98,20 @@ _start:
|
|||
# CHECK-NEXT: AddressAlignment: 0
|
||||
# CHECK-NEXT: EntrySize: 0
|
||||
# CHECK-NEXT: }
|
||||
# CHECK-NEXT: Section {
|
||||
# CHECK-NEXT: Index: 4
|
||||
# CHECK-NEXT: Name: .strtab
|
||||
# CHECK-NEXT: Type: SHT_STRTAB (0x3)
|
||||
# CHECK-NEXT: Flags [ (0x0)
|
||||
# CHECK-NEXT: ]
|
||||
# CHECK-NEXT: Address: 0x0
|
||||
# CHECK-NEXT: Offset: 0x1010
|
||||
# CHECK-NEXT: Size: 26
|
||||
# CHECK-NEXT: Link: 0
|
||||
# CHECK-NEXT: Info: 0
|
||||
# CHECK-NEXT: AddressAlignment: 1
|
||||
# CHECK-NEXT: EntrySize: 0
|
||||
# CHECK-NEXT: }
|
||||
# CHECK-NEXT: ]
|
||||
# CHECK-NEXT: ProgramHeaders [
|
||||
# CHECK-NEXT: ProgramHeader {
|
||||
|
|
@ -105,8 +119,8 @@ _start:
|
|||
# CHECK-NEXT: Offset: 0x0
|
||||
# CHECK-NEXT: VirtualAddress: 0x400000
|
||||
# CHECK-NEXT: PhysicalAddress: 0x400000
|
||||
# CHECK-NEXT: FileSize: 4272
|
||||
# CHECK-NEXT: MemSize: 4272
|
||||
# CHECK-NEXT: FileSize: 4344
|
||||
# CHECK-NEXT: MemSize: 4344
|
||||
# CHECK-NEXT: Flags [ (0x5)
|
||||
# CHECK-NEXT: PF_R (0x4)
|
||||
# CHECK-NEXT: PF_X (0x1)
|
||||
|
|
|
|||
|
|
@ -25,15 +25,15 @@ _start:
|
|||
# CHECK-NEXT: Version: 1
|
||||
# CHECK-NEXT: Entry: 0x401000
|
||||
# CHECK-NEXT: ProgramHeaderOffset: 0x34
|
||||
# CHECK-NEXT: SectionHeaderOffset: 0x1010
|
||||
# CHECK-NEXT: SectionHeaderOffset: 0x102A
|
||||
# CHECK-NEXT: Flags [ (0x0)
|
||||
# CHECK-NEXT: ]
|
||||
# CHECK-NEXT: HeaderSize: 52
|
||||
# CHECK-NEXT: ProgramHeaderEntrySize: 32
|
||||
# CHECK-NEXT: ProgramHeaderCount: 1
|
||||
# CHECK-NEXT: SectionHeaderEntrySize: 40
|
||||
# CHECK-NEXT: SectionHeaderCount: 4
|
||||
# CHECK-NEXT: StringTableSectionIndex: 0
|
||||
# CHECK-NEXT: SectionHeaderCount: 5
|
||||
# CHECK-NEXT: StringTableSectionIndex: 4
|
||||
# CHECK-NEXT: }
|
||||
# CHECK-NEXT: Sections [
|
||||
# CHECK-NEXT: Section {
|
||||
|
|
@ -52,7 +52,7 @@ _start:
|
|||
# CHECK-NEXT: }
|
||||
# CHECK-NEXT: Section {
|
||||
# CHECK-NEXT: Index: 1
|
||||
# CHECK-NEXT: Name: (0)
|
||||
# CHECK-NEXT: Name: .text
|
||||
# CHECK-NEXT: Type: SHT_PROGBITS (0x1)
|
||||
# CHECK-NEXT: Flags [ (0x6)
|
||||
# CHECK-NEXT: SHF_ALLOC (0x2)
|
||||
|
|
@ -68,7 +68,7 @@ _start:
|
|||
# CHECK-NEXT: }
|
||||
# CHECK-NEXT: Section {
|
||||
# CHECK-NEXT: Index: 2
|
||||
# CHECK-NEXT: Name: (0)
|
||||
# CHECK-NEXT: Name: .data
|
||||
# CHECK-NEXT: Type: SHT_PROGBITS (0x1)
|
||||
# CHECK-NEXT: Flags [ (0x3)
|
||||
# CHECK-NEXT: SHF_ALLOC (0x2)
|
||||
|
|
@ -84,7 +84,7 @@ _start:
|
|||
# CHECK-NEXT: }
|
||||
# CHECK-NEXT: Section {
|
||||
# CHECK-NEXT: Index: 3
|
||||
# CHECK-NEXT: Name: (0)
|
||||
# CHECK-NEXT: Name: .bss
|
||||
# CHECK-NEXT: Type: SHT_NOBITS (0x8)
|
||||
# CHECK-NEXT: Flags [ (0x3)
|
||||
# CHECK-NEXT: SHF_ALLOC (0x2)
|
||||
|
|
@ -98,6 +98,20 @@ _start:
|
|||
# CHECK-NEXT: AddressAlignment: 0
|
||||
# CHECK-NEXT: EntrySize: 0
|
||||
# CHECK-NEXT: }
|
||||
# CHECK-NEXT: Section {
|
||||
# CHECK-NEXT: Index: 4
|
||||
# CHECK-NEXT: Name: .strtab
|
||||
# CHECK-NEXT: Type: SHT_STRTAB (0x3)
|
||||
# CHECK-NEXT: Flags [ (0x0)
|
||||
# CHECK-NEXT: ]
|
||||
# CHECK-NEXT: Address: 0x0
|
||||
# CHECK-NEXT: Offset: 0x1010
|
||||
# CHECK-NEXT: Size: 26
|
||||
# CHECK-NEXT: Link: 0
|
||||
# CHECK-NEXT: Info: 0
|
||||
# CHECK-NEXT: AddressAlignment: 1
|
||||
# CHECK-NEXT: EntrySize: 0
|
||||
# CHECK-NEXT: }
|
||||
# CHECK-NEXT: ]
|
||||
# CHECK-NEXT: ProgramHeaders [
|
||||
# CHECK-NEXT: ProgramHeader {
|
||||
|
|
@ -105,8 +119,8 @@ _start:
|
|||
# CHECK-NEXT: Offset: 0x0
|
||||
# CHECK-NEXT: VirtualAddress: 0x400000
|
||||
# CHECK-NEXT: PhysicalAddress: 0x400000
|
||||
# CHECK-NEXT: FileSize: 4272
|
||||
# CHECK-NEXT: MemSize: 4272
|
||||
# CHECK-NEXT: FileSize: 4344
|
||||
# CHECK-NEXT: MemSize: 4344
|
||||
# CHECK-NEXT: Flags [ (0x5)
|
||||
# CHECK-NEXT: PF_R (0x4)
|
||||
# CHECK-NEXT: PF_X (0x1)
|
||||
|
|
|
|||
|
|
@ -30,15 +30,15 @@ _start:
|
|||
# CHECK-NEXT: Version: 1
|
||||
# CHECK-NEXT: Entry: 0x401000
|
||||
# CHECK-NEXT: ProgramHeaderOffset: 0x40
|
||||
# CHECK-NEXT: SectionHeaderOffset: 0x1028
|
||||
# CHECK-NEXT: SectionHeaderOffset: 0x1047
|
||||
# CHECK-NEXT: Flags [ (0x0)
|
||||
# CHECK-NEXT: ]
|
||||
# CHECK-NEXT: HeaderSize: 64
|
||||
# CHECK-NEXT: ProgramHeaderEntrySize: 56
|
||||
# CHECK-NEXT: ProgramHeaderCount: 1
|
||||
# CHECK-NEXT: SectionHeaderEntrySize: 64
|
||||
# CHECK-NEXT: SectionHeaderCount: 5
|
||||
# CHECK-NEXT: StringTableSectionIndex: 0
|
||||
# CHECK-NEXT: SectionHeaderCount: 6
|
||||
# CHECK-NEXT: StringTableSectionIndex: 5
|
||||
# CHECK-NEXT: }
|
||||
# CHECK-NEXT: Sections [
|
||||
# CHECK-NEXT: Section {
|
||||
|
|
@ -57,7 +57,7 @@ _start:
|
|||
# CHECK-NEXT: }
|
||||
# CHECK-NEXT: Section {
|
||||
# CHECK-NEXT: Index: 1
|
||||
# CHECK-NEXT: Name: (0)
|
||||
# CHECK-NEXT: Name: .text
|
||||
# CHECK-NEXT: Type: SHT_PROGBITS (0x1)
|
||||
# CHECK-NEXT: Flags [ (0x6)
|
||||
# CHECK-NEXT: SHF_ALLOC (0x2)
|
||||
|
|
@ -73,7 +73,7 @@ _start:
|
|||
# CHECK-NEXT: }
|
||||
# CHECK-NEXT: Section {
|
||||
# CHECK-NEXT: Index: 2
|
||||
# CHECK-NEXT: Name: (0)
|
||||
# CHECK-NEXT: Name: .data
|
||||
# CHECK-NEXT: Type: SHT_PROGBITS (0x1)
|
||||
# CHECK-NEXT: Flags [ (0x3)
|
||||
# CHECK-NEXT: SHF_ALLOC (0x2)
|
||||
|
|
@ -89,7 +89,7 @@ _start:
|
|||
# CHECK-NEXT: }
|
||||
# CHECK-NEXT: Section {
|
||||
# CHECK-NEXT: Index: 3
|
||||
# CHECK-NEXT: Name: (0)
|
||||
# CHECK-NEXT: Name: .bss
|
||||
# CHECK-NEXT: Type: SHT_NOBITS (0x8)
|
||||
# CHECK-NEXT: Flags [ (0x3)
|
||||
# CHECK-NEXT: SHF_ALLOC (0x2)
|
||||
|
|
@ -105,7 +105,7 @@ _start:
|
|||
# CHECK-NEXT: }
|
||||
# CHECK-NEXT: Section {
|
||||
# CHECK-NEXT: Index: 4
|
||||
# CHECK-NEXT: Name: (0)
|
||||
# CHECK-NEXT: Name: .opd
|
||||
# CHECK-NEXT: Type: SHT_PROGBITS (0x1)
|
||||
# CHECK-NEXT: Flags [ (0x3)
|
||||
# CHECK-NEXT: SHF_ALLOC (0x2)
|
||||
|
|
@ -119,6 +119,20 @@ _start:
|
|||
# CHECK-NEXT: AddressAlignment: 0
|
||||
# CHECK-NEXT: EntrySize: 0
|
||||
# CHECK-NEXT: }
|
||||
# CHECK-NEXT: Section {
|
||||
# CHECK-NEXT: Index: 5
|
||||
# CHECK-NEXT: Name: .strtab
|
||||
# CHECK-NEXT: Type: SHT_STRTAB (0x3)
|
||||
# CHECK-NEXT: Flags [ (0x0)
|
||||
# CHECK-NEXT: ]
|
||||
# CHECK-NEXT: Address: 0x0
|
||||
# CHECK-NEXT: Offset: 0x1028
|
||||
# CHECK-NEXT: Size: 31
|
||||
# CHECK-NEXT: Link: 0
|
||||
# CHECK-NEXT: Info: 0
|
||||
# CHECK-NEXT: AddressAlignment: 1
|
||||
# CHECK-NEXT: EntrySize: 0
|
||||
# CHECK-NEXT: }
|
||||
# CHECK-NEXT: ]
|
||||
# CHECK-NEXT: ProgramHeaders [
|
||||
# CHECK-NEXT: ProgramHeader {
|
||||
|
|
@ -126,8 +140,8 @@ _start:
|
|||
# CHECK-NEXT: Offset: 0x0
|
||||
# CHECK-NEXT: VirtualAddress: 0x400000
|
||||
# CHECK-NEXT: PhysicalAddress: 0x400000
|
||||
# CHECK-NEXT: FileSize: 4456
|
||||
# CHECK-NEXT: MemSize: 4456
|
||||
# CHECK-NEXT: FileSize: 4552
|
||||
# CHECK-NEXT: MemSize: 4552
|
||||
# CHECK-NEXT: Flags [ (0x5)
|
||||
# CHECK-NEXT: PF_R (0x4)
|
||||
# CHECK-NEXT: PF_X (0x1)
|
||||
|
|
|
|||
|
|
@ -0,0 +1,32 @@
|
|||
// RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t
|
||||
// RUN: lld -flavor gnu2 %t -o %t2
|
||||
// RUN: llvm-readobj -sections -section-data %t2 | FileCheck %s
|
||||
// REQUIRES: x86
|
||||
|
||||
.global _start
|
||||
_start:
|
||||
|
||||
.section bar, "a"
|
||||
.section foobar, "a"
|
||||
|
||||
// Test that the sting "bar" is merged into "foobar"
|
||||
|
||||
// CHECK: Section {
|
||||
// CHECK: Index: 6
|
||||
// CHECK-NEXT: Name: .strtab
|
||||
// CHECK-NEXT: Type: SHT_STRTAB (0x3)
|
||||
// CHECK-NEXT: Flags [ (0x0)
|
||||
// CHECK-NEXT: ]
|
||||
// CHECK-NEXT: Address: 0x0
|
||||
// CHECK-NEXT: Offset:
|
||||
// CHECK-NEXT: Size: 33
|
||||
// CHECK-NEXT: Link: 0
|
||||
// CHECK-NEXT: Info: 0
|
||||
// CHECK-NEXT: AddressAlignment: 1
|
||||
// CHECK-NEXT: EntrySize: 0
|
||||
// CHECK-NEXT: SectionData (
|
||||
// CHECK-NEXT: 0000: 002E7465 7874002E 62737300 666F6F62 |..text..bss.foob|
|
||||
// CHECK-NEXT: 0010: 6172002E 73747274 6162002E 64617461 |ar..strtab..data|
|
||||
// CHECK-NEXT: 0020: 00 |.|
|
||||
// CHECK-NEXT: )
|
||||
// CHECK-NEXT: }
|
||||
Loading…
Reference in New Issue