| ## 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 |
| 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 |
| 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 |
| 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 |
| Sections: |
| - Name: .gnu.hash.no.header |
| Type: SHT_GNU_HASH |
| BloomFilter: [] |
| HashBuckets: [] |
| HashValues: [] |
| |
| --- !ELF |
| FileHeader: |
| Class: ELFCLASS64 |
| Data: ELFDATA2LSB |
| Type: ET_DYN |
| 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 |
| 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 |
| 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 |
| Sections: |
| - Name: .gnu.hash |
| Type: SHT_GNU_HASH |
| Header: |
| Shift2: 0x0 |
| |
| --- !ELF |
| FileHeader: |
| Class: ELFCLASS64 |
| Data: ELFDATA2LSB |
| Type: ET_DYN |
| Sections: |
| - Name: .gnu.hash |
| Type: SHT_GNU_HASH |
| Header: |
| SymNdx: 0x0 |
| |
| ## Check we emit an empty section if neither "Content", "Header", |
| ## "BloomFilter", "HashBuckets" nor "HashBuckets" were set. |
| |
| # NOKEYS: Section Headers: |
| # NOKEYS: [Nr] Name Type Address Off Size |
| # NOKEYS: [ 1] .gnu.hash GNU_HASH 0000000000000000 000040 000000 |
| |
| # RUN: yaml2obj --docnum=10 %s -o %t10 |
| # RUN: llvm-readelf --sections %t10 | FileCheck %s --check-prefix=NOKEYS |
| |
| --- !ELF |
| FileHeader: |
| Class: ELFCLASS64 |
| Data: ELFDATA2LSB |
| Type: ET_DYN |
| Sections: |
| - Name: .gnu.hash |
| Type: SHT_GNU_HASH |
| |
| ## Test that "Header", "BloomFilter", "HashBuckets" and "HashValues" can't be used together with the "Content" or "Size" |
| |
| # RUN: not yaml2obj --docnum=11 -DCONTENT="" %s 2>&1 | FileCheck %s --check-prefix=TOGETHER |
| # RUN: not yaml2obj --docnum=11 -DSIZE=0 %s 2>&1 | FileCheck %s --check-prefix=TOGETHER |
| # TOGETHER: error: "Header", "BloomFilter", "HashBuckets" and "HashValues" cannot be used with "Content" or "Size" |
| |
| --- !ELF |
| FileHeader: |
| Class: ELFCLASS32 |
| Data: ELFDATA2LSB |
| Type: ET_DYN |
| Sections: |
| - Name: .gnu.hash |
| Type: SHT_GNU_HASH |
| Content: [[CONTENT=<none>]] |
| Size: [[SIZE=<none>]] |
| 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 |
| Sections: |
| - Name: .gnu.hash |
| Type: SHT_GNU_HASH |
| Header: |
| NBuckets: 0x1 |
| SymNdx: 0x2 |
| MaskWords: 0x3 |
| Shift2: 0x4 |
| BloomFilter: [] |
| HashBuckets: [] |
| HashValues: [] |
| |
| ## Check we can use the "Content" key with the "Size" key when the size is greater |
| ## than or equal to the content size. |
| |
| # RUN: not yaml2obj --docnum=13 -DSIZE=1 -DCONTENT="'0011'" %s 2>&1 | \ |
| # RUN: FileCheck %s --check-prefix=CONTENT-SIZE-ERR |
| |
| # CONTENT-SIZE-ERR: error: Section size must be greater than or equal to the content size |
| |
| --- !ELF |
| FileHeader: |
| Class: ELFCLASS64 |
| Data: ELFDATA2LSB |
| Type: ET_DYN |
| Sections: |
| - Name: .gnu.hash |
| Type: SHT_GNU_HASH |
| Size: [[SIZE=<none>]] |
| Content: [[CONTENT=<none>]] |
| |
| # RUN: yaml2obj --docnum=13 -DSIZE=2 -DCONTENT="'0011'" %s -o %t.cont.size.eq.o |
| # RUN: llvm-readobj --sections --section-data %t.cont.size.eq.o | \ |
| # RUN: FileCheck %s --check-prefix=CHECK-CONTENT -DDATA="0011" |
| |
| # RUN: yaml2obj --docnum=13 -DSIZE=3 -DCONTENT="'0011'" %s -o %t.cont.size.gr.o |
| # RUN: llvm-readobj --sections --section-data %t.cont.size.gr.o | \ |
| # RUN: FileCheck %s --check-prefix=CHECK-CONTENT -DDATA="001100" |
| |
| # CHECK-CONTENT: Name: .gnu.hash |
| # CHECK-CONTENT: SectionData ( |
| # CHECK-CONTENT-NEXT: 0000: [[DATA]] | |
| # CHECK-CONTENT-NEXT: ) |
| |
| ## Check we can use the "Size" key alone to create the section. |
| |
| # RUN: yaml2obj --docnum=13 -DSIZE=3 %s -o %t.size.o |
| # RUN: llvm-readobj --sections --section-data %t.size.o | \ |
| # RUN: FileCheck %s --check-prefix=CHECK-CONTENT -DDATA="000000" |
| |
| ## Check we can use the "Content" key alone to create the section. |
| |
| # RUN: yaml2obj --docnum=13 -DCONTENT="'112233'" %s -o %t.content.o |
| # RUN: llvm-readobj --sections --section-data %t.content.o | \ |
| # RUN: FileCheck %s --check-prefix=CHECK-CONTENT -DDATA="112233" |