## In this test we check that can redefine the null section in the YAML. ## Test the default output first. # RUN: yaml2obj --docnum=1 %s -o %t1 # RUN: llvm-readelf --sections %t1 | FileCheck %s --check-prefix=DEFAULT # 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] .strtab STRTAB 0000000000000000 000040 000001 00 0 0 1 # DEFAULT-NEXT: [ 2] .shstrtab STRTAB 0000000000000000 000041 000013 00 0 0 1 --- !ELF FileHeader: Class: ELFCLASS64 Data: ELFDATA2LSB Type: ET_REL ## Now define a SHT_NULL section with fields all zeroed. ## In this case it is equal to the section created by default. # RUN: yaml2obj --docnum=2 %s -o %t2 # RUN: llvm-readelf --sections %t2 | FileCheck %s --check-prefix=DEFAULT --- !ELF FileHeader: Class: ELFCLASS64 Data: ELFDATA2LSB Type: ET_REL Sections: - Type: SHT_NULL Name: '' Flags: [ ] AddressAlign: 0x0 Size: 0x0 EntSize: 0x0 Link: 0 Info: 0 Address: 0x0 ## Check we can redefine fields of the first SHT_NULL section. # RUN: yaml2obj --docnum=3 %s -o %t3 # RUN: llvm-readelf --sections %t3 | FileCheck %s --check-prefix=REDEFINE # REDEFINE: Section Headers: # REDEFINE-NEXT: [Nr] Name Type Address Off Size ES Flg Lk Inf Al # REDEFINE-NEXT: [ 0] .foo NULL 0000000000000006 000000 000002 03 A 4 5 1 --- !ELF FileHeader: Class: ELFCLASS64 Data: ELFDATA2LSB Type: ET_REL Sections: - Type: SHT_NULL Name: .foo Flags: [ SHF_ALLOC ] AddressAlign: 0x1 Size: 0x2 EntSize: 0x3 Link: 4 Info: 5 Address: 0x6 ## Check that file size does not change if we redefine the Size ## of the first SHT_NULL section. # RUN: yaml2obj --docnum=4 %s -o %t4 # RUN: wc -c < %t3 > %t.txt # RUN: wc -c < %t4 >> %t.txt # RUN: FileCheck %s --input-file=%t.txt --check-prefix=SIZE # SIZE: [[FILESIZE:.*]] # SIZE: [[FILESIZE]] --- !ELF FileHeader: Class: ELFCLASS64 Data: ELFDATA2LSB Type: ET_REL Sections: - Type: SHT_NULL Name: .foo Flags: [ SHF_ALLOC ] AddressAlign: 0x1 Size: 0xFFFF EntSize: 0x3 Link: 4 Info: 5 Address: 0x6 ## Check we are still able to describe other sections too. # RUN: yaml2obj --docnum=5 %s -o %t5 # RUN: llvm-readelf --sections %t5 | FileCheck %s --check-prefix=OTHER-SECTION # 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 000040 000000 00 0 0 0 # OTHER-SECTION-NEXT: [ 2] .strtab STRTAB 0000000000000000 000040 000001 00 0 0 1 # OTHER-SECTION-NEXT: [ 3] .shstrtab STRTAB 0000000000000000 000041 000017 00 0 0 1 --- !ELF FileHeader: Class: ELFCLASS64 Data: ELFDATA2LSB Type: ET_REL Sections: - Type: SHT_NULL Name: '' Flags: [ ] AddressAlign: 0x0 Size: 0x0 EntSize: 0x0 Link: 0 - Type: SHT_PROGBITS Name: 'foo' ## Check we report an error if null section sh_link field refers to an unknown section. # RUN: not yaml2obj --docnum=6 %s -o %t6 2>&1 | FileCheck %s --check-prefix=CASE4 # CASE4: error: unknown section referenced: '.foo' by YAML section '(index 0)' # CASE4-NEXT: error: unknown section referenced: '.bar' by YAML section '(index 1)' --- !ELF FileHeader: Class: ELFCLASS64 Data: ELFDATA2LSB Type: ET_REL Sections: - Type: SHT_NULL Link: .foo - Type: SHT_NULL Link: .bar ## Check that null section fields are set to zero, if they are unspecified. # RUN: yaml2obj --docnum=7 %s -o %t7 # RUN: llvm-readelf --sections %t7 | FileCheck %s --check-prefix=DEFAULT --- !ELF FileHeader: Class: ELFCLASS64 Data: ELFDATA2LSB Type: ET_REL Sections: - Type: SHT_NULL ## Check we do not crash if we have more than one SHT_NULL section. # RUN: yaml2obj --docnum=8 %s -o %t8 # RUN: llvm-readelf --sections %t8 | FileCheck %s --check-prefix=MULTIPLE # 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 000040 000020 10 A 1 2 0 --- !ELF FileHeader: Class: ELFCLASS64 Data: ELFDATA2LSB Type: ET_REL Sections: - Type: SHT_NULL - Type: SHT_NULL Name: .foo Flags: [ SHF_ALLOC ] Size: 0x20 EntSize: 0x10 Link: 1 Info: 2 Address: 0x123 ## Check we can override the sh_offset/sh_size fields of the first SHT_NULL section if requested. # RUN: yaml2obj --docnum=9 %s -o %t9 # RUN: llvm-readelf --sections %t9 | FileCheck %s --check-prefix=OVERRIDE # OVERRIDE: Section Headers: # OVERRIDE-NEXT: [Nr] Name Type Address Off Size ES Flg Lk Inf Al # OVERRIDE-NEXT: [ 0] NULL 0000000000000000 000007 000008 00 0 0 0 --- !ELF FileHeader: Class: ELFCLASS64 Data: ELFDATA2LSB Type: ET_REL Sections: - Type: SHT_NULL Size: 0x2 ShOffset: 0x7 ShSize: 0x8 ## Check that we can set an offset for the SHT_NULL section explicitly using the "Offset" key. ## Check it affects the section header table offset. # RUN: yaml2obj --docnum=10 %s -DOFFSET=0x100 -o %t10 # RUN: llvm-readelf --headers --sections %t10 | FileCheck %s --check-prefix=EXPLICIT-OFFSET-A # RUN: yaml2obj --docnum=10 %s -DOFFSET=0x200 -o %t11 # RUN: llvm-readelf --headers --sections %t11 | FileCheck %s --check-prefix=EXPLICIT-OFFSET-B # EXPLICIT-OFFSET-A: Start of section headers: 280 (bytes into file) # EXPLICIT-OFFSET-A: [Nr] Name Type Address Off # EXPLICIT-OFFSET-A-NEXT: [ 0] NULL 0000000000000000 000100 # EXPLICIT-OFFSET-B: Start of section headers: 536 (bytes into file) # EXPLICIT-OFFSET-B: [Nr] Name Type Address Off # EXPLICIT-OFFSET-B-NEXT: [ 0] NULL 0000000000000000 000200 --- !ELF FileHeader: Class: ELFCLASS64 Data: ELFDATA2LSB Type: ET_REL Sections: - Type: SHT_NULL Offset: [[OFFSET]]