| ## 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]] |