| ## Check how yaml2obj produces SHT_GNU_HASH sections. |
| |
| ## Check we can describe a SHT_GNU_HASH section using the "Content" tag. |
| ## Check we set sh_link to index of the .dynsym by default. |
| |
| # RUN: yaml2obj --docnum=1 %s -o %t1 |
| # RUN: llvm-readobj --sections --section-data %t1 | FileCheck %s --check-prefix=CONTENT |
| |
| # CONTENT: Name: .gnu.hash |
| # CONTENT-NEXT: Type: SHT_GNU_HASH |
| # CONTENT-NEXT: Flags [ |
| # CONTENT-NEXT: ] |
| # CONTENT-NEXT: Address: 0x0 |
| # CONTENT-NEXT: Offset: 0x40 |
| # CONTENT-NEXT: Size: 3 |
| # CONTENT-NEXT: Link: 2 |
| # CONTENT-NEXT: Info: 0 |
| # CONTENT-NEXT: AddressAlignment: 0 |
| # CONTENT-NEXT: EntrySize: 0 |
| # CONTENT-NEXT: SectionData ( |
| # CONTENT-NEXT: 0000: 001122 | |
| # CONTENT-NEXT: ) |
| # CONTENT: Index: 2 |
| # CONTENT-NEXT: Name: .dynsym (9) |
| |
| --- !ELF |
| FileHeader: |
| Class: ELFCLASS64 |
| Data: ELFDATA2LSB |
| Type: ET_DYN |
| Machine: EM_X86_64 |
| Sections: |
| - Name: .gnu.hash |
| Type: SHT_GNU_HASH |
| Content: "001122" |
| ## Used to trigger .dynsym creation. |
| DynamicSymbols: [] |
| |
| ## Check we can use "Header", "BloomFilter", "HashBuckets" and "HashValues" keys to describe |
| ## the hash section. Check we can set sh_link to any arbitrary value. Check both ELFCLASS32 and 64 bit output. |
| |
| # RUN: yaml2obj --docnum=2 %s -o %t2 |
| # RUN: yaml2obj --docnum=3 %s -o %t3 |
| # RUN: llvm-readobj --sections --section-data %t2 | FileCheck %s --check-prefix=CONTENT32 |
| # RUN: llvm-readobj --sections --section-data %t3 | FileCheck %s --check-prefix=CONTENT64 |
| |
| # CONTENT32: Name: .gnu.hash |
| # CONTENT32-NEXT: Type: SHT_GNU_HASH |
| # CONTENT32-NEXT: Flags [ |
| # CONTENT32-NEXT: SHF_ALLOC |
| # CONTENT32-NEXT: ] |
| # CONTENT32-NEXT: Address: 0x0 |
| # CONTENT32-NEXT: Offset: 0x34 |
| # CONTENT32-NEXT: Size: 52 |
| # CONTENT32-NEXT: Link: 254 |
| # CONTENT32-NEXT: Info: 0 |
| # CONTENT32-NEXT: AddressAlignment: 0 |
| # CONTENT32-NEXT: EntrySize: 0 |
| # CONTENT32-NEXT: SectionData ( |
| # CONTENT32-NEXT: 0000: 03000000 01000000 02000000 02000000 | |
| # CONTENT32-NEXT: 0010: 03000000 04000000 05000000 06000000 | |
| # CONTENT32-NEXT: 0020: 07000000 08000000 09000000 0A000000 | |
| # CONTENT32-NEXT: 0030: 0B000000 | |
| # CONTENT32-NEXT: ) |
| |
| # CONTENT64: Name: .gnu.hash |
| # CONTENT64-NEXT: Type: SHT_GNU_HASH |
| # CONTENT64-NEXT: Flags [ |
| # CONTENT64-NEXT: SHF_ALLOC |
| # CONTENT64-NEXT: ] |
| # CONTENT64-NEXT: Address: 0x0 |
| # CONTENT64-NEXT: Offset: 0x40 |
| # CONTENT64-NEXT: Size: 60 |
| # CONTENT64-NEXT: Link: 254 |
| # CONTENT64-NEXT: Info: 0 |
| # CONTENT64-NEXT: AddressAlignment: 0 |
| # CONTENT64-NEXT: EntrySize: 0 |
| # CONTENT64-NEXT: SectionData ( |
| # CONTENT64-NEXT: 0000: 03000000 01000000 02000000 02000000 | |
| # CONTENT64-NEXT: 0010: 03000000 00000000 04000000 00000000 | |
| # CONTENT64-NEXT: 0020: 05000000 06000000 07000000 08000000 | |
| # CONTENT64-NEXT: 0030: 09000000 0A000000 0B000000 | |
| # CONTENT64-NEXT: ) |
| |
| --- !ELF |
| FileHeader: |
| Class: ELFCLASS32 |
| Data: ELFDATA2LSB |
| Type: ET_DYN |
| Machine: EM_386 |
| 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] |
| Link: 0xFE |
| |
| --- !ELF |
| FileHeader: |
| Class: ELFCLASS64 |
| Data: ELFDATA2LSB |
| Type: ET_DYN |
| Machine: EM_X86_64 |
| 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] |
| Link: 0xFE |
| |
| ## Check we only can use "Header", "BloomFilter", "HashBuckets" and "HashValues" together. |
| |
| # RUN: not yaml2obj --docnum=4 %s -o %t4 2>&1 | FileCheck %s --check-prefix=ERR |
| # RUN: not yaml2obj --docnum=5 %s -o %t5 2>&1 | FileCheck %s --check-prefix=ERR |
| # RUN: not yaml2obj --docnum=6 %s -o %t6 2>&1 | FileCheck %s --check-prefix=ERR |
| # RUN: not yaml2obj --docnum=7 %s -o %t7 2>&1 | FileCheck %s --check-prefix=ERR |
| |
| # ERR: error: "Header", "BloomFilter", "HashBuckets" and "HashValues" must be used together |
| |
| --- !ELF |
| FileHeader: |
| Class: ELFCLASS64 |
| Data: ELFDATA2LSB |
| Type: ET_DYN |
| Machine: EM_X86_64 |
| Sections: |
| - Name: .gnu.hash.no.header |
| Type: SHT_GNU_HASH |
| BloomFilter: [] |
| HashBuckets: [] |
| HashValues: [] |
| |
| --- !ELF |
| FileHeader: |
| Class: ELFCLASS64 |
| Data: ELFDATA2LSB |
| Type: ET_DYN |
| Machine: EM_X86_64 |
| Sections: |
| - Name: .gnu.hash.no.bloomfilter |
| Type: SHT_GNU_HASH |
| Header: |
| SymNdx: 0x0 |
| Shift2: 0x0 |
| HashBuckets: [] |
| HashValues: [] |
| |
| --- !ELF |
| FileHeader: |
| Class: ELFCLASS64 |
| Data: ELFDATA2LSB |
| Type: ET_DYN |
| Machine: EM_X86_64 |
| Sections: |
| - Name: .gnu.hash.no.nobuckets |
| Type: SHT_GNU_HASH |
| Header: |
| SymNdx: 0x0 |
| Shift2: 0x0 |
| BloomFilter: [] |
| HashValues: [] |
| |
| --- !ELF |
| FileHeader: |
| Class: ELFCLASS64 |
| Data: ELFDATA2LSB |
| Type: ET_DYN |
| Machine: EM_X86_64 |
| Sections: |
| - Name: .gnu.hash.no.novalues |
| Type: SHT_GNU_HASH |
| Header: |
| SymNdx: 0x0 |
| Shift2: 0x0 |
| BloomFilter: [] |
| HashBuckets: [] |
| |
| ## Check that "SymNdx" and "Shift2" fields are mandatory when we specify the "Header". |
| |
| # RUN: not yaml2obj --docnum=8 %s -o %t8 2>&1 | FileCheck %s --check-prefix=ERR2 |
| # ERR2: error: missing required key 'SymNdx' |
| |
| # RUN: not yaml2obj --docnum=9 %s -o %t9 2>&1 | FileCheck %s --check-prefix=ERR3 |
| # ERR3: error: missing required key 'Shift2' |
| |
| --- !ELF |
| FileHeader: |
| Class: ELFCLASS64 |
| Data: ELFDATA2LSB |
| Type: ET_DYN |
| Machine: EM_X86_64 |
| Sections: |
| - Name: .gnu.hash |
| Type: SHT_GNU_HASH |
| Header: |
| Shift2: 0x0 |
| |
| --- !ELF |
| FileHeader: |
| Class: ELFCLASS64 |
| Data: ELFDATA2LSB |
| Type: ET_DYN |
| Machine: EM_X86_64 |
| Sections: |
| - Name: .gnu.hash |
| Type: SHT_GNU_HASH |
| Header: |
| SymNdx: 0x0 |
| |
| ## Either "Content" or "Header", "BloomFilter", "HashBuckets" and "HashBuckets" must be |
| ## specified when declaring a SHT_GNU_HASH section. |
| |
| # RUN: not yaml2obj --docnum=10 %s -o %t10 2>&1 | FileCheck %s --check-prefix=NOKEYS |
| |
| # NOKEYS: error: either "Content" or "Header", "BloomFilter", "HashBuckets" and "HashBuckets" must be specified |
| |
| --- !ELF |
| FileHeader: |
| Class: ELFCLASS64 |
| Data: ELFDATA2LSB |
| Type: ET_DYN |
| Machine: EM_X86_64 |
| Sections: |
| - Name: .gnu.hash |
| Type: SHT_GNU_HASH |
| |
| ## Test that "Header", "BloomFilter", "HashBuckets" and "HashValues" can't be used together with "Content". |
| |
| # RUN: not yaml2obj --docnum=11 %s -o %t11 2>&1 | FileCheck %s --check-prefix=TOGETHER |
| |
| # TOGETHER: error: "Header", "BloomFilter", "HashBuckets" and "HashValues" can't be used together with "Content" |
| |
| --- !ELF |
| FileHeader: |
| Class: ELFCLASS32 |
| Data: ELFDATA2LSB |
| Type: ET_DYN |
| Machine: EM_386 |
| Sections: |
| - Name: .gnu.hash |
| Type: SHT_GNU_HASH |
| Content: "" |
| Header: |
| SymNdx: 0x0 |
| Shift2: 0x0 |
| BloomFilter: [] |
| HashBuckets: [] |
| HashValues: [] |
| |
| ## Test we can override the number of buckets and the number of words in the Bloom filter |
| ## using the "NBuckets" and "Shift2" keys. |
| |
| # RUN: yaml2obj --docnum=12 %s -o %t12 |
| # RUN: llvm-readobj --sections --section-data %t12 | FileCheck %s --check-prefix=OVERRIDE-CONTENT |
| |
| # OVERRIDE-CONTENT: Name: .gnu.hash |
| # OVERRIDE-CONTENT: SectionData ( |
| # OVERRIDE-CONTENT-NEXT: 0000: 01000000 02000000 03000000 04000000 | |
| # OVERRIDE-CONTENT-NEXT: ) |
| |
| --- !ELF |
| FileHeader: |
| Class: ELFCLASS32 |
| Data: ELFDATA2LSB |
| Type: ET_DYN |
| Machine: EM_386 |
| Sections: |
| Sections: |
| - Name: .gnu.hash |
| Type: SHT_GNU_HASH |
| Header: |
| NBuckets: 0x1 |
| SymNdx: 0x2 |
| MaskWords: 0x3 |
| Shift2: 0x4 |
| BloomFilter: [] |
| HashBuckets: [] |
| HashValues: [] |