## Check we are able to produce a valid SHT_GNU_versym ## section from its description. # RUN: yaml2obj --docnum=1 %s -o %t1 # RUN: llvm-readobj -V %t1 | FileCheck %s # CHECK: VersionSymbols [ # CHECK-NEXT: Symbol { # CHECK-NEXT: Version: 0 # CHECK-NEXT: Name: # CHECK-NEXT: } # CHECK-NEXT: Symbol { # CHECK-NEXT: Version: 3 # CHECK-NEXT: Name: f1@v1 # CHECK-NEXT: } # CHECK-NEXT: Symbol { # CHECK-NEXT: Version: 4 # CHECK-NEXT: Name: f2@v2 # CHECK-NEXT: } # CHECK-NEXT: ] # CHECK-NEXT: VersionDefinitions [ # CHECK-NEXT: ] # CHECK-NEXT: VersionRequirements [ # CHECK-NEXT: Dependency { # CHECK-NEXT: Version: 1 # CHECK-NEXT: Count: 2 # CHECK-NEXT: FileName: dso.so.0 # CHECK-NEXT: Entries [ # CHECK-NEXT: Entry { # CHECK-NEXT: Hash: 1937 # CHECK-NEXT: Flags [ (0x0) # CHECK-NEXT: ] # CHECK-NEXT: Index: 3 # CHECK-NEXT: Name: v1 # CHECK-NEXT: } # CHECK-NEXT: Entry { # CHECK-NEXT: Hash: 1938 # CHECK-NEXT: Flags [ (0x0) # CHECK-NEXT: ] # CHECK-NEXT: Index: 4 # CHECK-NEXT: Name: v2 # CHECK-NEXT: } # CHECK-NEXT: ] # CHECK-NEXT: } # CHECK-NEXT: ] --- !ELF FileHeader: Class: ELFCLASS64 Data: ELFDATA2LSB Type: ET_EXEC Entry: 0x0000000000201000 Sections: - Name: .gnu.version Type: SHT_GNU_versym Flags: [ SHF_ALLOC ] Address: 0x0000000000200210 AddressAlign: 0x0000000000000002 EntSize: 0x0000000000000002 Entries: [ 0, 3, 4 ] - Name: .gnu.version_r Type: SHT_GNU_verneed Flags: [ SHF_ALLOC ] Address: 0x0000000000200250 AddressAlign: 0x0000000000000004 Dependencies: - Version: 1 File: dso.so.0 Entries: - Name: v1 Hash: 1937 Flags: 0 Other: 3 - Name: v2 Hash: 1938 Flags: 0 Other: 4 DynamicSymbols: - Name: f1 Binding: STB_GLOBAL - Name: f2 Binding: STB_GLOBAL ... ## Check we are able to set custom sh_entsize field for SHT_GNU_versym section. ## Check we link the SHT_GNU_versym section to the .dynsym section by default. # RUN: yaml2obj --docnum=2 %s -o %t2 # RUN: llvm-readelf -S %t2 | FileCheck %s -DLINK=2 --check-prefix=FIELDS # FIELDS: Section Headers: # FIELDS: [Nr] Name Type Address Off Size ES Flg Lk # FIELDS: [ 1] .gnu.version VERSYM 0000000000000000 000040 000000 03 [[LINK]] # FIELDS: [ 2] .dynsym DYNSYM 0000000000000000 000040 000018 18 A 3 --- !ELF FileHeader: Class: ELFCLASS64 Data: ELFDATA2LSB OSABI: ELFOSABI_FREEBSD Type: ET_DYN Sections: - Name: .gnu.version Type: SHT_GNU_versym EntSize: 0x0000000000000003 Entries: [ ] Link: [[LINK=]] ## Needed to emit the .dynsym section. DynamicSymbols: [] ## Check we are able to set the sh_link field to an arbitrary value. # RUN: yaml2obj --docnum=2 -DLINK=0xff %s -o %t2.link # RUN: llvm-readelf -S %t2.link | FileCheck %s -DLINK=255 --check-prefix=FIELDS ## Check we can use the "Content" key with the "Size" key when the size is greater ## than or equal to the content size. ## Also, check that we set the sh_link field to 0 when there is no .dynsym section. # RUN: not yaml2obj --docnum=3 -DSIZE=1 -DCONTENT="'0011'" %s 2>&1 | \ # RUN: FileCheck %s --check-prefix=CONTENT-SIZE-ERR # CONTENT-SIZE-ERR: error: Section size must be greater than or equal to the content size --- !ELF FileHeader: Class: ELFCLASS64 Data: ELFDATA2LSB Type: ET_DYN Sections: - Name: .gnu.version Type: SHT_GNU_versym Size: [[SIZE=]] Content: [[CONTENT=]] Entries: [[ENTRIES=]] # RUN: yaml2obj --docnum=3 -DSIZE=2 -DCONTENT="'0011'" %s -o %t.cont.size.eq.o # RUN: llvm-readobj --sections --section-data %t.cont.size.eq.o | \ # RUN: FileCheck %s --check-prefix=CHECK-CONTENT -DDATA="0011" # RUN: yaml2obj --docnum=3 -DSIZE=3 -DCONTENT="'0011'" %s -o %t.cont.size.gr.o # RUN: llvm-readobj --sections --section-data %t.cont.size.gr.o | \ # RUN: FileCheck %s --check-prefix=CHECK-CONTENT -DDATA="001100" # CHECK-CONTENT: Name: .gnu.version # CHECK-CONTENT-NEXT: Type: SHT_GNU_versym (0x6FFFFFFF) # CHECK-CONTENT-NEXT: Flags [ (0x0) # CHECK-CONTENT-NEXT: ] # CHECK-CONTENT-NEXT: Address: # CHECK-CONTENT-NEXT: Offset: # CHECK-CONTENT-NEXT: Size: # CHECK-CONTENT-NEXT: Link: 0 # CHECK-CONTENT: SectionData ( # CHECK-CONTENT-NEXT: 0000: [[DATA]] | # CHECK-CONTENT-NEXT: ) ## Check we can use the "Size" key alone to create the section. # RUN: yaml2obj --docnum=3 -DSIZE=3 %s -o %t.size.o # RUN: llvm-readobj --sections --section-data %t.size.o | \ # RUN: FileCheck %s --check-prefix=CHECK-CONTENT -DDATA="000000" ## Check we can use the "Content" key alone to create the section. # RUN: yaml2obj --docnum=3 -DCONTENT="'112233'" %s -o %t.content.o # RUN: llvm-readobj --sections --section-data %t.content.o | \ # RUN: FileCheck %s --check-prefix=CHECK-CONTENT -DDATA="112233" ## Check we can't use the "Entries" key together with the "Content" or "Size" keys. # RUN: not yaml2obj --docnum=3 -DSIZE=0 -DENTRIES="[]" %s 2>&1 | \ # RUN: FileCheck %s --check-prefix=ENTRIES-ERR # RUN: not yaml2obj --docnum=3 -DCONTENT="'00'" -DENTRIES="[]" %s 2>&1 | \ # RUN: FileCheck %s --check-prefix=ENTRIES-ERR # ENTRIES-ERR: error: "Entries" cannot be used with "Content" or "Size" ## Check we set the sh_link field to 0 when the .dynsym section is excluded ## from the section header table. # RUN: yaml2obj --docnum=4 %s -o %t4 # RUN: llvm-readelf --sections %t4 | FileCheck %s --check-prefix=EXCLUDED # EXCLUDED: [Nr] Name {{.*}} ES Flg Lk Inf # EXCLUDED: [ 1] .gnu.version {{.*}} 02 0 0 --- !ELF FileHeader: Class: ELFCLASS64 Data: ELFDATA2LSB Type: ET_DYN Sections: - Name: .gnu.version Type: SHT_GNU_versym - Name: .dynsym Type: SHT_DYNSYM - Type: SectionHeaderTable Sections: - Name: .gnu.version - Name: .strtab - Name: .shstrtab Excluded: - Name: .dynsym