234 lines
7.9 KiB
Plaintext
234 lines
7.9 KiB
Plaintext
## Check how the SHT_HASH section is dumped with --hash-table.
|
|
|
|
# RUN: yaml2obj --docnum=1 -DBITS=64 -DMACHINE=EM_X86_64 %s -o %t.x64
|
|
# RUN: yaml2obj --docnum=1 -DBITS=32 -DMACHINE=EM_386 %s -o %t.x32
|
|
|
|
# RUN: llvm-readobj --hash-table %t.x64 | FileCheck %s --check-prefix=HASH
|
|
# RUN: llvm-readelf --hash-table %t.x64 | FileCheck %s --check-prefix=HASH
|
|
|
|
# RUN: llvm-readobj --hash-table %t.x32 | FileCheck %s --check-prefix=HASH
|
|
# RUN: llvm-readelf --hash-table %t.x32 | FileCheck %s --check-prefix=HASH
|
|
|
|
# HASH: HashTable {
|
|
# HASH-NEXT: Num Buckets: 2
|
|
# HASH-NEXT: Num Chains: 3
|
|
# HASH-NEXT: Buckets: [1, 2]
|
|
# HASH-NEXT: Chains: [3, 4, 5]
|
|
# HASH-NEXT: }
|
|
|
|
--- !ELF
|
|
FileHeader:
|
|
Class: ELFCLASS[[BITS]]
|
|
Data: ELFDATA2LSB
|
|
Type: ET_DYN
|
|
Machine: [[MACHINE]]
|
|
Sections:
|
|
- Name: .hash
|
|
Type: SHT_HASH
|
|
Flags: [ SHF_ALLOC ]
|
|
Bucket: [ 1, 2 ]
|
|
Chain: [ 3, 4, 5 ]
|
|
- Name: .dynamic
|
|
Type: SHT_DYNAMIC
|
|
Flags: [ SHF_ALLOC ]
|
|
Entries:
|
|
- Tag: DT_HASH
|
|
Value: 0x0
|
|
- Tag: DT_NULL
|
|
Value: 0x0
|
|
ProgramHeaders:
|
|
- Type: PT_LOAD
|
|
Sections:
|
|
- Section: .hash
|
|
- Section: .dynamic
|
|
|
|
## Check we can dump the SHT_HASH section even when an object
|
|
## does not have the section header table.
|
|
|
|
# RUN: yaml2obj --docnum=2 %s -o %t.noshdr
|
|
# RUN: llvm-readobj --hash-table %t.noshdr | FileCheck %s --check-prefix=NOSHDR
|
|
# RUN: llvm-readelf --hash-table %t.noshdr | FileCheck %s --check-prefix=NOSHDR
|
|
|
|
# NOSHDR: HashTable {
|
|
# NOSHDR-NEXT: Num Buckets: 1
|
|
# NOSHDR-NEXT: Num Chains: 1
|
|
# NOSHDR-NEXT: Buckets: [0]
|
|
# NOSHDR-NEXT: Chains: [1]
|
|
# NOSHDR-NEXT: }
|
|
|
|
--- !ELF
|
|
FileHeader:
|
|
Class: ELFCLASS64
|
|
Data: ELFDATA2LSB
|
|
Type: ET_DYN
|
|
## We simulate no section header table by
|
|
## overriding the ELF header properties.
|
|
EShOff: 0x0
|
|
EShNum: 0x0
|
|
Sections:
|
|
- Name: .hash
|
|
Type: SHT_HASH
|
|
Flags: [ SHF_ALLOC ]
|
|
Bucket: [ 0 ]
|
|
Chain: [ 1 ]
|
|
- Name: .dynamic
|
|
Type: SHT_DYNAMIC
|
|
Flags: [ SHF_ALLOC ]
|
|
Entries:
|
|
- Tag: DT_HASH
|
|
Value: 0x0
|
|
- Tag: DT_NULL
|
|
Value: 0x0
|
|
ProgramHeaders:
|
|
- Type: PT_LOAD
|
|
Sections:
|
|
- Section: .hash
|
|
- Section: .dynamic
|
|
- Type: PT_DYNAMIC
|
|
VAddr: 0x1010
|
|
Sections:
|
|
- Section: .dynamic
|
|
|
|
## Each SHT_HASH section starts with two 32-bit fields: nbucket and nchain.
|
|
## Check we report an error when a DT_HASH value points to data that has size less than 8 bytes.
|
|
|
|
# RUN: yaml2obj --docnum=3 %s -o %t4.o
|
|
# RUN: llvm-readelf --hash-table %t4.o 2>&1 | FileCheck %s --check-prefix=ERR1 -DFILE=%t4.o
|
|
# RUN: llvm-readobj --hash-table %t4.o 2>&1 | FileCheck %s --check-prefix=ERR1 -DFILE=%t4.o
|
|
|
|
# ERR1: HashTable {
|
|
# ERR1-NEXT: warning: '[[FILE]]': the hash table at offset 0x2b1 goes past the end of the file (0x2b8){{$}}
|
|
# ERR1-NEXT: }
|
|
|
|
--- !ELF
|
|
FileHeader:
|
|
Class: ELFCLASS64
|
|
Data: ELFDATA2LSB
|
|
Type: ET_DYN
|
|
Sections:
|
|
- Name: .hash
|
|
Type: SHT_HASH
|
|
Flags: [ SHF_ALLOC ]
|
|
Bucket: [ 0 ]
|
|
Chain: [ 0 ]
|
|
- Name: .dynamic
|
|
Type: SHT_DYNAMIC
|
|
Flags: [ SHF_WRITE, SHF_ALLOC ]
|
|
Entries:
|
|
- Tag: DT_HASH
|
|
Value: 0x239
|
|
- Tag: DT_NULL
|
|
Value: 0x0
|
|
DynamicSymbols: []
|
|
ProgramHeaders:
|
|
- Type: PT_LOAD
|
|
FileSize: 0x23a
|
|
Sections:
|
|
- Section: .hash
|
|
- Section: .dynamic
|
|
|
|
## Check we report a warning when the hash table goes past the end of the file.
|
|
|
|
## Case A.1: the hash table ends right before the EOF. We have a broken nbucket
|
|
## field that has a value larger than the number of buckets.
|
|
# RUN: yaml2obj --docnum=4 %s -o %t5.1.o -DNBUCKET=0x5d -DNCHAIN=0x1
|
|
# RUN: llvm-readelf --hash-table %t5.1.o 2>&1 | \
|
|
# RUN: FileCheck %s --check-prefix=NOERR1 --implicit-check-not="warning:"
|
|
# RUN: llvm-readobj --hash-table %t5.1.o 2>&1 | \
|
|
# RUN: FileCheck %s --check-prefix=NOERR1 --implicit-check-not="warning:"
|
|
|
|
# NOERR1: HashTable {
|
|
# NOERR1-NEXT: Num Buckets: 93
|
|
# NOERR1-NEXT: Num Chains: 1
|
|
## Here we would dump the rest of the file as buckets array because we have a broken nbucket field.
|
|
## No need to check what we dump, we only want to test that we have no unexpected warnings/crashes.
|
|
# NOERR1-NEXT: Buckets:
|
|
# NOERR1-NEXT: Chains: [0]
|
|
# NOERR1-NEXT: }
|
|
|
|
## Case A.2: the hash table ends 1 byte past the EOF. We have a broken nbucket
|
|
## field that has a value larger than the number of buckets.
|
|
# RUN: yaml2obj --docnum=4 %s -o %t5.2.o -DNBUCKET=0x5e -DNCHAIN=0x1
|
|
# RUN: llvm-readelf --hash-table %t5.2.o 2>&1 | \
|
|
# RUN: FileCheck %s --check-prefix=ERR2 -DFILE=%t5.2.o --implicit-check-not="warning:"
|
|
# RUN: llvm-readobj --hash-table %t5.2.o 2>&1 | \
|
|
# RUN: FileCheck %s --check-prefix=ERR2 -DFILE=%t5.2.o --implicit-check-not="warning:"
|
|
|
|
# ERR2: HashTable {
|
|
# ERR2: Num Buckets: 94
|
|
# ERR2: Num Chains: 1
|
|
# ERR2-NEXT: warning: '[[FILE]]': the hash table at offset 0x54 goes past the end of the file (0x1d4), nbucket = 94, nchain = 1{{$}}
|
|
# ERR2-NEXT: }
|
|
|
|
## Case B.1: the hash table ends right before the EOF. We have a broken nchain
|
|
## field that has a value larger than the number of chains.
|
|
# RUN: yaml2obj --docnum=4 %s -o %t5.3.o -DNBUCKET=0x1 -DNCHAIN=0x5d
|
|
# RUN: llvm-readelf --hash-table %t5.3.o 2>&1 | \
|
|
# RUN: FileCheck %s --check-prefix=NOERR2 -DFILE=%t5.3.o --implicit-check-not="warning:"
|
|
# RUN: llvm-readobj --hash-table %t5.3.o 2>&1 | \
|
|
# RUN: FileCheck %s --check-prefix=NOERR2 -DFILE=%t5.3.o --implicit-check-not="warning:"
|
|
|
|
# NOERR2: warning: '[[FILE]]': hash table nchain (93) differs from symbol count derived from SHT_DYNSYM section header (1)
|
|
# NOERR2: HashTable {
|
|
# NOERR2-NEXT: Num Buckets: 1
|
|
# NOERR2-NEXT: Num Chains: 93
|
|
# NOERR2-NEXT: Buckets: [0]
|
|
## Here we would dump the rest of the file as chain array because we have a broken nchain field.
|
|
## No need to check what we dump, we only want to test that we have no unexpected warnings/crashes.
|
|
# NOERR2-NEXT: Chains:
|
|
# NOERR2-NEXT: }
|
|
|
|
## Case B.2: the hash table ends 1 byte past the EOF. We have a broken nchain
|
|
## field that has a value larger than the number of chains.
|
|
# RUN: yaml2obj --docnum=4 %s -o %t5.4.o -DNBUCKET=0x1 -DNCHAIN=0x5e
|
|
# RUN: llvm-readelf --hash-table %t5.4.o 2>&1 | \
|
|
# RUN: FileCheck %s --check-prefix=ERR3 -DFILE=%t5.4.o --implicit-check-not="warning:"
|
|
# RUN: llvm-readobj --hash-table %t5.4.o 2>&1 | \
|
|
# RUN: FileCheck %s --check-prefix=ERR3 -DFILE=%t5.4.o --implicit-check-not="warning:"
|
|
|
|
# ERR3: warning: '[[FILE]]': hash table nchain (94) differs from symbol count derived from SHT_DYNSYM section header (1)
|
|
# ERR3: HashTable {
|
|
# ERR3-NEXT: Num Buckets: 1
|
|
# ERR3-NEXT: Num Chains: 94
|
|
# ERR3-NEXT: warning: '[[FILE]]': the hash table at offset 0x54 goes past the end of the file (0x1d4), nbucket = 1, nchain = 94{{$}}
|
|
# ERR3-NEXT: }
|
|
|
|
--- !ELF
|
|
FileHeader:
|
|
Class: ELFCLASS32
|
|
Data: ELFDATA2LSB
|
|
Type: ET_DYN
|
|
Sections:
|
|
- Name: .hash
|
|
Type: SHT_HASH
|
|
Flags: [ SHF_ALLOC ]
|
|
Bucket: [ 0 ]
|
|
NBucket: [[NBUCKET]]
|
|
Chain: [ 0 ]
|
|
NChain: [[NCHAIN]]
|
|
- Name: .dynamic
|
|
Type: SHT_DYNAMIC
|
|
Flags: [ SHF_WRITE, SHF_ALLOC ]
|
|
Entries:
|
|
- Tag: DT_HASH
|
|
Value: 0x0
|
|
- Tag: DT_NULL
|
|
Value: 0x0
|
|
DynamicSymbols: []
|
|
ProgramHeaders:
|
|
- Type: PT_LOAD
|
|
Sections:
|
|
- Section: .hash
|
|
- Section: .dynamic
|
|
|
|
## Show we do not duplicate warnings when printing both the hash table and the hash histogram.
|
|
## Note that --elf-hash-histogram is only implemented for llvm-readelf currently.
|
|
# RUN: yaml2obj --docnum=3 %s -o %t4.o
|
|
# RUN: llvm-readelf --hash-table --elf-hash-histogram %t4.o 2>&1 \
|
|
# RUN: | FileCheck %s --check-prefix=SINGLE-WARN -DFILE=%t4.o --implicit-check-not="warning:"
|
|
|
|
# SINGLE-WARN: warning: '[[FILE]]': hash table nchain (0) differs from symbol count derived from SHT_DYNSYM section header (1)
|
|
# SINGLE-WARN-NEXT: HashTable {
|
|
# SINGLE-WARN-NEXT: warning: '[[FILE]]': the hash table at offset 0x2b1 goes past the end of the file (0x2b8)
|
|
# SINGLE-WARN-NEXT: }
|