## 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: ... --- !ELF FileHeader: Class: ELFCLASS64 Data: ELFDATA2LSB Type: ET_DYN Sections: - Name: .foo.1 Type: SHT_PROGBITS - Name: .dynsym Type: SHT_DYNSYM Address: 0x1000 Flags: [ [[FLAG1]] ] - Name: .foo.2 Type: SHT_PROGBITS - Name: .dynstr Type: SHT_STRTAB Address: 0x2000 Flags: [ [[FLAG1]] ] - Name: .foo.3 Type: SHT_PROGBITS - Name: .symtab Type: SHT_SYMTAB Address: 0x3000 Flags: [ [[FLAG2]] ] - Name: .foo.4 Type: SHT_PROGBITS - Name: .strtab Type: SHT_STRTAB Address: 0x4000 Flags: [ [[FLAG2]] ] - Name: .foo.5 Type: SHT_PROGBITS - Name: .shstrtab Type: SHT_STRTAB Address: 0x5000 Flags: [ [[FLAG2]] ] - 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: ...