mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 03:02:36 +01:00
5403a31116
This change merges llvm-elfabi and llvm-ifs tools. Differential Revision: https://reviews.llvm.org/D100139
116 lines
3.9 KiB
Plaintext
116 lines
3.9 KiB
Plaintext
## 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
|