## Check that obj2yaml dumps SHT_STRTAB/SHT_SYMTAB/SHT_DYNSYM sections
## when they are allocatable.
## In the following test we check the normal case: when .dynsym (SHT_DYNSYM)
## and .dynstr (SHT_STRTAB) are allocatable sections and .symtab (SHT_SYMTAB),
## .strtab (SHT_STRTAB) and .shstrtab (SHT_STRTAB) are not.
## Check we explicitly declare allocatable sections.
# RUN: yaml2obj %s -o %t1.so -D FLAG1=SHF_ALLOC -D FLAG2=""
# RUN: llvm-readelf -S %t1.so | FileCheck %s --check-prefixes=RE,RE-1
# RUN: obj2yaml %t1.so | FileCheck %s --check-prefix=OUTPUT
## Check the information about sections using an independent tool.
# RE: Section Headers:
# RE-NEXT: [Nr] Name Type Address Off Size ES Flg Lk Inf Al
# RE-NEXT: [ 0] NULL 0000000000000000 000000 000000 00 0 0 0
# RE-NEXT: [ 1] .foo.1 PROGBITS 0000000000000000 000040 000000 00 0 0 0
# RE-1-NEXT: [ 2] .dynsym DYNSYM 0000000000001000 000040 000030 18 A 4 2 0
# RE-2-NEXT: [ 2] .dynsym DYNSYM 0000000000001000 000040 000030 18 4 2 0
# RE-NEXT: [ 3] .foo.2 PROGBITS 0000000000000000 000070 000000 00 0 0 0
# RE-1-NEXT: [ 4] .dynstr STRTAB 0000000000002000 000070 000005 00 A 0 0 0
# RE-2-NEXT: [ 4] .dynstr STRTAB 0000000000002000 000070 000005 00 0 0 0
# RE-NEXT: [ 5] .foo.3 PROGBITS 0000000000000000 000075 000000 00 0 0 0
# RE-1-NEXT: [ 6] .symtab SYMTAB 0000000000003000 000075 000030 18 8 2 0
# RE-2-NEXT: [ 6] .symtab SYMTAB 0000000000003000 000075 000030 18 A 8 2 0
# RE-NEXT: [ 7] .foo.4 PROGBITS 0000000000000000 0000a5 000000 00 0 0 0
# RE-1-NEXT: [ 8] .strtab STRTAB 0000000000004000 0000a5 000005 00 0 0 0
# RE-2-NEXT: [ 8] .strtab STRTAB 0000000000004000 0000a5 000005 00 A 0 0 0
# RE-NEXT: [ 9] .foo.5 PROGBITS 0000000000000000 0000aa 000000 00 0 0 0
# RE-1-NEXT: [10] .shstrtab STRTAB 0000000000005000 0000aa 000055 00 0 0 0
# RE-2-NEXT: [10] .shstrtab STRTAB 0000000000005000 0000aa 000055 00 A 0 0 0
# RE-NEXT: [11] .foo.6 PROGBITS 0000000000000000 0000ff 000000 00 0 0 0
# OUTPUT: --- !ELF
# OUTPUT-NEXT: FileHeader:
# OUTPUT-NEXT: Class: ELFCLASS64
# OUTPUT-NEXT: Data: ELFDATA2LSB
# OUTPUT-NEXT: Type: ET_DYN
# OUTPUT-NEXT: Sections:
# OUTPUT-NEXT: - Name: .foo.1
# OUTPUT-NEXT: Type: SHT_PROGBITS
# OUTPUT-NEXT: - Name: .dynsym
# OUTPUT-NEXT: Type: SHT_DYNSYM
# OUTPUT-NEXT: Flags: [ SHF_ALLOC ]
# OUTPUT-NEXT: Address: 0x1000
# OUTPUT-NEXT: Link: .dynstr
# OUTPUT-NEXT: - Name: .foo.2
# OUTPUT-NEXT: Type: SHT_PROGBITS
# OUTPUT-NEXT: - Name: .dynstr
# OUTPUT-NEXT: Type: SHT_STRTAB
# OUTPUT-NEXT: Flags: [ SHF_ALLOC ]
# OUTPUT-NEXT: Address: 0x2000
# OUTPUT-NEXT: - Name: .foo.3
# OUTPUT-NEXT: Type: SHT_PROGBITS
# OUTPUT-NEXT: - Name: .foo.4
# OUTPUT-NEXT: Type: SHT_PROGBITS
# OUTPUT-NEXT: - Name: .foo.5
# OUTPUT-NEXT: Type: SHT_PROGBITS
# OUTPUT-NEXT: - Name: .foo.6
# OUTPUT-NEXT: Type: SHT_PROGBITS
# OUTPUT-NEXT: Symbols:
# OUTPUT-NEXT: - Name: foo
# OUTPUT-NEXT: DynamicSymbols:
# OUTPUT-NEXT: - Name: bar
# OUTPUT-NEXT: ...
---
FileHeader:
Class: ELFCLASS64
Data: ELFDATA2LSB
Type: ET_DYN
Sections:
- Name: .foo.1
Type: SHT_PROGBITS
- Name: .dynsym
Type: SHT_DYNSYM
Address: 0x1000
Flags:
- Name: .foo.2
Type: SHT_PROGBITS
- Name: .dynstr
Type: SHT_STRTAB
Address: 0x2000
Flags:
- Name: .foo.3
Type: SHT_PROGBITS
- Name: .symtab
Type: SHT_SYMTAB
Address: 0x3000
Flags:
- Name: .foo.4
Type: SHT_PROGBITS
- Name: .strtab
Type: SHT_STRTAB
Address: 0x4000
Flags:
- Name: .foo.5
Type: SHT_PROGBITS
- Name: .shstrtab
Type: SHT_STRTAB
Address: 0x5000
Flags:
- Name: .foo.6
Type: SHT_PROGBITS
Symbols:
- Name: foo
DynamicSymbols:
- Name: bar
## Now test the abnormal case: when .symtab (SHT_SYMTAB),
## .strtab (SHT_STRTAB) and .shstrtab (SHT_STRTAB) are
## allocatable sections, but .dynsym (SHT_DYNSYM) and
## .dynstr (SHT_STRTAB) are not.
## Check that only allocatable versions are explicitly declared.
# RUN: yaml2obj %s -o %t2.so -D FLAG1="" -D FLAG2=SHF_ALLOC
# RUN: llvm-readelf -S %t2.so | FileCheck %s --check-prefixes=RE,RE-2
# RUN: obj2yaml %t2.so | FileCheck %s --check-prefix=OUTPUT2
## Check we explicitly declare only allocatable
## SHT_STRTAB/SHT_SYMTAB/SHT_DYNSYM sections.
# OUTPUT2: --- !ELF
# OUTPUT2-NEXT: FileHeader:
# OUTPUT2-NEXT: Class: ELFCLASS64
# OUTPUT2-NEXT: Data: ELFDATA2LSB
# OUTPUT2-NEXT: Type: ET_DYN
# OUTPUT2-NEXT: Sections:
# OUTPUT2-NEXT: - Name: .foo.1
# OUTPUT2-NEXT: Type: SHT_PROGBITS
# OUTPUT2-NEXT: - Name: .foo.2
# OUTPUT2-NEXT: Type: SHT_PROGBITS
# OUTPUT2-NEXT: - Name: .foo.3
# OUTPUT2-NEXT: Type: SHT_PROGBITS
# OUTPUT2-NEXT: - Name: .symtab
# OUTPUT2-NEXT: Type: SHT_SYMTAB
# OUTPUT2-NEXT: Flags: [ SHF_ALLOC ]
# OUTPUT2-NEXT: Address: 0x3000
# OUTPUT2-NEXT: Link: .strtab
# OUTPUT2-NEXT: - Name: .foo.4
# OUTPUT2-NEXT: Type: SHT_PROGBITS
# OUTPUT2-NEXT: - Name: .strtab
# OUTPUT2-NEXT: Type: SHT_STRTAB
# OUTPUT2-NEXT: Flags: [ SHF_ALLOC ]
# OUTPUT2-NEXT: Address: 0x4000
# OUTPUT2-NEXT: - Name: .foo.5
# OUTPUT2-NEXT: Type: SHT_PROGBITS
# OUTPUT2-NEXT: - Name: .shstrtab
# OUTPUT2-NEXT: Type: SHT_STRTAB
# OUTPUT2-NEXT: Flags: [ SHF_ALLOC ]
# OUTPUT2-NEXT: Address: 0x5000
# OUTPUT2-NEXT: - Name: .foo.6
# OUTPUT2-NEXT: Type: SHT_PROGBITS
# OUTPUT2-NEXT: Symbols:
# OUTPUT2-NEXT: - Name: foo
# OUTPUT2-NEXT: DynamicSymbols:
# OUTPUT2-NEXT: - Name: bar
# OUTPUT2-NEXT: ...