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