Currently we have a few sections that does not support specifying no keys for them. E.g. it is required that one of "Content", "Size" or "Entries" key is present. There is no reason to have this restriction. We can allow this and emit an empty section instead. This opens road for a simplification and generalization of the code in `validate()` that is discussed in the D89039 thread. Depends on D89039. Differential revision: https://reviews.llvm.org/D89391
313 lines
7.5 KiB
YAML
313 lines
7.5 KiB
YAML
## 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=<none>]]
|
|
|
|
## 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
|