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