bool buildSectionIndex();
bool buildSymbolIndexes();
- void initELFHeader(Elf_Ehdr &Header);
void initProgramHeaders(std::vector<Elf_Phdr> &PHeaders);
bool initImplicitHeader(ContiguousBlobAccumulator &CBA, Elf_Shdr &Header,
StringRef SecName, ELFYAML::Section *YAMLSec);
void setProgramHeaderLayout(std::vector<Elf_Phdr> &PHeaders,
std::vector<Elf_Shdr> &SHeaders);
void finalizeStrings();
+ void writeELFHeader(ContiguousBlobAccumulator &CBA, raw_ostream &OS);
bool writeSectionContent(Elf_Shdr &SHeader,
const ELFYAML::RawContentSection &Section,
ContiguousBlobAccumulator &CBA);
}
}
-template <class ELFT> void ELFState<ELFT>::initELFHeader(Elf_Ehdr &Header) {
+template <class ELFT>
+void ELFState<ELFT>::writeELFHeader(ContiguousBlobAccumulator &CBA, raw_ostream &OS) {
using namespace llvm::ELF;
+
+ Elf_Ehdr Header;
zero(Header);
Header.e_ident[EI_MAG0] = 0x7f;
Header.e_ident[EI_MAG1] = 'E';
Header.e_shentsize =
Doc.Header.SHEntSize ? (uint16_t)*Doc.Header.SHEntSize : sizeof(Elf_Shdr);
// Immediately following the ELF header and program headers.
- Header.e_shoff =
- Doc.Header.SHOffset
- ? (typename ELFT::uint)(*Doc.Header.SHOffset)
- : sizeof(Header) + sizeof(Elf_Phdr) * Doc.ProgramHeaders.size();
+ // Align the start of the section header and write the ELF header.
+ uint64_t ShOffset;
+ CBA.getOSAndAlignedOffset(ShOffset, sizeof(typename ELFT::uint));
+ Header.e_shoff = Doc.Header.SHOffset
+ ? typename ELFT::uint(*Doc.Header.SHOffset)
+ : ShOffset;
Header.e_shnum =
Doc.Header.SHNum ? (uint16_t)*Doc.Header.SHNum : Doc.Sections.size();
Header.e_shstrndx = Doc.Header.SHStrNdx ? (uint16_t)*Doc.Header.SHStrNdx
: SN2I.get(".shstrtab");
+
+ OS.write((const char *)&Header, sizeof(Header));
}
template <class ELFT>
if (!State.buildSectionIndex() || !State.buildSymbolIndexes())
return 1;
- Elf_Ehdr Header;
- State.initELFHeader(Header);
-
- // TODO: Flesh out section header support.
-
std::vector<Elf_Phdr> PHeaders;
State.initProgramHeaders(PHeaders);
// XXX: This offset is tightly coupled with the order that we write
// things to `OS`.
- const size_t SectionContentBeginOffset = Header.e_ehsize +
- Header.e_phentsize * Header.e_phnum +
- Header.e_shentsize * Header.e_shnum;
+ const size_t SectionContentBeginOffset =
+ sizeof(Elf_Ehdr) + sizeof(Elf_Phdr) * Doc.ProgramHeaders.size();
ContiguousBlobAccumulator CBA(SectionContentBeginOffset);
std::vector<Elf_Shdr> SHeaders;
// Now we can decide segment offsets
State.setProgramHeaderLayout(PHeaders, SHeaders);
- OS.write((const char *)&Header, sizeof(Header));
+ State.writeELFHeader(CBA, OS);
writeArrayData(OS, makeArrayRef(PHeaders));
- writeArrayData(OS, makeArrayRef(SHeaders));
CBA.writeBlobToStream(OS);
+ writeArrayData(OS, makeArrayRef(SHeaders));
return 0;
}
# RUN: yaml2obj %s --docnum=16 -o %t16
# RUN: not llvm-readobj -r %t16 2>&1 | FileCheck -DFILE=%t16 --check-prefix=INVALID-REL-SYM %s
-# INVALID-REL-SYM: error: '[[FILE]]': unable to access section [index 2] data at 0x18000180: offset goes past the end of file
+# INVALID-REL-SYM: error: '[[FILE]]': unable to access section [index 2] data at 0x18000040: offset goes past the end of file
--- !ELF
FileHeader:
# RUN: yaml2obj --docnum=26 %s -o %t26
# RUN: not llvm-readobj -h %t26 2>&1 | FileCheck -DFILE=%t26 --check-prefix=INVALID-SEC-NUM1 %s
-# INVALID-SEC-NUM1: error: '[[FILE]]': invalid section header table offset (e_shoff = 0x40) or invalid number of sections specified in the first section header's sh_size field (0x3ffffffffffffff)
+# INVALID-SEC-NUM1: error: '[[FILE]]': invalid section header table offset (e_shoff = 0x78) or invalid number of sections specified in the first section header's sh_size field (0x3ffffffffffffff)
--- !ELF
FileHeader:
# aren't purely sorting based on offsets (it gets moved to the beginning
# despite having a larger offset).
-# IN: There are 7 section headers, starting at offset 0x40:
+# IN: There are 7 section headers, starting at offset 0x160:
# IN: [Nr] Name Type Address Off Size
# IN-NEXT: [ 0] NULL 0000000000000000 000000 000000
-# IN-NEXT: [ 1] .foo PROGBITS 0000000000000000 000200 000040
-# IN-NEXT: [ 2] .group GROUP 0000000000000000 000240 000008
-# IN-NEXT: [ 3] .bar PROGBITS 0000000000000000 000248 000040
+# IN-NEXT: [ 1] .foo PROGBITS 0000000000000000 000040 000040
+# IN-NEXT: [ 2] .group GROUP 0000000000000000 000080 000008
+# IN-NEXT: [ 3] .bar PROGBITS 0000000000000000 000088 000040
# IN: COMDAT group section [ 2] `.group' [bar] contains 1 sections:
# IN-NEXT: [Index] Name
## Sanity check that the section header table is at offset 64:
# RUN: llvm-readobj --file-headers %t.o | FileCheck %s --check-prefix=VALIDATE
-# VALIDATE: SectionHeaderOffset: 0x40{{$}}
+# VALIDATE: SectionHeaderOffset: 0x80{{$}}
## Truncate the file to end before the section header table ends.
-# RUN: %python -c "with open('%/t.o', 'r+b') as input: input.truncate(65)"
+# RUN: %python -c "with open('%/t.o', 'r+b') as input: input.truncate(0x7f)"
# RUN: not llvm-objcopy %t.o 2>&1 | FileCheck %s -DINPUT=%t.o --check-prefix=CASE1
-# CASE1: error: '[[INPUT]]': section header table goes past the end of the file: e_shoff = 0x40
+# CASE1: error: '[[INPUT]]': section header table goes past the end of the file: e_shoff = 0x80
## Set the e_shoff field to a value much larger than the object file size.
# RUN: %python -c "with open('%/t2.o', 'r+b') as input: import struct; bytes = struct.pack('<Q', 0x40000000); input.seek(40); input.write(bytes)"
# RUN: yaml2obj --docnum=1 %s -o %t1.o
# RUN: not llvm-objcopy %t1.o 2>&1 | FileCheck %s --check-prefix=ERR1
-# ERR1: error: program header with offset 0x1b8 and file size 0x100000 goes past the end of the file
+# ERR1: error: program header with offset 0x78 and file size 0x100000 goes past the end of the file
--- !ELF
FileHeader:
## inputs somehow.
# RUN: yaml2obj %s -o %t.o
-## First, check that the section header table appears immediately after the program
-## header table.
+## First, check the address of the section header table.
# RUN: llvm-readobj --file-headers %t.o | FileCheck %s --check-prefix=SHDRS-OFFSET
-# SHDRS-OFFSET: SectionHeaderOffset: 0x78{{$}}
+# SHDRS-OFFSET: SectionHeaderOffset: 0x1050{{$}}
## Binary edit the section header sh_offset field of the second section to
-## overlap the first one.
-# RUN: %python -c "with open('%/t.o', 'r+b') as input: import struct; bytes = struct.pack('<Q', 0x1001); input.seek(272); input.write(bytes)"
+## (e_shoff+64*2+24 = 0x10e8) overlap the first one.
+# RUN: %python -c "with open('%/t.o', 'r+b') as input: import struct; bytes = struct.pack('<Q', 0x1001); input.seek(0x10e8); input.write(bytes)"
## Sanity check that the binary editing modified the correct field.
# RUN: llvm-readobj --section-headers %t.o | FileCheck %s
## inputs somehow.
# RUN: yaml2obj %s -o %t.o
-## First, check that the section header table appears immediately after the ELF
-## header.
+## First, check the address of the section header table.
# RUN: llvm-readobj --file-headers %t.o | FileCheck %s --check-prefix=SHDRS-OFFSET
-# SHDRS-OFFSET: SectionHeaderOffset: 0x40{{$}}
+# SHDRS-OFFSET: SectionHeaderOffset: 0x1050{{$}}
## Binary edit the section header sh_offset field of the second section to
-## overlap the first one.
-# RUN: %python -c "with open('%/t.o', 'r+b') as input: import struct; bytes = struct.pack('<Q', 0x1001); input.seek(216); input.write(bytes)"
+## (e_shoff+64*2+24 = 0x10e8) overlap the first one.
+# RUN: %python -c "with open('%/t.o', 'r+b') as input: import struct; bytes = struct.pack('<Q', 0x1001); input.seek(0x10e8); input.write(bytes)"
## Sanity check that the binary editing modified the correct field.
# RUN: llvm-readobj --section-headers %t.o | FileCheck %s --check-prefix=VALIDATE
# BEFORE: Type: PT_LOAD
# BEFORE-NEXT: Offset: 0x0
# BEFORE: Type: PT_LOAD
-# BEFORE-NEXT: Offset: 0x240
+# BEFORE-NEXT: Offset: 0xC0
# AFTER: SectionHeaderCount: 3
# AFTER: Type: PT_LOAD
# LLVM-NEXT: SHF_ALLOC
# LLVM-NEXT: ]
# LLVM-NEXT: Address: 0x0
-# LLVM-NEXT: Offset: 0x180
+# LLVM-NEXT: Offset: 0x40
# LLVM-NEXT: Size: 24
# LLVM-NEXT: Link: 0
# GNU: Section Headers:
# GNU-NEXT: [Nr] Name Type Address Off Size ES Flg Lk
# GNU-NEXT: [ 0] NULL 0000000000000000 000000 000000 00 0 0
-# GNU-NEXT: [ 1] .dynsym DYNSYM 0000000000000000 000180 000018 18 A 0
+# GNU-NEXT: [ 1] .dynsym DYNSYM 0000000000000000 000040 000018 18 A 0
--- !ELF
FileHeader:
# LLVM2-NEXT: SHF_ALLOC
# LLVM2-NEXT: ]
# LLVM2-NEXT: Address: 0x0
-# LLVM2-NEXT: Offset: 0x180
+# LLVM2-NEXT: Offset: 0x40
# LLVM2-NEXT: Size: 24
# LLVM2-NEXT: Link: 255
# GNU2: Section Headers:
# GNU2-NEXT: [Nr] Name Type Address Off Size ES Flg Lk
# GNU2-NEXT: [ 0] NULL 0000000000000000 000000 000000 00 0 0
-# GNU2-NEXT: [ 1] .dynsym DYNSYM 0000000000000000 000180 000018 18 A 255
+# GNU2-NEXT: [ 1] .dynsym DYNSYM 0000000000000000 000040 000018 18 A 255
# BAD-RELA-NEXT: 0x0000000000000007 RELA 0x1000000
# BAD-RELA-NEXT: 0x0000000000000000 NULL 0x0
# BAD-RELA-NEXT: ]
-# BAD-RELA-GNU: Dynamic section at offset 0x1f0 contains 2 entries:
+# BAD-RELA-GNU: Dynamic section at offset 0xb0 contains 2 entries:
# BAD-RELA-GNU-NEXT: Tag Type Name/Value
# BAD-RELA-GNU-NEXT: 0x0000000000000007 (RELA) 0x1000000
# BAD-RELA-GNU-NEXT: 0x0000000000000000 (NULL) 0x0
# LLVM-NEXT: 0x0000000000000000 NULL 0x0
# LLVM-NEXT: ]
-# GNU: Dynamic section at offset 0x1b8 contains 1 entries:
+# GNU: Dynamic section at offset 0x78 contains 1 entries:
# GNU-NEXT: Tag Type Name/Value
# GNU-NEXT: 0x0000000000000000 (NULL) 0x0
# I386-NEXT: Version: 1
# I386-NEXT: Entry: 0x0
# I386-NEXT: ProgramHeaderOffset: 0x34
-# I386-NEXT: SectionHeaderOffset: 0x34
+# I386-NEXT: SectionHeaderOffset: 0x64
# I386-NEXT: Flags [ (0x0)
# I386-NEXT: ]
# I386-NEXT: HeaderSize: 52
# X86-64-NEXT: Version: 1
# X86-64-NEXT: Entry: 0x0
# X86-64-NEXT: ProgramHeaderOffset: 0x40
-# X86-64-NEXT: SectionHeaderOffset: 0x40
+# X86-64-NEXT: SectionHeaderOffset: 0x78
# X86-64-NEXT: Flags [ (0x0)
# X86-64-NEXT: ]
# X86-64-NEXT: HeaderSize: 64
# LANAI-NEXT: Version: 1
# LANAI-NEXT: Entry: 0x0
# LANAI-NEXT: ProgramHeaderOffset: 0x34
-# LANAI-NEXT: SectionHeaderOffset: 0x34
+# LANAI-NEXT: SectionHeaderOffset: 0x64
# LANAI-NEXT: Flags [ (0x0)
# LANAI-NEXT: ]
# LANAI-NEXT: HeaderSize: 52
# RUN: llvm-readelf -V %t | FileCheck %s --check-prefix=HIDDEN
# HIDDEN: Version symbols section '.gnu.version' contains 2 entries:
-# HIDDEN-NEXT: Addr: 0000000000200210 Offset: 0x000240 Link: 6 (.dynsym)
+# HIDDEN-NEXT: Addr: 0000000000200210 Offset: 0x000040 Link: 6 (.dynsym)
# HIDDEN-NEXT: 000: 0 (*local*) 3h(hiddensym)
--- !ELF
# GNU: ELF Header:
# GNU: Section header string table index: 255
-# GNU-NEXT: There are 4 section headers, starting at offset 0x40:
+# GNU-NEXT: There are 4 section headers, starting at offset 0x78:
# GNU: Section Headers:
# GNU-NEXT: [Nr] Name
# GNU-EMPTY:
# RUN: llvm-readelf -V %t | FileCheck %s --check-prefix=INVALID
# INVALID: Version symbols section '.gnu.version' contains 2 entries:
-# INVALID-NEXT: Addr: 0000000000200210 Offset: 0x000240 Link: 6 (.dynsym)
+# INVALID-NEXT: Addr: 0000000000200210 Offset: 0x000040 Link: 6 (.dynsym)
# INVALID-NEXT: 000: 0 (*local*) 3 (*invalid*)
--- !ELF
# LLVM-NEXT: AddressSize: 64bit
# LLVM-NEXT: LoadName: test.so
-# GNU: Dynamic section at offset 0x200 contains 4 entries:
+# GNU: Dynamic section at offset 0x80 contains 4 entries:
# GNU-NEXT: Tag Type Name/Value
# GNU-NEXT: 0x0000000000000005 (STRTAB) 0x0
# GNU-NEXT: 0x000000000000000a (STRSZ) 7 (bytes)
# LLVM1-NEXT: }
# RUN: yaml2obj -docnum 1 %s | llvm-readelf -relocations - | FileCheck --check-prefix=GNU1 %s
-# GNU1: Relocation section '.rela.dyn' at offset 0x180 contains 8 entries:
+# GNU1: Relocation section '.rela.dyn' at offset 0x40 contains 8 entries:
# GNU1: 0000000000001100 0000000000000008 R_X86_64_RELATIVE 0
# GNU1-NEXT: 0000000000001180 0000000000000008 R_X86_64_RELATIVE 0
# GNU1-NEXT: 0000000000001188 0000000100000001 R_X86_64_64 0000000000000000 sym1 + 0
# LLVM2-NEXT: }
# RUN: yaml2obj -docnum 2 %s | llvm-readelf -relocations - | FileCheck --check-prefix=GNU2 %s
-# GNU2: Relocation section '.rel.dyn' at offset 0xfc contains 10 entries:
+# GNU2: Relocation section '.rel.dyn' at offset 0x34 contains 10 entries:
# GNU2: 00001008 00000101 R_386_32 00000000 sym1
# GNU2-NEXT: 00001010 00000203 R_386_GOT32 00000000 sym2
# GNU2-NEXT: 0000100c 00000008 R_386_RELATIVE
# LLVM3-NEXT: }
# RUN: yaml2obj -docnum 3 %s | llvm-readelf -relocations - | FileCheck --check-prefix=GNU3 %s
-# GNU3: Relocation section '.rela.dyn' at offset 0x180 contains 6 entries:
+# GNU3: Relocation section '.rela.dyn' at offset 0x40 contains 6 entries:
# GNU3: 0000000000001100 0000000000000008 R_X86_64_RELATIVE 0
# GNU3-NEXT: 0000000000001180 0000000000000008 R_X86_64_RELATIVE 8
# GNU3-NEXT: 0000000000001200 0000000100000001 R_X86_64_64 0000000000000000 sym1 + 0
# RUN: yaml2obj -docnum 1 %s \
# RUN: | llvm-readelf -relocations -raw-relr - \
# RUN: | FileCheck --check-prefix=RAW-GNU1 %s
-# RAW-GNU1: Relocation section '.relr.dyn' at offset 0x180 contains 5 entries:
+# RAW-GNU1: Relocation section '.relr.dyn' at offset 0x40 contains 5 entries:
# RAW-GNU1: 0000000000010d60
# RAW-GNU1-NEXT: 0000000000000103
# RAW-GNU1-NEXT: 0000000000020000
# RUN: yaml2obj -docnum 1 %s \
# RUN: | llvm-readelf -relocations - \
# RUN: | FileCheck --check-prefix=GNU1 %s
-# GNU1: Relocation section '.relr.dyn' at offset 0x180 contains 21 entries:
+# GNU1: Relocation section '.relr.dyn' at offset 0x40 contains 21 entries:
# GNU1: 0000000000010d60 0000000000000008 R_X86_64_RELATIVE
# GNU1-NEXT: 0000000000010d68 0000000000000008 R_X86_64_RELATIVE
# GNU1-NEXT: 0000000000010da0 0000000000000008 R_X86_64_RELATIVE
# RUN: yaml2obj -docnum 2 %s \
# RUN: | llvm-readelf -relocations -raw-relr - \
# RUN: | FileCheck --check-prefix=RAW-GNU2 %s
-# RAW-GNU2: Relocation section '.relr.dyn' at offset 0xfc contains 5 entries:
+# RAW-GNU2: Relocation section '.relr.dyn' at offset 0x34 contains 5 entries:
# RAW-GNU2: 00010d60
# RAW-GNU2-NEXT: 00000103
# RAW-GNU2-NEXT: 00020000
# RUN: yaml2obj -docnum 2 %s \
# RUN: | llvm-readelf -relocations - \
# RUN: | FileCheck --check-prefix=GNU2 %s
-# GNU2: Relocation section '.relr.dyn' at offset 0xfc contains 14 entries:
+# GNU2: Relocation section '.relr.dyn' at offset 0x34 contains 14 entries:
# GNU2: 00010d60 00000008 R_386_RELATIVE
# GNU2-NEXT: 00010d64 00000008 R_386_RELATIVE
# GNU2-NEXT: 00010d80 00000008 R_386_RELATIVE
# LLVM: Version symbols {
# LLVM-NEXT: Section Name: .gnu.version
# LLVM-NEXT: Address: 0x0
-# LLVM-NEXT: Offset: 0x280
+# LLVM-NEXT: Offset: 0x40
# LLVM-NEXT: Link: 7
# LLVM-NEXT: Symbols [
# LLVM-NEXT: Symbol {
# LLVM-NEXT: }
# GNU: Version symbols section '.gnu.version' contains 6 entries:
-# GNU-NEXT: Addr: 0000000000000000 Offset: 0x000280 Link: 7 (.dynsym)
+# GNU-NEXT: Addr: 0000000000000000 Offset: 0x000040 Link: 7 (.dynsym)
# GNU-NEXT: 000: 0 (*local*) 2 (VERSION1) 3 (VERSION2) 4 (v1)
# GNU-NEXT: 004: 5 (v2) 6 (v3)
# GNU-EMPTY:
# GNU-NEXT: Version definition section '.gnu.version_d' contains 3 entries:
-# GNU-NEXT: Addr: 0000000000000000 Offset: 0x00028c Link: 8 (.dynstr)
+# GNU-NEXT: Addr: 0000000000000000 Offset: 0x00004c Link: 8 (.dynstr)
# GNU-NEXT: 0x0000: Rev: 1 Flags: none Index: 2 Cnt: 1 Name: VERSION1
# GNU-NEXT: 0x001c: Rev: 1 Flags: none Index: 3 Cnt: 2 Name: VERSION2
# GNU-NEXT: 0x0038: Parent 1: VERSION1
# GNU-NEXT: 0x0038: Parent 1: VERSION1
# GNU-EMPTY:
# GNU-NEXT: Version needs section '.gnu.version_r' contains 2 entries:
-# GNU-NEXT: Addr: 0000000000000000 Offset: 0x0002cc Link: 8 (.dynstr)
+# GNU-NEXT: Addr: 0000000000000000 Offset: 0x00008c Link: 8 (.dynstr)
# GNU-NEXT: 0x0000: Version: 1 File: verneed1.so.0 Cnt: 2
# GNU-NEXT: 0x0010: Name: v1 Flags: none Version: 4
# GNU-NEXT: 0x0020: Name: v2 Flags: none Version: 5
# GNU: Section Headers:
# GNU: [Nr] Name Type Address Off Size ES Flg Lk Inf Al
# GNU: warning: '[[FILE]]': invalid sh_type for string table section [index 1]: expected SHT_STRTAB, but got SHT_PROGBITS
-# GNU: [ 1] .shstrtab PROGBITS 0000000000000000 000140 00001b 00 0 0 0
+# GNU: [ 1] .shstrtab PROGBITS 0000000000000000 000040 00001b 00 0 0 0
## Test we report multiple identical warnings (one for each object) when dumping an archive.
# RUN: llvm-readelf --notes %t1.stripped.so | FileCheck %s --check-prefix=GNU-STRIPPED --strict-whitespace --match-full-lines
# RUN: llvm-readobj --notes %t1.stripped.so | FileCheck %s --check-prefix=LLVM-STRIPPED
-# GNU:Displaying notes found at file offset 0x00000238 with length 0x00000020:
+# GNU:Displaying notes found at file offset 0x00000078 with length 0x00000020:
# GNU-NEXT: Owner Data size Description
# GNU-NEXT: GNU 0x00000010 NT_GNU_ABI_TAG (ABI version tag)
# GNU-NEXT: OS: Linux, ABI: 2.6.32
-# GNU:Displaying notes found at file offset 0x00000258 with length 0x00000020:
+# GNU:Displaying notes found at file offset 0x00000098 with length 0x00000020:
# GNU-NEXT: Owner Data size Description
# GNU-NEXT: GNU 0x00000010 NT_GNU_BUILD_ID (unique build ID bitstring)
# GNU-NEXT: Build ID: 4fcb712aa6387724a9f465a32cd8c14b
-# GNU:Displaying notes found at file offset 0x00000278 with length 0x0000001c:
+# GNU:Displaying notes found at file offset 0x000000b8 with length 0x0000001c:
# GNU-NEXT: Owner Data size Description
# GNU-NEXT: GNU 0x00000009 NT_GNU_GOLD_VERSION (gold version)
# GNU-NEXT: Version: gold 1.11
# LLVM: Notes [
# LLVM-NEXT: NoteSection {
-# LLVM-NEXT: Offset: 0x238
+# LLVM-NEXT: Offset: 0x78
# LLVM-NEXT: Size: 0x20
# LLVM-NEXT: Note {
# LLVM-NEXT: Owner: GNU
# LLVM-NEXT: }
# LLVM-NEXT: }
# LLVM-NEXT: NoteSection {
-# LLVM-NEXT: Offset: 0x258
+# LLVM-NEXT: Offset: 0x98
# LLVM-NEXT: Size: 0x20
# LLVM-NEXT: Note {
# LLVM-NEXT: Owner: GNU
# LLVM-NEXT: }
# LLVM-NEXT: }
# LLVM-NEXT: NoteSection {
-# LLVM-NEXT: Offset: 0x278
+# LLVM-NEXT: Offset: 0xB8
# LLVM-NEXT: Size: 0x1C
# LLVM-NEXT: Note {
# LLVM-NEXT: Owner: GNU
# RUN: not llvm-readelf --notes %t3.so 2>&1 | FileCheck -DFILE=%t3.so %s --check-prefix=ERR2
# RUN: not llvm-readobj --notes %t3.so 2>&1 | FileCheck -DFILE=%t3.so %s --check-prefix=ERR2
-# ERR2: error: '[[FILE]]': SHT_NOTE section [index 1] has invalid offset (0x180) or size (0xffff0000)
+# ERR2: error: '[[FILE]]': SHT_NOTE section [index 1] has invalid offset (0x40) or size (0xffff0000)
--- !ELF
FileHeader:
# RUN: not llvm-readelf --notes %t5.so 2>&1 | FileCheck -DFILE=%t5.so %s --check-prefix=ERR4
# RUN: not llvm-readobj --notes %t5.so 2>&1 | FileCheck -DFILE=%t5.so %s --check-prefix=ERR4
-# ERR4: error: '[[FILE]]': PT_NOTE header has invalid offset (0x1b8) or size (0xffff0000)
+# ERR4: error: '[[FILE]]': PT_NOTE header has invalid offset (0x78) or size (0xffff0000)
--- !ELF
FileHeader:
# RUN: yaml2obj --docnum=1 %s -o %t-i386.o
# RUN: llvm-readelf -S %t-i386.o | FileCheck %s -check-prefix ELF32
-# ELF32: There are 8 section headers, starting at offset 0x34:
+# ELF32: There are 8 section headers, starting at offset 0x90:
# ELF32-EMPTY:
# ELF32-NEXT: Section Headers:
# ELF32-NEXT: [Nr] Name Type Address Off Size ES Flg Lk Inf Al
# ELF32-NEXT: [ 0] NULL 00000000 000000 000000 00 0 0 0
-# ELF32-NEXT: [ 1] .text PROGBITS 00000000 000174 000001 00 AX 0 0 4
-# ELF32-NEXT: [ 2] .rel.text REL 00000000 000178 000000 08 5 1 4
-# ELF32-NEXT: [ 3] .data PROGBITS 00000000 000178 000000 00 WA 0 0 4
-# ELF32-NEXT: [ 4] .bss NOBITS 00000000 000178 000000 00 WA 0 0 4
-# ELF32-NEXT: [ 5] .symtab SYMTAB 00000000 000178 000020 10 6 2 8
-# ELF32-NEXT: [ 6] .strtab STRTAB 00000000 000198 000007 00 0 0 1
-# ELF32-NEXT: [ 7] .shstrtab STRTAB 00000000 00019f 000030 00 0 0 1
+# ELF32-NEXT: [ 1] .text PROGBITS 00000000 000034 000001 00 AX 0 0 4
+# ELF32-NEXT: [ 2] .rel.text REL 00000000 000038 000000 08 5 1 4
+# ELF32-NEXT: [ 3] .data PROGBITS 00000000 000038 000000 00 WA 0 0 4
+# ELF32-NEXT: [ 4] .bss NOBITS 00000000 000038 000000 00 WA 0 0 4
+# ELF32-NEXT: [ 5] .symtab SYMTAB 00000000 000038 000020 10 6 2 8
+# ELF32-NEXT: [ 6] .strtab STRTAB 00000000 000058 000007 00 0 0 1
+# ELF32-NEXT: [ 7] .shstrtab STRTAB 00000000 00005f 000030 00 0 0 1
# ELF32-NEXT: Key to Flags:
# ELF32-NEXT: W (write), A (alloc), X (execute), M (merge), S (strings), l (large)
# ELF32-NEXT: I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)
# RUN: | FileCheck %s -check-prefix ELF64
# RUN: llvm-readelf -W -S %t-x64.o | FileCheck %s -check-prefix ELF64
-# ELF64: There are 8 section headers, starting at offset 0x40:
+# ELF64: There are 8 section headers, starting at offset 0xb0:
# ELF64-EMPTY:
# ELF64-NEXT: Section Headers:
# ELF64-NEXT: [Nr] Name Type Address Off Size ES Flg Lk Inf Al
# ELF64-NEXT: [ 0] NULL 0000000000000000 000000 000000 00 0 0 0
-# ELF64-NEXT: [ 1] .text PROGBITS 0000000000000000 000240 000001 00 AX 0 0 4
-# ELF64-NEXT: [ 2] .rela.text RELA 0000000000000000 000248 000000 18 5 1 8
-# ELF64-NEXT: [ 3] .data PROGBITS 0000000000000000 000248 000000 00 WA 0 0 4
-# ELF64-NEXT: [ 4] .bss NOBITS 0000000000000000 000248 000000 00 WA 0 0 4
-# ELF64-NEXT: [ 5] .symtab SYMTAB 0000000000000000 000248 000030 18 6 2 8
-# ELF64-NEXT: [ 6] .strtab STRTAB 0000000000000000 000278 000007 00 0 0 1
-# ELF64-NEXT: [ 7] .shstrtab STRTAB 0000000000000000 00027f 000031 00 0 0 1
+# ELF64-NEXT: [ 1] .text PROGBITS 0000000000000000 000040 000001 00 AX 0 0 4
+# ELF64-NEXT: [ 2] .rela.text RELA 0000000000000000 000048 000000 18 5 1 8
+# ELF64-NEXT: [ 3] .data PROGBITS 0000000000000000 000048 000000 00 WA 0 0 4
+# ELF64-NEXT: [ 4] .bss NOBITS 0000000000000000 000048 000000 00 WA 0 0 4
+# ELF64-NEXT: [ 5] .symtab SYMTAB 0000000000000000 000048 000030 18 6 2 8
+# ELF64-NEXT: [ 6] .strtab STRTAB 0000000000000000 000078 000007 00 0 0 1
+# ELF64-NEXT: [ 7] .shstrtab STRTAB 0000000000000000 00007f 000031 00 0 0 1
# ELF64-NEXT: Key to Flags:
# ELF64-NEXT: W (write), A (alloc), X (execute), M (merge), S (strings), l (large)
# ELF64-NEXT: I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)
# LLVM: Type: R_386_IRELATIVE (42)
# LLVM: Type: R_386_GOT32X (43)
-# GNU: Relocation section '.rel.text' at offset 0x128 contains 41 entries:
+# GNU: Relocation section '.rel.text' at offset 0x38 contains 41 entries:
# GNU-NEXT: Offset Info Type Sym. Value Symbol's Name
# GNU-NEXT: 00000002 00000100 R_386_NONE 00000000 foo
# GNU-NEXT: 00000008 00000101 R_386_32 00000000 foo
# LLVM: Type: R_X86_64_GOTPCRELX (41)
# LLVM: Type: R_X86_64_REX_GOTPCRELX (42)
-# GNU: Relocation section '.rela.text' at offset 0x1c8 contains 40 entries:
+# GNU: Relocation section '.rela.text' at offset 0x48 contains 40 entries:
# GNU-NEXT: Offset Info Type Symbol's Value Symbol's Name + Addend
# GNU-NEXT: 0000000000000003 0000000100000000 R_X86_64_NONE 0000000000000000 foo + 0
# GNU-NEXT: 000000000000000a 0000000100000001 R_X86_64_64 0000000000000000 foo + 0
# CHECK: EH_FRAME Header [
# CHECK-NEXT: Address: 0x4013c0
-# CHECK-NEXT: Offset: 0x27c
+# CHECK-NEXT: Offset: 0xbc
# CHECK-NEXT: Size: 0x3c
# CHECK-NEXT: Corresponding Section: .eh_frame_hdr
# CHECK-NEXT: Header {
# CHECK-NEXT: }
# CHECK-NEXT:]
-# CHECK: .eh_frame section at offset 0x2b8 address 0x401400:
+# CHECK: .eh_frame section at offset 0xf8 address 0x401400:
# CHECK-NEXT: [0x401400] CIE length=20
# CHECK-NEXT: version: 1
# CHECK-NEXT: augmentation: zR
# CASE4-NEXT: SHF_ALLOC
# CASE4-NEXT: ]
# CASE4-NEXT: Address: 0x0
-# CASE4-NEXT: Offset: 0x180
+# CASE4-NEXT: Offset: 0x40
# CASE4-NEXT: Size: 2
# CASE4-NEXT: Link: 0
# CASE4-NEXT: Info: 1
# CASE5-NEXT: SHF_ALLOC
# CASE5-NEXT: ]
# CASE5-NEXT: Address: 0x0
-# CASE5-NEXT: Offset: 0x180
+# CASE5-NEXT: Offset: 0x40
# CASE5-NEXT: Size: 5
# CASE5-NEXT: Link: 0
# CASE5-NEXT: Info: 1
# CASE6-NEXT: SHF_ALLOC
# CASE6-NEXT: ]
# CASE6-NEXT: Address: 0x0
-# CASE6-NEXT: Offset: 0x180
+# CASE6-NEXT: Offset: 0x40
# CASE6-NEXT: Size: 4
# CASE6-NEXT: Link: 0
# CASE6-NEXT: Info: 1
# CASE7-NEXT: SHF_ALLOC
# CASE7-NEXT: ]
# CASE7-NEXT: Address: 0x0
-# CASE7-NEXT: Offset: 0x180
+# CASE7-NEXT: Offset: 0x40
# CASE7-NEXT: Size: 2
# CASE7-NEXT: Link: 0
# CASE7-NEXT: Info: 1
# DEFAULT: Section Headers:
# DEFAULT-NEXT: [Nr] Name Type Address Off Size ES Flg Lk Inf Al
# DEFAULT-NEXT: [ 0] NULL 0000000000000000 000000 000000 00 0 0 0
-# DEFAULT-NEXT: [ 1] .symtab SYMTAB 0000000000000000 000140 000018 18 2 1 8
-# DEFAULT-NEXT: [ 2] .strtab STRTAB 0000000000000000 000158 000001 00 0 0 1
-# DEFAULT-NEXT: [ 3] .shstrtab STRTAB 0000000000000000 000159 00001b 00 0 0 1
+# DEFAULT-NEXT: [ 1] .symtab SYMTAB 0000000000000000 000040 000018 18 2 1 8
+# DEFAULT-NEXT: [ 2] .strtab STRTAB 0000000000000000 000058 000001 00 0 0 1
+# DEFAULT-NEXT: [ 3] .shstrtab STRTAB 0000000000000000 000059 00001b 00 0 0 1
--- !ELF
FileHeader:
# OTHER-SECTION: Section Headers:
# OTHER-SECTION-NEXT: [Nr] Name Type Address Off Size ES Flg Lk Inf Al
# OTHER-SECTION-NEXT: [ 0] NULL 0000000000000000 000000 000000 00 0 0 0
-# OTHER-SECTION-NEXT: [ 1] foo PROGBITS 0000000000000000 000180 000000 00 0 0 0
-# OTHER-SECTION-NEXT: [ 2] .symtab SYMTAB 0000000000000000 000180 000018 18 3 1 8
-# OTHER-SECTION-NEXT: [ 3] .strtab STRTAB 0000000000000000 000198 000001 00 0 0 1
-# OTHER-SECTION-NEXT: [ 4] .shstrtab STRTAB 0000000000000000 000199 00001f 00 0 0 1
+# OTHER-SECTION-NEXT: [ 1] foo PROGBITS 0000000000000000 000040 000000 00 0 0 0
+# OTHER-SECTION-NEXT: [ 2] .symtab SYMTAB 0000000000000000 000040 000018 18 3 1 8
+# OTHER-SECTION-NEXT: [ 3] .strtab STRTAB 0000000000000000 000058 000001 00 0 0 1
+# OTHER-SECTION-NEXT: [ 4] .shstrtab STRTAB 0000000000000000 000059 00001f 00 0 0 1
--- !ELF
FileHeader:
# MULTIPLE: Section Headers:
# MULTIPLE-NEXT: [Nr] Name Type Address Off Size ES Flg Lk Inf Al
# MULTIPLE-NEXT: [ 0] NULL 0000000000000000 000000 000000 00 0 0 0
-# MULTIPLE-NEXT: [ 1] .foo NULL 0000000000000123 000180 000020 10 A 1 2 0
+# MULTIPLE-NEXT: [ 1] .foo NULL 0000000000000123 000040 000020 10 A 1 2 0
--- !ELF
FileHeader:
# RUN: yaml2obj --docnum=1 %s -o %t1
# RUN: llvm-readelf --file-headers %t1 | FileCheck %s --check-prefix=DEFAULT
-# DEFAULT: Start of section headers: 64 (bytes into file)
+# DEFAULT: Start of section headers: 120 (bytes into file)
# DEFAULT: Size of section headers: 64 (bytes)
# DEFAULT: Number of section headers: 4
# DEFAULT: Section header string table index: 3
# CASE1: Section Headers:
# CASE1-NEXT: [Nr] Name Type Address Off Size
# CASE1-NEXT: [ 0] NULL 0000000000000000 000000 000000
-# CASE1-NEXT: [ 1] .dynsym DYNSYM 0000000000000000 000380 000001
-# CASE1-NEXT: [ 2] .symtab SYMTAB 0000000000000000 000398 000002
-# CASE1-NEXT: [ 3] .dynamic DYNAMIC 0000000000000000 0003b0 000003
-# CASE1-NEXT: [ 4] .rela RELA 0000000000000000 0003b0 000004
-# CASE1-NEXT: [ 5] .nobits NOBITS 0000000000000000 0003b0 000005
-# CASE1-NEXT: [ 6] .group GROUP 0000000000000000 0003b0 000006
-# CASE1-NEXT: [ 7] .gnu.version VERSYM 0000000000000000 0003b0 000007
-# CASE1-NEXT: [ 8] .gnu.version_r VERNEED 0000000000000000 0003b0 000008
-# CASE1-NEXT: [ 9] .gnu.version_d VERDEF 0000000000000000 0003b0 000009
-# CASE1-NEXT: [10] .regular PROGBITS 0000000000000000 0003b0 00000a
-# CASE1-NEXT: [11] .strtab STRTAB 0000000000000000 0003b0 00000b
+# CASE1-NEXT: [ 1] .dynsym DYNSYM 0000000000000000 000040 000001
+# CASE1-NEXT: [ 2] .symtab SYMTAB 0000000000000000 000058 000002
+# CASE1-NEXT: [ 3] .dynamic DYNAMIC 0000000000000000 000070 000003
+# CASE1-NEXT: [ 4] .rela RELA 0000000000000000 000070 000004
+# CASE1-NEXT: [ 5] .nobits NOBITS 0000000000000000 000070 000005
+# CASE1-NEXT: [ 6] .group GROUP 0000000000000000 000070 000006
+# CASE1-NEXT: [ 7] .gnu.version VERSYM 0000000000000000 000070 000007
+# CASE1-NEXT: [ 8] .gnu.version_r VERNEED 0000000000000000 000070 000008
+# CASE1-NEXT: [ 9] .gnu.version_d VERDEF 0000000000000000 000070 000009
+# CASE1-NEXT: [10] .regular PROGBITS 0000000000000000 000070 00000a
+# CASE1-NEXT: [11] .strtab STRTAB 0000000000000000 000070 00000b
--- !ELF
FileHeader:
# CHECK: Section Headers:
# CHECK-NEXT: [Nr] Name Type Address Off Size ES Flg Lk
# CHECK-NEXT: [ 0] NULL 0000000000000000 000000 000000 00 0 0
-# CHECK-NEXT: [ 1] .dynsym DYNSYM 0000000000000000 000180 000018 18 A 0
+# CHECK-NEXT: [ 1] .dynsym DYNSYM 0000000000000000 000040 000018 18 A 0
--- !ELF
FileHeader:
# CHECK: Section Headers:
# CHECK-NEXT: [Nr] Name Type Address Off Size
# CHECK-NEXT: [ 0] NULL 0000000000000000 000000 000000
-# CHECK-NEXT: [ 1] .dynstr STRTAB 0000000000000100 000200 000009
-# CHECK-NEXT: [ 2] .dynsym DYNSYM 0000000000000150 000209 000030
-# CHECK-NEXT: [ 3] .symtab SYMTAB 0000000000000000 000239 000018
-# CHECK-NEXT: [ 4] .strtab STRTAB 0000000000000000 000251 000001
-# CHECK-NEXT: [ 5] .shstrtab STRTAB 0000000000000000 000252 000035
-# CHECK-NEXT: [ 6] .text.foo PROGBITS 0000000000000200 000287 000000
+# CHECK-NEXT: [ 1] .dynstr STRTAB 0000000000000100 000040 000009
+# CHECK-NEXT: [ 2] .dynsym DYNSYM 0000000000000150 000049 000030
+# CHECK-NEXT: [ 3] .symtab SYMTAB 0000000000000000 000079 000018
+# CHECK-NEXT: [ 4] .strtab STRTAB 0000000000000000 000091 000001
+# CHECK-NEXT: [ 5] .shstrtab STRTAB 0000000000000000 000092 000035
+# CHECK-NEXT: [ 6] .text.foo PROGBITS 0000000000000200 0000c7 000000
--- !ELF
FileHeader:
# NODYNSYM: Section Headers:
# NODYNSYM-NEXT: [Nr] Name Type Address Off Size
# NODYNSYM-NEXT: [ 0] NULL 0000000000000000 000000 000000
-# NODYNSYM-NEXT: [ 1] .dynstr STRTAB 0000000000000100 000200 000001
-# NODYNSYM-NEXT: [ 2] .dynsym DYNSYM 0000000000000150 000201 000018
-# NODYNSYM-NEXT: [ 3] .symtab SYMTAB 0000000000000000 000219 000018
-# NODYNSYM-NEXT: [ 4] .strtab STRTAB 0000000000000000 000231 000001
-# NODYNSYM-NEXT: [ 5] .shstrtab STRTAB 0000000000000000 000232 000035
-# NODYNSYM-NEXT: [ 6] .text.foo PROGBITS 0000000000000200 000267 000000
+# NODYNSYM-NEXT: [ 1] .dynstr STRTAB 0000000000000100 000040 000001
+# NODYNSYM-NEXT: [ 2] .dynsym DYNSYM 0000000000000150 000041 000018
+# NODYNSYM-NEXT: [ 3] .symtab SYMTAB 0000000000000000 000059 000018
+# NODYNSYM-NEXT: [ 4] .strtab STRTAB 0000000000000000 000071 000001
+# NODYNSYM-NEXT: [ 5] .shstrtab STRTAB 0000000000000000 000072 000035
+# NODYNSYM-NEXT: [ 6] .text.foo PROGBITS 0000000000000200 0000a7 000000
--- !ELF
FileHeader:
#CHECK: ProgramHeaders [
#CHECK-NEXT: ProgramHeader {
#CHECK-NEXT: Type: PT_LOAD
-#CHECK-NEXT: Offset: 0x230
+#CHECK-NEXT: Offset: 0xB0
#CHECK-NEXT: VirtualAddress: 0xAAAA1030
#CHECK-NEXT: PhysicalAddress: 0xFFFF1030
#CHECK-NEXT: FileSize: 4
#CHECK-NEXT: }
#CHECK-NEXT: ProgramHeader {
#CHECK-NEXT: Type: PT_LOAD
-#CHECK-NEXT: Offset: 0x240
+#CHECK-NEXT: Offset: 0xC0
#CHECK-NEXT: VirtualAddress: 0xAAAA2040
#CHECK-NEXT: PhysicalAddress: 0xFFFF2040
#CHECK-NEXT: FileSize: 4
# CASE2-NEXT: Flags [
# CASE2-NEXT: ]
# CASE2-NEXT: Address: 0x0
-# CASE2-NEXT: Offset: 0x180
+# CASE2-NEXT: Offset: 0x40
# CASE2-NEXT: Size: 1
# CASE2-NEXT: Link: 0
# CASE2-NEXT: Info: 0
# CASE3-NEXT: Flags [
# CASE3-NEXT: ]
# CASE3-NEXT: Address: 0x0
-# CASE3-NEXT: Offset: 0x180
+# CASE3-NEXT: Offset: 0x40
# CASE3-NEXT: Size: 1
# CASE3-NEXT: Link: 0
# CASE3-NEXT: Info: 0
# CASE4-NEXT: Flags [
# CASE4-NEXT: ]
# CASE4-NEXT: Address: 0x0
-# CASE4-NEXT: Offset: 0x180
+# CASE4-NEXT: Offset: 0x40
# CASE4-NEXT: Size: 3
# CASE4-NEXT: Link: 0
# CASE4-NEXT: Info: 0
# CASE5-NEXT: Flags [
# CASE5-NEXT: ]
# CASE5-NEXT: Address: 0x0
-# CASE5-NEXT: Offset: 0x180
+# CASE5-NEXT: Offset: 0x40
# CASE5-NEXT: Size: 0
--- !ELF
# CASE2-NEXT: Flags [
# CASE2-NEXT: ]
# CASE2-NEXT: Address: 0x0
-# CASE2-NEXT: Offset: 0x140
+# CASE2-NEXT: Offset: 0x40
# CASE2-NEXT: Size: 2
# CASE2-NEXT: Link: 0
# CASE2-NEXT: Info: 0
# CASE3-NEXT: Flags [
# CASE3-NEXT: ]
# CASE3-NEXT: Address: 0x0
-# CASE3-NEXT: Offset: 0x140
+# CASE3-NEXT: Offset: 0x40
# CASE3-NEXT: Size: 2
# CASE3-NEXT: Link: 0
# CASE3-NEXT: Info: 0
# CASE4-NEXT: Flags [
# CASE4-NEXT: ]
# CASE4-NEXT: Address: 0x0
-# CASE4-NEXT: Offset: 0x140
+# CASE4-NEXT: Offset: 0x40
# CASE4-NEXT: Size: 3
# CASE4-NEXT: Link: 0
# CASE4-NEXT: Info: 0
# CASE5-NEXT: Flags [ (0x0)
# CASE5-NEXT: ]
# CASE5-NEXT: Address: 0x0
-# CASE5-NEXT: Offset: 0x140
+# CASE5-NEXT: Offset: 0x40
# CASE5-NEXT: Size: 2
# CASE5-NEXT: Link: 0
# CASE5-NEXT: Info: 0
# CASE4-NEXT: Flags [ (0x0)
# CASE4-NEXT: ]
# CASE4-NEXT: Address: 0x0
-# CASE4-NEXT: Offset: 0x140
+# CASE4-NEXT: Offset: 0x40
# CASE4-NEXT: Size: 2
# CASE4-NEXT: Link: 2
# CASE4-NEXT: Info: 1
# CASE5-NEXT: Flags [ (0x0)
# CASE5-NEXT: ]
# CASE5-NEXT: Address: 0x0
-# CASE5-NEXT: Offset: 0x140
+# CASE5-NEXT: Offset: 0x40
# CASE5-NEXT: Size: 5
# CASE5-NEXT: Link: 2
# CASE5-NEXT: Info: 1
# CASE6-NEXT: Flags [
# CASE6-NEXT: ]
# CASE6-NEXT: Address: 0x0
-# CASE6-NEXT: Offset: 0x140
+# CASE6-NEXT: Offset: 0x40
# CASE6-NEXT: Size: 4
# CASE6-NEXT: Link: 2
# CASE6-NEXT: Info: 1
# CASE7-NEXT: Flags [
# CASE7-NEXT: ]
# CASE7-NEXT: Address: 0x0
-# CASE7-NEXT: Offset: 0x140
+# CASE7-NEXT: Offset: 0x40
# CASE7-NEXT: Size: 2
# CASE7-NEXT: Link: 2
# CASE7-NEXT: Info: 1
# CHECK: Version symbols {
# CHECK-NEXT: Section Name: .gnu.version
# CHECK-NEXT: Address: 0x200210
-# CHECK-NEXT: Offset: 0x240
+# CHECK-NEXT: Offset: 0x40
# CHECK-NEXT: Link: 6
# CHECK-NEXT: Symbols [
# CHECK-NEXT: Symbol {
# ENTSIZE: Section Headers:
# ENTSIZE: [Nr] Name Type Address Off Size ES
-# ENTSIZE: [ 1] .gnu.version VERSYM 0000000000000000 000180 000000 03
+# ENTSIZE: [ 1] .gnu.version VERSYM 0000000000000000 000040 000000 03
--- !ELF
FileHeader: