## Check how yaml2obj produces SHT_HASH sections. ## Check we can describe a SHT_HASH section using the "Content" tag. ## Check default values of section fields. # RUN: yaml2obj --docnum=1 %s -o %t1 # RUN: llvm-readobj --sections --section-data %t1 | \ # RUN: FileCheck %s -DENTSIZE=4 --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: [[ENTSIZE]]{{$}} # 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 Sections: ## SHT_HASH is linked to dynamic symbol table by default. - Name: .dynsym Type: SHT_DYNSYM - Name: .hash Type: SHT_HASH Content: '0100000002000000030000000400000005000000' EntSize: [[ENTSIZE=]] ## Check we can set an arbitrary entry size for the SHT_HASH section. # RUN: yaml2obj --docnum=1 -DENTSIZE=0xFF %s -o %t1.entsize # RUN: llvm-readobj --sections --section-data %t1.entsize | \ # RUN: FileCheck %s -DENTSIZE=255 --check-prefix=CONTENT ## 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 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" and "Chain" cannot be used with "Content" or "Size" --- !ELF FileHeader: Class: ELFCLASS32 Data: ELFDATA2LSB Type: ET_DYN 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 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 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 Sections: - Name: .hash Type: SHT_HASH Chain: [ 1 ] ## Check we emit an empty section if neither "Bucket", "Chain", ## "Content" nor "Size" were set. # RUN: yaml2obj --docnum=7 %s -o %t7 # RUN: llvm-readelf --sections %t7 | FileCheck %s --check-prefix=NO-TAGS # NO-TAGS: [Nr] Name Type Address Off Size # NO-TAGS: [ 1] .hash HASH 00000000 000034 000000 --- !ELF FileHeader: Class: ELFCLASS32 Data: ELFDATA2LSB Type: ET_DYN 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 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 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 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: Section size must be greater than or equal to the content size --- !ELF FileHeader: Class: ELFCLASS64 Data: ELFDATA2LSB Type: ET_EXEC 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 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 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: 4 # 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 Sections: - Name: .hash Type: SHT_HASH Bucket: [ 1, 2 ] Chain: [ 3, 4, 5 ] NBucket: 0xAA NChain: 0xBB