| ## Check how yaml2obj produces SHT_HASH sections. |
| |
| ## Check we can describe a SHT_HASH section using the "Content" tag. |
| |
| # RUN: yaml2obj --docnum=1 %s -o %t1 |
| # RUN: llvm-readobj --sections --section-data %t1 | FileCheck %s --check-prefix=CONTENT |
| |
| # CONTENT: Name: .hash |
| # CONTENT-NEXT: Type: SHT_HASH |
| # CONTENT-NEXT: Flags [ |
| # CONTENT-NEXT: ] |
| # CONTENT-NEXT: Address: 0x0 |
| # CONTENT-NEXT: Offset: 0x44 |
| # CONTENT-NEXT: Size: 20 |
| # CONTENT-NEXT: Link: 1 |
| # CONTENT-NEXT: Info: 0 |
| # CONTENT-NEXT: AddressAlignment: 0 |
| # CONTENT-NEXT: EntrySize: 0 |
| # CONTENT-NEXT: SectionData ( |
| # CONTENT-NEXT: 0000: 01000000 02000000 03000000 04000000 |
| # CONTENT-NEXT: 0010: 05000000 |
| # CONTENT-NEXT: ) |
| |
| --- !ELF |
| FileHeader: |
| Class: ELFCLASS32 |
| Data: ELFDATA2LSB |
| Type: ET_DYN |
| Machine: EM_386 |
| Sections: |
| ## SHT_HASH is linked to dynamic symbol table by default. |
| - Name: .dynsym |
| Type: SHT_DYNSYM |
| - Name: .hash |
| Type: SHT_HASH |
| Content: '0100000002000000030000000400000005000000' |
| |
| ## Check we can describe a SHT_HASH section using "Bucket" and "Chain" tags. |
| |
| # RUN: yaml2obj --docnum=2 %s -o %t2 |
| # RUN: llvm-readobj --sections --section-data %t2 | FileCheck %s --check-prefix=BUCKET-CHAIN |
| |
| # BUCKET-CHAIN: Name: .hash |
| # BUCKET-CHAIN: Size: |
| # BUCKET-CHAIN-SAME: 28 |
| # BUCKET-CHAIN: Link: |
| # BUCKET-CHAIN-SAME: 0 |
| # BUCKET-CHAIN: SectionData ( |
| # BUCKET-CHAIN-NEXT: 0000: 02000000 03000000 01000000 02000000 | |
| # BUCKET-CHAIN-NEXT: 0010: 03000000 04000000 05000000 | |
| # BUCKET-CHAIN-NEXT: ) |
| |
| --- !ELF |
| FileHeader: |
| Class: ELFCLASS32 |
| Data: ELFDATA2LSB |
| Type: ET_DYN |
| Machine: EM_386 |
| Sections: |
| - Name: .hash |
| Type: SHT_HASH |
| Bucket: [ 1, 2 ] |
| Chain: [ 3, 4, 5 ] |
| |
| ## Check we can't use "Content" and "Bucket" tags together. |
| |
| # RUN: not yaml2obj --docnum=3 %s 2>&1 | FileCheck %s --check-prefix=CONTENT-BUCKET |
| |
| # CONTENT-BUCKET: "Bucket" cannot be used with "Content" or "Size" |
| |
| --- !ELF |
| FileHeader: |
| Class: ELFCLASS32 |
| Data: ELFDATA2LSB |
| Type: ET_DYN |
| Machine: EM_386 |
| Sections: |
| - Name: .hash |
| Type: SHT_HASH |
| Bucket: [ 1 ] |
| Content: '00' |
| |
| ## Check we can't use "Content" and "Chain" tags together. |
| |
| # RUN: not yaml2obj --docnum=4 %s 2>&1 | FileCheck %s --check-prefix=CONTENT-CHAIN |
| |
| # CONTENT-CHAIN: "Chain" cannot be used with "Content" or "Size" |
| |
| --- !ELF |
| FileHeader: |
| Class: ELFCLASS32 |
| Data: ELFDATA2LSB |
| Type: ET_DYN |
| Machine: EM_386 |
| Sections: |
| - Name: .hash |
| Type: SHT_HASH |
| Chain: [ 1 ] |
| Content: '00' |
| |
| ## Check we can't use "Bucket" without "Chain". |
| |
| # RUN: not yaml2obj --docnum=5 %s 2>&1 | FileCheck %s --check-prefix=NO-BUCKET-OR-CHAIN |
| |
| # NO-BUCKET-OR-CHAIN: error: "Bucket" and "Chain" must be used together |
| |
| --- !ELF |
| FileHeader: |
| Class: ELFCLASS32 |
| Data: ELFDATA2LSB |
| Type: ET_DYN |
| Machine: EM_386 |
| Sections: |
| - Name: .hash |
| Type: SHT_HASH |
| Bucket: [ 1 ] |
| |
| ## Check we can't use "Chain" without "Bucket". |
| |
| # RUN: not yaml2obj --docnum=6 %s 2>&1 | FileCheck %s --check-prefix=NO-BUCKET-OR-CHAIN |
| |
| --- !ELF |
| FileHeader: |
| Class: ELFCLASS32 |
| Data: ELFDATA2LSB |
| Type: ET_DYN |
| Machine: EM_386 |
| Sections: |
| - Name: .hash |
| Type: SHT_HASH |
| Chain: [ 1 ] |
| |
| ## Check we report an error if neither "Bucket", "Chain" nor "Content" were set. |
| |
| # RUN: not yaml2obj --docnum=7 %s 2>&1 | FileCheck %s --check-prefix=NO-TAGS |
| |
| # NO-TAGS: error: one of "Content", "Size", "Bucket" or "Chain" must be specified |
| |
| --- !ELF |
| FileHeader: |
| Class: ELFCLASS32 |
| Data: ELFDATA2LSB |
| Type: ET_DYN |
| Machine: EM_386 |
| Sections: |
| - Name: .hash |
| Type: SHT_HASH |
| |
| ## Check we can set any sh_link value with use of the "Link" tag. |
| |
| # RUN: yaml2obj --docnum=8 %s -o %t8 |
| # RUN: llvm-readobj --sections %t8 | FileCheck %s --check-prefix=LINK |
| |
| # LINK: Name: .hash1 |
| # LINK: Link: |
| # LINK-SAME: 123 |
| |
| # LINK: Name: .hash2 |
| # LINK: Link: |
| # LINK-SAME: 1 |
| |
| --- !ELF |
| FileHeader: |
| Class: ELFCLASS32 |
| Data: ELFDATA2LSB |
| Type: ET_DYN |
| Machine: EM_386 |
| Sections: |
| - Name: .hash1 |
| Type: SHT_HASH |
| Content: "" |
| Link: 123 |
| - Name: .hash2 |
| Type: SHT_HASH |
| Content: "" |
| Link: .hash1 |
| ## SHT_HASH is linked to dynamic symbol table by default if it exists. |
| - Name: .dynsym |
| Type: SHT_DYNSYM |
| |
| ## Check we can use only "Size" to create a SHT_HASH section. |
| |
| # RUN: yaml2obj --docnum=9 %s -o %t9 |
| # RUN: llvm-readobj --sections --section-data %t9 | FileCheck %s --check-prefix=SIZE |
| |
| # SIZE: Name: .hash |
| # SIZE: Size: |
| # SIZE-SAME: 17 |
| # SIZE: SectionData ( |
| # SIZE-NEXT: 0000: 00000000 00000000 00000000 00000000 | |
| # SIZE-NEXT: 0010: 00 | |
| # SIZE-NEXT: ) |
| |
| --- !ELF |
| FileHeader: |
| Class: ELFCLASS64 |
| Data: ELFDATA2LSB |
| Type: ET_EXEC |
| Machine: EM_X86_64 |
| Sections: |
| - Name: .hash |
| Type: SHT_HASH |
| Size: 0x11 |
| |
| ## Check we can use "Size" and "Content" together to create a SHT_HASH section. |
| |
| # RUN: yaml2obj --docnum=10 %s -o %t10 |
| # RUN: llvm-readobj --sections --section-data %t10 | FileCheck %s --check-prefix=SIZE-CONTENT |
| |
| # SIZE-CONTENT: Name: .hash |
| # SIZE-CONTENT: Size: |
| # SIZE-CONTENT-SAME: 5 |
| # SIZE-CONTENT: SectionData ( |
| # SIZE-CONTENT-NEXT: 0000: 11223300 00 | |
| # SIZE-CONTENT-NEXT: ) |
| |
| --- !ELF |
| FileHeader: |
| Class: ELFCLASS64 |
| Data: ELFDATA2LSB |
| Type: ET_EXEC |
| Machine: EM_X86_64 |
| Sections: |
| - Name: .hash |
| Type: SHT_HASH |
| Size: 0x5 |
| Content: "112233" |
| |
| ## Check that when "Size" and "Content" are used together, the size |
| ## must be greater than or equal to the content size. |
| |
| # RUN: not yaml2obj --docnum=11 %s 2>&1 | FileCheck %s --check-prefix=SIZE-CONTENT-ERR |
| |
| # SIZE-CONTENT-ERR: error: "Size" must be greater than or equal to the content size |
| |
| --- !ELF |
| FileHeader: |
| Class: ELFCLASS64 |
| Data: ELFDATA2LSB |
| Type: ET_EXEC |
| Machine: EM_X86_64 |
| Sections: |
| - Name: .hash |
| Type: SHT_HASH |
| Size: 0x1 |
| Content: "1122" |
| |
| ## Check we can't use "Size" and "Bucket" tags together. |
| |
| # RUN: not yaml2obj --docnum=12 %s 2>&1 | FileCheck %s --check-prefix=CONTENT-BUCKET |
| |
| --- !ELF |
| FileHeader: |
| Class: ELFCLASS64 |
| Data: ELFDATA2LSB |
| Type: ET_EXEC |
| Machine: EM_X86_64 |
| Sections: |
| - Name: .hash |
| Type: SHT_HASH |
| Size: 0x1 |
| Bucket: [ 1 ] |
| |
| ## Check we can't use "Size" and "Chain" tags together. |
| |
| # RUN: not yaml2obj --docnum=13 %s 2>&1 | FileCheck %s --check-prefix=CONTENT-CHAIN |
| |
| --- !ELF |
| FileHeader: |
| Class: ELFCLASS64 |
| Data: ELFDATA2LSB |
| Type: ET_EXEC |
| Machine: EM_X86_64 |
| Sections: |
| - Name: .hash |
| Type: SHT_HASH |
| Size: 0x1 |
| Chain: [ 1 ] |
| |
| ## Check we can override "nbucket" and "nchain" values of a SHT_HASH section using "NBucket" |
| ## and "NChain" tags. Check that the section size is unaffected when we do this. |
| |
| # RUN: yaml2obj --docnum=14 %s -o %t14 |
| # RUN: llvm-readobj --sections --section-data %t14 | FileCheck %s --check-prefix=OVERRIDE |
| |
| # OVERRIDE: Name: .hash |
| # OVERRIDE-NEXT: Type: SHT_HASH |
| # OVERRIDE-NEXT: Flags [ |
| # OVERRIDE-NEXT: ] |
| # OVERRIDE-NEXT: Address: 0x0 |
| # OVERRIDE-NEXT: Offset: 0x34 |
| # OVERRIDE-NEXT: Size: 28 |
| # OVERRIDE-NEXT: Link: 0 |
| # OVERRIDE-NEXT: Info: 0 |
| # OVERRIDE-NEXT: AddressAlignment: 0 |
| # OVERRIDE-NEXT: EntrySize: 0 |
| # OVERRIDE-NEXT: SectionData ( |
| # OVERRIDE-NEXT: 0000: AA000000 BB000000 01000000 02000000 |
| # OVERRIDE-NEXT: 0010: 03000000 04000000 05000000 |
| # OVERRIDE-NEXT: ) |
| |
| --- !ELF |
| FileHeader: |
| Class: ELFCLASS32 |
| Data: ELFDATA2LSB |
| Type: ET_DYN |
| Machine: EM_386 |
| Sections: |
| - Name: .hash |
| Type: SHT_HASH |
| Bucket: [ 1, 2 ] |
| Chain: [ 3, 4, 5 ] |
| NBucket: 0xAA |
| NChain: 0xBB |