## 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-ifs=- %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-ifs=- %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-ifs=- %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-ifs=- %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