| ## Test reading ELF with .dynsym under the following conditions: |
| ## * Section headers are available. |
| ## * Section headers are stripped but there is a DT_GNU_HASH dynamic tag. |
| ## * Section headers are stripped but there is a DT_HASH dynamic tag. |
| |
| ## Test if llvm-ifs reads DT_SYMTAB size through section headers by puting the wrong terminator in DT_GNU_HASH. |
| # RUN: yaml2obj %s -o %tfull -DGNUHASHVALUE="[0x9]" -DTAG1="DT_GNU_HASH" -DVAL1="0xC00" |
| # RUN: llvm-ifs --input-format=ELF --output-format=IFS --output=- %tfull | FileCheck %s |
| |
| ## Test if llvm-ifs fails to read DT_SYMTAB size through section headers when the value of sh_entsize is invalid. |
| # RUN: yaml2obj %s -o %tfull -DGNUHASHVALUE="[0x9]" -DTAG1="DT_GNU_HASH" -DVAL1="0xC00" -DENTSIZE="0x19" |
| # RUN: not llvm-ifs --input-format=ELF --output-format=IFS --output=- %tfull 2>&1 | FileCheck %s --check-prefix=BADENTSIZE |
| |
| ## Test if llvm-ifs reads DT_SYMTAB size through DT_GNU_HASH. |
| # RUN: yaml2obj %s -o %tw.gnu.hash -DGNUHASHVALUE="[0x8, 0x9]" -DTAG1="DT_GNU_HASH" -DVAL1="0xC00" -DNOHEADER="true" |
| # RUN: llvm-ifs --input-format=ELF --output-format=IFS --output=- %tw.gnu.hash | FileCheck %s |
| |
| ## Test if llvm-ifs fails to read DT_SYMTAB size through DT_GNU_HASH when there is no terminator. |
| # RUN: yaml2obj %s -o %tw.gnu.hash -DGNUHASHVALUE="[0x8, 0xA]" -DTAG1="DT_GNU_HASH" -DVAL1="0xC00" -DNOHEADER="true" |
| # RUN: not llvm-ifs --input-format=ELF --output-format=IFS --output=- %tw.gnu.hash 2>&1 | FileCheck %s --check-prefix=NOTERMINATOR |
| |
| # CHECK: --- !ifs-v1 |
| # CHECK-NEXT: IfsVersion: 3.0 |
| # CHECK-NEXT: Target: { ObjectFormat: ELF, Arch: AArch64, Endianness: little, BitWidth: 64 } |
| # CHECK-NEXT: Symbols: |
| # CHECK-NEXT: - { Name: bar, Type: Object, Size: 0, Undefined: true } |
| # CHECK-NEXT: - { Name: foo, Type: Func, Undefined: true } |
| # CHECK-NEXT: ... |
| |
| # BADENTSIZE: SHT_DYNSYM section has sh_size (72) % sh_entsize (25) that is not 0 |
| |
| # NOTERMINATOR: error: no terminator found for GNU hash section before buffer end |
| |
| --- !ELF |
| FileHeader: |
| Class: ELFCLASS64 |
| Data: ELFDATA2LSB |
| Type: ET_DYN |
| Machine: EM_AARCH64 |
| Sections: |
| - Name: .text |
| Type: SHT_PROGBITS |
| - Name: .data |
| Type: SHT_PROGBITS |
| - Name: .strtab |
| Type: SHT_STRTAB |
| - Name: .shstrtab |
| Type: SHT_STRTAB |
| - Name: .dynsym |
| Type: SHT_DYNSYM |
| Flags: [ SHF_ALLOC ] |
| EntSize: [[ENTSIZE=0x18]] |
| Address: 0x400 |
| AddressAlign: 0x400 |
| - Name: .dynstr |
| Type: SHT_STRTAB |
| Flags: [ SHF_ALLOC ] |
| Address: 0x600 |
| AddressAlign: 0x200 |
| - Name: .dynamic |
| Type: SHT_DYNAMIC |
| Flags: [ SHF_ALLOC ] |
| Address: 0x800 |
| AddressAlign: 0x200 |
| Entries: |
| - Tag: DT_STRTAB |
| Value: 0x600 |
| - Tag: DT_STRSZ |
| Value: 9 |
| - Tag: DT_SYMTAB |
| Value: 0x400 |
| - Tag: [[TAG1]] |
| Value: [[VAL1]] |
| - Tag: DT_NULL |
| Value: 0 |
| - Name: .hash |
| Type: SHT_HASH |
| Flags: [ SHF_ALLOC ] |
| Address: 0xA00 |
| AddressAlign: 0x200 |
| Bucket: [ 1 ] |
| Chain: [ 1, 2, 3 ] |
| - Name: .gnu.hash |
| Type: SHT_GNU_HASH |
| Flags: [ SHF_ALLOC ] |
| Address: 0xC00 |
| AddressAlign: 0x200 |
| Header: |
| SymNdx: 0x1 |
| Shift2: 0x2 |
| MaskWords: 2 |
| NBuckets: 2 |
| BloomFilter: [0x3, 0x4] |
| HashBuckets: [0x0, 0x1] |
| HashValues: [[GNUHASHVALUE]] |
| - Type: SectionHeaderTable |
| NoHeaders: [[NOHEADER=false]] |
| DynamicSymbols: |
| - Name: foo |
| Type: STT_FUNC |
| Value: 0x100 |
| Binding: 1 |
| - Name: bar |
| Type: STT_OBJECT |
| Value: 0x200 |
| Binding: 1 |
| ProgramHeaders: |
| - Type: PT_LOAD |
| VAddr: 0x400 |
| FirstSec: .dynsym |
| LastSec: .gnu.hash |
| - Type: PT_DYNAMIC |
| VAddr: 0x800 |
| FirstSec: .dynamic |
| LastSec: .dynamic |