## Show that yaml2obj properly emits program headers with explicit file size, ## memory size and offset parameters. # RUN: yaml2obj --docnum=1 %s -o %t1 # RUN: llvm-readobj %t1 --program-headers | FileCheck %s # CHECK: ProgramHeaders [ # CHECK: Offset: 0x1234 # CHECK: FileSize: 1111 # CHECK: MemSize: 9999 # CHECK: Offset: 0x2000 # CHECK: FileSize: 6 # CHECK: MemSize: 4 # CHECK: Offset: 0x2000 # CHECK: FileSize: 4 # CHECK: MemSize: 6 # CHECK: Offset: 0x1FFF # CHECK: FileSize: 5 # CHECK: MemSize: 5 # CHECK: Offset: 0xFFE # CHECK: FileSize: 7 # CHECK: MemSize: 9 # CHECK: Offset: 0x3000 # CHECK: FileSize: 3 # CHECK: MemSize: 2 # CHECK: Offset: 0x2004 ## Offset of .nobits2 (0x2009) - offset of .data (0x2004) == 0x5. # CHECK: FileSize: 5 # CHECK: MemSize: 6 # CHECK: ] --- !ELF FileHeader: Class: ELFCLASS64 Data: ELFDATA2LSB Type: ET_EXEC Sections: - Name: .text Type: SHT_PROGBITS Size: 4 ShOffset: 0x1000 AddressAlign: 0x1000 - Name: .rodata Type: SHT_PROGBITS Size: 4 ShOffset: 0x2000 AddressAlign: 0x1000 - Name: .data Type: SHT_PROGBITS ShOffset: 0x2004 Size: 4 - Name: .nobits1 Type: SHT_NOBITS ShOffset: 0x2008 Size: 1 - Name: .nobits2 Type: SHT_NOBITS # Intentionally set to 0x2009 though the previous section is SHT_NOBITS. ShOffset: 0x2009 Size: 1 ProgramHeaders: # Program header with no sections. - Type: 0x6abcdef0 # arbitrary type Offset: 0x1234 FileSize: 1111 MemSize: 9999 # Program header with only file size set. - Type: 0x6abcdef0 FileSize: 6 FirstSec: .rodata LastSec: .rodata # Program header with only mem size set. - Type: 0x6abcdef0 MemSize: 6 FirstSec: .rodata LastSec: .rodata # Program header with only offset set. - Type: 0x6abcdef0 Offset: 0x1fff FirstSec: .rodata LastSec: .rodata # Program header with sections, valid properties. - Type: 0x6abcdef0 Offset: 0xffe FileSize: 7 MemSize: 9 FirstSec: .text LastSec: .text # Program header with invalid properties. - Type: 0x6abcdef0 Offset: 0x3000 FileSize: 3 MemSize: 2 # Program header with 2 SHT_NOBITS sections. - Type: 0x6abcdef0 Offset: 0x2004 FirstSec: .data LastSec: .nobits2 ## Test the "Offset" property. ## Check that by default the p_offset field of a segment is set to the ## offset of the section with the minimum offset. # RUN: yaml2obj --docnum=2 %s -o %t2 # RUN: llvm-readelf %t2 --sections --program-headers | \ # RUN: FileCheck %s --check-prefixes=DEFAULT-OFFSET # DEFAULT-OFFSET: [Nr] Name Type Address Off # DEFAULT-OFFSET: [ 1] .foo PROGBITS 0000000000001000 0000b0 # DEFAULT-OFFSET-NEXT: [ 2] .bar PROGBITS 0000000000001001 0000b1 # DEFAULT-OFFSET: Type Offset # DEFAULT-OFFSET-NEXT: LOAD 0x0000b0 # DEFAULT-OFFSET-NEXT: LOAD 0x0000b1 --- !ELF FileHeader: Class: ELFCLASS64 Data: ELFDATA2LSB Type: ET_EXEC Sections: - Name: .foo Type: SHT_PROGBITS Flags: [ SHF_ALLOC ] Size: 0x1 Address: 0x1000 - Name: .bar Type: SHT_PROGBITS Flags: [ SHF_ALLOC ] Size: 0x1 ProgramHeaders: - Type: PT_LOAD FirstSec: .foo LastSec: .bar - Type: PT_LOAD FirstSec: .bar LastSec: .bar ## Check we can set the "Offset" value explicitly to be less than or equal to ## the offset of a section in the segment. # RUN: yaml2obj --docnum=3 -DOFFSET=0x77 %s -o %t3 # RUN: llvm-readelf %t3 --sections --program-headers | \ # RUN: FileCheck %s --check-prefixes=VALID-OFFSET,VALID-OFFSET-LESS # RUN: yaml2obj --docnum=3 -DOFFSET=0x78 %s -o %t4 # RUN: llvm-readelf %t4 --sections --program-headers | \ # RUN: FileCheck %s --check-prefixes=VALID-OFFSET,VALID-OFFSET-EQ # VALID-OFFSET: [Nr] Name Type Address Off # VALID-OFFSET: [ 1] .foo PROGBITS 0000000000000000 000078 # VALID-OFFSET: Type Offset # VALID-OFFSET-EQ: LOAD 0x000078 # VALID-OFFSET-LESS: LOAD 0x000077 --- !ELF FileHeader: Class: ELFCLASS64 Data: ELFDATA2LSB Type: ET_EXEC Sections: - Name: .foo Type: SHT_PROGBITS Flags: [ SHF_ALLOC ] Size: 0x1 ProgramHeaders: - Type: PT_LOAD Offset: [[OFFSET]] FirstSec: .foo LastSec: .foo ## Check we report an error when the "Offset" value is larger than the offset of a section in the segment. # RUN: not yaml2obj --docnum=3 -DOFFSET=0x79 %s -o /dev/null 2>&1 | \ # RUN: FileCheck %s --check-prefix=INVALID-OFFSET # INVALID-OFFSET: yaml2obj: error: 'Offset' for segment with index 1 must be less than or equal to the minimum file offset of all included sections (0x78) ## Document that the "Offset" value is checked after the section offset is overriden using "ShOffset". # RUN: yaml2obj --docnum=4 %s -o %t5 # RUN: llvm-readelf %t5 --sections --program-headers | FileCheck %s --check-prefix=SHOFFSET # SHOFFSET: [Nr] Name Type Address Off # SHOFFSET: [ 1] .foo PROGBITS 0000000000000000 ffffffff # SHOFFSET: Type Offset # SHOFFSET-NEXT: LOAD 0xffffff00 --- !ELF FileHeader: Class: ELFCLASS64 Data: ELFDATA2LSB Type: ET_EXEC Sections: - Name: .foo Type: SHT_PROGBITS Flags: [ SHF_ALLOC ] Size: 0x1 ## Note: the real .foo offset is much less than 0xFFFFFFFF or ## 0xFFFFFF00, but no error is reported. ShOffset: 0xFFFFFFFF ProgramHeaders: - Type: PT_LOAD Offset: 0xFFFFFF00 FirstSec: .foo LastSec: .foo