| ## Check how the "Offset" field is dumped by obj2yaml. |
| ## For each section we calulate the expected offset. |
| ## When it does not match the actual offset, we emit the "Offset" key. |
| |
| # RUN: yaml2obj %s -o %t1.o |
| # RUN: obj2yaml %t1.o | FileCheck %s --check-prefix=BASIC |
| |
| # BASIC: --- !ELF |
| # BASIC-NEXT: FileHeader: |
| # BASIC-NEXT: Class: ELFCLASS64 |
| # BASIC-NEXT: Data: ELFDATA2LSB |
| # BASIC-NEXT: Type: ET_REL |
| # BASIC-NEXT: Sections: |
| # BASIC-NEXT: - Name: .foo1 |
| # BASIC-NEXT: Type: SHT_PROGBITS |
| # BASIC-NEXT: Content: '00' |
| # BASIC-NEXT: - Name: .foo2 |
| # BASIC-NEXT: Type: SHT_PROGBITS |
| # BASIC-NEXT: Content: '00' |
| # BASIC-NEXT: - Name: .foo3 |
| # BASIC-NEXT: Type: SHT_PROGBITS |
| # BASIC-NEXT: Content: '00' |
| # BASIC-NEXT: - Name: .bar1 |
| # BASIC-NEXT: Type: SHT_PROGBITS |
| # BASIC-NEXT: Offset: 0x100 |
| # BASIC-NEXT: Content: '00' |
| # BASIC-NEXT: - Name: .bar2 |
| # BASIC-NEXT: Type: SHT_PROGBITS |
| # BASIC-NEXT: AddressAlign: 0x10 |
| # BASIC-NEXT: Content: '00' |
| # BASIC-NEXT: - Name: .bar3 |
| # BASIC-NEXT: Type: SHT_PROGBITS |
| # BASIC-NEXT: AddressAlign: 0x10 |
| # BASIC-NEXT: Offset: 0x200 |
| # BASIC-NEXT: - Name: .bar4 |
| # BASIC-NEXT: Type: SHT_PROGBITS |
| # BASIC-NEXT: AddressAlign: 0x100000000 |
| # BASIC-NEXT: Offset: 0x210 |
| # HEADERS-NEXT: - Type: SectionHeaderTable |
| # HEADERS-NEXT: Sections: |
| # HEADERS-NEXT: - Name: .bar4 |
| # HEADERS-NEXT: - Name: .bar3 |
| # HEADERS-NEXT: - Name: .bar2 |
| # HEADERS-NEXT: - Name: .bar1 |
| # HEADERS-NEXT: - Name: .foo3 |
| # HEADERS-NEXT: - Name: .foo2 |
| # HEADERS-NEXT: - Name: .foo1 |
| # HEADERS-NEXT: - Name: .strtab |
| # HEADERS-NEXT: - Name: .shstrtab |
| # BASIC-NEXT: ... |
| |
| --- !ELF |
| FileHeader: |
| Class: ELFCLASS64 |
| Data: ELFDATA2LSB |
| Type: ET_REL |
| Sections: |
| ## The offset of .foo1 by default is 0x40, because it is placed right |
| ## after the ELF header. In this case we don't dump the "Offset" key, |
| ## because the file offset is naturally expected. |
| - Name: .foo1 |
| Type: SHT_PROGBITS |
| Size: 1 |
| Offset: [[FIRSTOFF=<none>]] |
| AddressAlign: [[FIRSTADDRALIGN=0]] |
| ## Offset of .foo2 == offset of .foo1 + size of .foo1. |
| ## We don't dump the "Offset" key in this case. |
| ## sh_offset of .foo2 is 0x41. |
| - Name: .foo2 |
| Type: SHT_PROGBITS |
| Size: 1 |
| ## Offset of .foo3 == offset of .foo2 + size of .foo2, |
| ## We don't dump the "Offset" key in this case. |
| ## sh_offset of .foo3 is 0x42. |
| - Name: .foo3 |
| Type: SHT_PROGBITS |
| Size: 1 |
| ## Offset of .bar1 != offset of .foo3 + size of .foo3. |
| ## We dump the "Offset" key in this case. |
| ## sh_offset of .bar1 is 0x100. |
| - Name: .bar1 |
| Type: SHT_PROGBITS |
| Offset: 0x100 |
| Size: 1 |
| ## [Offset of .bar1 + size of .bar1] aligned by 0x10 is equal to the offset |
| ## of .bar2. We don't dump the "Offset" key in this case. |
| ## sh_offset of .bar2 is 0x110. |
| - Name: .bar2 |
| Type: SHT_PROGBITS |
| AddressAlign: 0x10 |
| Offset: 0x110 |
| Size: 1 |
| ## [Offset of .bar2 + size of .bar2] aligned by 0x10 is not equal to the offset |
| ## of .bar3. We dump the "Offset" key in this case. |
| ## sh_offset of .bar3 is 0x200. |
| - Name: .bar3 |
| Type: SHT_PROGBITS |
| AddressAlign: 0x10 |
| Offset: 0x200 |
| ## A case where AddressAlign > MAX_UINT32 and (uint32_t)AddressAlign == 0. |
| ## Check we dump an offset in this case properly. |
| - Name: .bar4 |
| Type: SHT_PROGBITS |
| AddressAlign: 0x100000000 |
| Offset: 0x210 |
| - Type: SectionHeaderTable |
| Sections: |
| ## By default we have the same order of sections as defined by the "Sections" key. |
| - Name: [[SEC1=.foo1]] |
| - Name: [[SEC2=.foo2]] |
| - Name: [[SEC3=.foo3]] |
| - Name: [[SEC4=.bar1]] |
| - Name: [[SEC5=.bar2]] |
| - Name: [[SEC6=.bar3]] |
| - Name: [[SEC7=.bar4]] |
| - Name: .strtab |
| - Name: .shstrtab |
| |
| ## In this case we change the order of sections in the section header table. |
| ## Check that we still dump offsets correctly. |
| |
| # RUN: yaml2obj %s -DSEC1=.bar4 -DSEC2=.bar3 -DSEC3=.bar2 \ |
| # RUN: -DSEC4=.bar1 -DSEC5=.foo3 -DSEC6=.foo2 -DSEC7=.foo1 -o %t1-sechdr.o |
| # RUN: obj2yaml %t1-sechdr.o | FileCheck --check-prefixes=BASIC,HEADERS %s |
| |
| ## Show we dump the "Offset" key for the first section when |
| ## it has an unexpected file offset. |
| |
| # RUN: yaml2obj %s -DFIRSTOFF=0x40 -o %t2a.o |
| # RUN: obj2yaml %t2a.o | FileCheck %s --check-prefix=BASIC |
| # RUN: yaml2obj %s -DFIRSTOFF=0x41 -o %t2b.o |
| # RUN: obj2yaml %t2b.o | FileCheck %s --check-prefix=FIRSTSEC |
| |
| # FIRSTSEC: Sections: |
| # FIRSTSEC-NEXT: - Name: .foo1 |
| # FIRSTSEC-NEXT: Type: SHT_PROGBITS |
| # FIRSTSEC-NEXT: Offset: 0x41 |
| # FIRSTSEC-NEXT: Content: '00' |
| |
| ## Test that we take the alignment of the first section into account |
| ## when calculating the expected offset for it. In this case we don't |
| ## dump the "Offset", because it is expected. |
| |
| # RUN: yaml2obj %s -DFIRSTOFF=0x80 -DFIRSTADDRALIGN=0x80 -o %t3.o |
| # RUN: obj2yaml %t3.o | FileCheck %s --check-prefix=FIRSTSECALIGN |
| |
| # FIRSTSECALIGN: - Name: .foo1 |
| # FIRSTSECALIGN-NEXT: Type: SHT_PROGBITS |
| # FIRSTSECALIGN-NEXT: AddressAlign: 0x80 |
| # FIRSTSECALIGN-NEXT: Content: '00' |
| # FIRSTSECALIGN-NEXT: - Name: |
| |
| ## Test that we take the program headers offset and size into account when calculating |
| ## the expected file offset of the first section. |
| |
| # RUN: yaml2obj %s --docnum=2 -o %t4a.o |
| # RUN: obj2yaml %t4a.o | FileCheck %s --check-prefix=FIRSTSECPHDRS |
| ## The expected file offset of the first section is: |
| ## 0x40 (start of program headers) + 0x38 (size of program headers) * 2(number of program headers) = 0xB0 |
| # RUN: yaml2obj %s --docnum=2 -DFIRSTOFF=0xB0 -o %t4b.o |
| # RUN: obj2yaml %t4b.o | FileCheck %s --check-prefix=FIRSTSECPHDRS |
| # RUN: yaml2obj %s --docnum=2 -DFIRSTOFF=0xB1 -o %t4c.o |
| # RUN: obj2yaml %t4c.o | FileCheck %s --check-prefixes=FIRSTSECPHDRS,FIRSTSECPHDRSOFFSET |
| |
| # FIRSTSECPHDRS: Sections: |
| # FIRSTSECPHDRS-NEXT: - Name: .foo |
| # FIRSTSECPHDRS-NEXT: Type: SHT_PROGBITS |
| # FIRSTSECPHDRSOFFSET-NEXT: Offset: 0xB1 |
| # FIRSTSECPHDRS-NEXT: ... |
| |
| --- !ELF |
| FileHeader: |
| Class: ELFCLASS64 |
| Data: ELFDATA2LSB |
| Type: ET_REL |
| Sections: |
| - Name: .foo |
| Type: SHT_PROGBITS |
| Offset: [[FIRSTOFF=<none>]] |
| ProgramHeaders: |
| - Type: PT_LOAD |
| - Type: PT_LOAD |
| |
| ## Test that when there are no program headers in the file, we don't take SHT_NOBITS |
| ## section sizes into account, but respect their alignment when calculating the expected |
| ## section offsets. |
| |
| # RUN: yaml2obj %s --docnum=3 -o %t5.o |
| # RUN: obj2yaml %t5.o | FileCheck %s --check-prefix=NOBITS |
| |
| # NOBITS: Sections: |
| # NOBITS-NEXT: - Name: .progbits1 |
| # NOBITS-NEXT: Type: SHT_PROGBITS |
| # NOBITS-NEXT: Content: '00' |
| # NOBITS-NEXT: - Name: .nobits1 |
| # NOBITS-NEXT: Type: SHT_NOBITS |
| # NOBITS-NEXT: Size: 0x10 |
| # NOBITS-NEXT: - Name: .progbits2 |
| # NOBITS-NEXT: Type: SHT_PROGBITS |
| # NOBITS-NEXT: Content: '0000' |
| # NOBITS-NEXT: - Name: .nobits2 |
| # NOBITS-NEXT: Type: SHT_NOBITS |
| # NOBITS-NEXT: AddressAlign: 0x100 |
| # NOBITS-NEXT: Size: 0x100 |
| # NOBITS-NEXT: - Name: .progbits3 |
| # NOBITS-NEXT: Type: SHT_PROGBITS |
| # NOBITS-NEXT: Content: '000000' |
| # NOBITS-NEXT: ... |
| |
| --- !ELF |
| FileHeader: |
| Class: ELFCLASS64 |
| Data: ELFDATA2LSB |
| Type: ET_REL |
| Sections: |
| ## sh_offset == 0x40. |
| - Name: .progbits1 |
| Type: SHT_PROGBITS |
| Size: 0x1 |
| ## sh_offset == 0x41. |
| - Name: .nobits1 |
| Type: SHT_NOBITS |
| Size: 0x10 |
| ## sh_offset == 0x41. |
| - Name: .progbits2 |
| Type: SHT_PROGBITS |
| Size: 0x2 |
| ## sh_offset == 0x100. |
| - Name: .nobits2 |
| Type: SHT_NOBITS |
| Size: 0x100 |
| AddressAlign: 0x100 |
| ## sh_offset == 0x100. |
| - Name: .progbits3 |
| Type: SHT_PROGBITS |
| Size: 0x3 |
| |
| ## Check that we might take sizes of SHT_NOBITS sections into account when calculating |
| ## the expected offsets when there are program headers in the file. The rule is the following: |
| ## we assume that the file space is allocated for the SHT_NOBITS section when there are |
| ## other non-nobits sections in the same segment that follows it. |
| |
| # RUN: yaml2obj %s --docnum=4 -o %t6.o |
| # RUN: obj2yaml %t6.o | FileCheck %s --check-prefix=NOBITS-PHDRS |
| |
| # NOBITS-PHDRS: Sections: |
| # NOBITS-PHDRS-NEXT: - Name: .nobits1 |
| # NOBITS-PHDRS-NEXT: Type: SHT_NOBITS |
| # NOBITS-PHDRS-NEXT: Size: 0x1 |
| # NOBITS-PHDRS-NEXT: - Name: .progbits |
| # NOBITS-PHDRS-NEXT: Type: SHT_PROGBITS |
| # NOBITS-PHDRS-NEXT: Content: '0000' |
| # NOBITS-PHDRS-NEXT: - Name: .nobits3 |
| # NOBITS-PHDRS-NEXT: Type: SHT_NOBITS |
| # NOBITS-PHDRS-NEXT: Size: 0x100 |
| # NOBITS-PHDRS-NEXT: - Name: .nobits4 |
| # NOBITS-PHDRS-NEXT: Type: SHT_NOBITS |
| # NOBITS-PHDRS-NEXT: Size: 0x200 |
| # NOBITS-PHDRS-NEXT: - Name: .nobits5 |
| # NOBITS-PHDRS-NEXT: Type: SHT_NOBITS |
| # NOBITS-PHDRS-NEXT: Offset: 0x100 |
| # NOBITS-PHDRS-NEXT: Size: 0x300 |
| # NOBITS-PHDRS-NEXT: ... |
| |
| --- !ELF |
| FileHeader: |
| Class: ELFCLASS64 |
| Data: ELFDATA2LSB |
| Type: ET_REL |
| Sections: |
| ## sh_offset == 0xe8. |
| - Name: .nobits1 |
| Type: SHT_NOBITS |
| Size: 0x1 |
| ## sh_offset == 0xe9. |
| - Name: .progbits |
| Type: SHT_PROGBITS |
| Size: 0x2 |
| ## sh_offset == 0xeb. |
| - Name: .nobits3 |
| Type: SHT_NOBITS |
| Size: 0x100 |
| ## sh_offset == 0xeb. |
| - Name: .nobits4 |
| Type: SHT_NOBITS |
| Size: 0x200 |
| ## sh_offset == 0x100. |
| - Name: .nobits5 |
| Type: SHT_NOBITS |
| Size: 0x300 |
| Offset: 0x100 |
| ProgramHeaders: |
| - Type: PT_LOAD |
| FirstSec: .nobits1 |
| LastSec: .progbits |
| - Type: PT_LOAD |
| FirstSec: .nobits3 |
| LastSec: .nobits4 |
| - Type: PT_LOAD |
| FirstSec: .nobits5 |
| LastSec: .nobits5 |