## Check how obj2yaml produces SHT_GNU_HASH section descriptions.
## Check that obj2yaml uses "Header", "BloomFilter", "HashBuckets" and "HashValues"
## tags to describe a SHT_GNU_HASH section when it has content of a correct size.
# RUN: yaml2obj --docnum=1 %s -o %t1
# RUN: obj2yaml %t1 | FileCheck %s --check-prefix=FIELDS
# FIELDS: - Name: .gnu.hash
# FIELDS-NEXT: Type: SHT_GNU_HASH
# FIELDS-NEXT: Flags: [ SHF_ALLOC ]
# FIELDS-NEXT: Header:
# FIELDS-NEXT: SymNdx: 0x1
# FIELDS-NEXT: Shift2: 0x2
# FIELDS-NEXT: BloomFilter: [ 0x3, 0x4 ]
# FIELDS-NEXT: HashBuckets: [ 0x5, 0x6, 0x7 ]
# FIELDS-NEXT: HashValues: [ 0x8, 0x9, 0xA, 0xB ]
--- !ELF
FileHeader:
Class: ELFCLASS32
Data: ELFDATA2LSB
Type: ET_DYN
Sections:
- Name: .gnu.hash
Type: SHT_GNU_HASH
Flags: [ SHF_ALLOC ]
Header:
SymNdx: 0x1
Shift2: 0x2
BloomFilter: [0x3, 0x4]
HashBuckets: [0x5, 0x6, 0x7]
HashValues: [0x8, 0x9, 0xA, 0xB]
## Check how we handle broken cases.
# RUN: yaml2obj --docnum=2 %s -o %t2
# RUN: obj2yaml %t2 | FileCheck %s --check-prefix=INVALID
# INVALID: - Name: .gnu.hash.tooshort
# INVALID-NEXT: Type: SHT_GNU_HASH
# INVALID-NEXT: Flags: [ SHF_ALLOC ]
# INVALID-NEXT: Content: 112233445566778899AABBCCDDEEFF
# INVALID-NEXT: - Name: .gnu.hash.empty
# INVALID-NEXT: Type: SHT_GNU_HASH
# INVALID-NEXT: Flags: [ SHF_ALLOC ]
# INVALID-NEXT: Address: 0xF
# INVALID-NEXT: Header:
# INVALID-NEXT: SymNdx: 0x0
# INVALID-NEXT: Shift2: 0x0
# INVALID-NEXT: BloomFilter: [ ]
# INVALID-NEXT: HashBuckets: [ ]
# INVALID-NEXT: HashValues: [ ]
# INVALID-NEXT: - Name: .gnu.hash.broken.maskwords
# INVALID-NEXT: Type: SHT_GNU_HASH
# INVALID-NEXT: Content: '00000000000000000100000000000000'
# INVALID-NEXT: - Name: .gnu.hash.broken.nbuckets.a
# INVALID-NEXT: Type: SHT_GNU_HASH
# INVALID-NEXT: Content: '01000000000000000000000000000000'
# INVALID-NEXT: - Name: .gnu.hash.broken.nbuckets.b
# INVALID-NEXT: Type: SHT_GNU_HASH
# INVALID-NEXT: Content: FFFFFFFF000000000100000000000000{{$}}
# INVALID-NEXT: - Name: .gnu.hash.hashvalues.ok
# INVALID-NEXT: Type: SHT_GNU_HASH
# INVALID-NEXT: Header:
# INVALID-NEXT: SymNdx: 0x0
# INVALID-NEXT: Shift2: 0x0
# INVALID-NEXT: BloomFilter: [ ]
# INVALID-NEXT: HashBuckets: [ ]
# INVALID-NEXT: HashValues: [ 0x0 ]
# INVALID-NEXT: - Name: .gnu.hash.hashvalues.fail
# INVALID-NEXT: Type: SHT_GNU_HASH
# INVALID-NEXT: Content: '000000000000000000000000000000000000000000'
--- !ELF
FileHeader:
Class: ELFCLASS32
Data: ELFDATA2LSB
Type: ET_DYN
Sections:
## Case 1: Content is less than 16 bytes.
- Name: .gnu.hash.tooshort
Type: SHT_GNU_HASH
Flags: [ SHF_ALLOC ]
Content: "112233445566778899AABBCCDDEEFF"
## Case2: Check how we handle a fully empty hash section.
## It is almost technically valid, but uncommon. Modern linkers
## create at least one entry in Bloom filter if they want to disable it.
## Also, the dynamic symbol table has a null entry and having SymNdx = 0
## here is at least strange.
- Name: .gnu.hash.empty
Type: SHT_GNU_HASH
Flags: [ SHF_ALLOC ]
Header:
SymNdx: 0x0
Shift2: 0x0
MaskWords: 0x0
NBuckets: 0x0
BloomFilter: []
HashBuckets: []
HashValues: []
## Case 3: MaskWords field is broken: it says that the number of entries
## in the Bloom filter is 1, but the Bloom filter is empty.
- Name: .gnu.hash.broken.maskwords
Type: SHT_GNU_HASH
Header:
SymNdx: 0x0
Shift2: 0x0
MaskWords: 0x1
NBuckets: 0x0
BloomFilter: []
HashBuckets: []
HashValues: []
## Case 4(a): NBuckets field is broken, it says that the number of entries
## in the hash buckets is 1, but it is empty.
- Name: .gnu.hash.broken.nbuckets.a
Type: SHT_GNU_HASH
Header:
SymNdx: 0x0
Shift2: 0x0
MaskWords: 0x0
NBuckets: 0x1
BloomFilter: []
HashBuckets: []
HashValues: []
## Case 4(b): NBuckets = 0xFFFFFFFF is incorrect. The result will cause 32-bit
## unsigned overflows if we keep intermediate expressions uint32_t.
- Name: .gnu.hash.broken.nbuckets.b
Type: SHT_GNU_HASH
Header:
SymNdx: 0x0
Shift2: 0x0
MaskWords: 0x1
NBuckets: 0xFFFFFFFF
BloomFilter: []
HashBuckets: []
HashValues: []
## Case 5: Check that we use the various properties to dump the data when it
## has a size that is a multiple of 4, but fallback to dumping the whole section
## using the "Content" property otherwise.
- Name: .gnu.hash.hashvalues.ok
Type: SHT_GNU_HASH
Content: "0000000000000000000000000000000000000000"
- Name: .gnu.hash.hashvalues.fail
Type: SHT_GNU_HASH
Content: "000000000000000000000000000000000000000000"