llvm-project/llvm/test/tools/yaml2obj/ELF/hash-section.yaml
Georgii Rymar d8bb30c551 [yaml2obj] - Allow specifying no tags to create empty sections in few cases.
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
2020-10-15 11:22:02 +03:00

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