## Check how we produce implicit SHT_STRTAB sections. ## For implicit string table sections, the `Flags` field can also ## be specified in YAML. Here we test the behavior in different cases. ## When flags are not explicitly specified, yaml2obj assigns no flags ## for .strtab/.shstrtab and the SHF_ALLOC flag for .dynstr by default. # RUN: yaml2obj --docnum=1 %s -o %t1 # RUN: llvm-readelf %t1 --sections | FileCheck %s --check-prefix=CASE1 # CASE1: [Nr] Name Type {{.*}} Flg Lk # CASE1: [ 1] .strtab STRTAB {{.*}} 0 # CASE1-NEXT: [ 2] .shstrtab STRTAB {{.*}} 0 # CASE1-NEXT: [ 3] .dynstr STRTAB {{.*}} A 0 --- !ELF FileHeader: Class: ELFCLASS64 Data: ELFDATA2LSB Type: ET_DYN Sections: - Name: .strtab Type: SHT_STRTAB Flags: [[STRTABFLAGS=]] Offset: [[STRTABOFFSET=]] - Name: .shstrtab Type: SHT_STRTAB Flags: [[SHSTRTABFLAGS=]] Offset: [[SHSTRTABOFFSET=]] - Name: .dynstr Type: SHT_STRTAB Flags: [[DYNSTRFLAGS=]] Offset: [[DYNSTROFFSET=]] ## Check we can set arbitrary flags and offsets for ## implicit string table sections. # RUN: yaml2obj --docnum=1 \ # RUN: -DSTRTABFLAGS="[ SHF_ALLOC, SHF_STRINGS ]" -DSTRTABOFFSET=0x100 \ # RUN: -DSHSTRTABFLAGS="[ SHF_ALLOC, SHF_WRITE ]" -DSHSTRTABOFFSET=0x200 \ # RUN: -DDYNSTRFLAGS="[ SHF_STRINGS ]" -DDYNSTROFFSET=0x300 %s -o %t2 # RUN: llvm-readelf %t2 --sections | FileCheck %s --check-prefix=CASE2 # CASE2: [Nr] Name Type Address Off {{.*}} Flg Lk # CASE2: [ 1] .strtab STRTAB 0000000000000000 000100 {{.*}} AS 0 # CASE2-NEXT: [ 2] .shstrtab STRTAB 0000000000000001 000200 {{.*}} WA 0 # CASE2-NEXT: [ 3] .dynstr STRTAB 0000000000000000 000300 {{.*}} S 0 ## Check no flags are set by default for implicit string table sections ## when they are not described in the YAML. # RUN: yaml2obj --docnum=2 %s -o %t3 # RUN: llvm-readelf %t3 --sections | FileCheck %s --check-prefix=CASE3 # CASE3: [Nr] Name Type {{.*}} ES Flg Lk # CASE3: [ 1] .strtab STRTAB {{.*}} 00 0 # CASE3-NEXT: [ 2] .shstrtab STRTAB {{.*}} 00 0 --- !ELF FileHeader: Class: ELFCLASS64 Data: ELFDATA2LSB Type: ET_DYN ## For implicit string table sections, `Size` and/or `Content` fields can also ## be specified in YAML. Here we test the behavior in different cases. ## When no `Size` or `Content` is specified for a string table section, ## yaml2obj writes the default content. # RUN: yaml2obj --docnum=3 %s -o %t4 # RUN: llvm-objdump %t4 -s | FileCheck %s --check-prefix=CASE4 # CASE4: Contents of section .strtab: # CASE4-NEXT: 0000 00666f6f 00 .foo. # CASE4-NEXT: Contents of section .shstrtab: # CASE4-NEXT: 0000 002e6479 6e737472 002e6479 6e73796d ..dynstr..dynsym # CASE4-NEXT: 0010 002e7368 73747274 6162002e 73747274 ..shstrtab..strt # CASE4-NEXT: 0020 6162002e 73796d74 616200 ab..symtab. # CASE4-NEXT: Contents of section .dynstr: # CASE4-NEXT: 0030 00626172 00 .bar. --- !ELF FileHeader: Class: ELFCLASS64 Data: ELFDATA2LSB Type: ET_DYN Sections: - Name: .strtab Type: SHT_STRTAB Size: [[STRTABSIZE=]] Content: [[STRTABCONTENT=]] - Name: .shstrtab Type: SHT_STRTAB Size: [[SHSTRTABSIZE=]] Content: [[SHSTRTABCONTENT=]] - Name: .dynstr Type: SHT_STRTAB Size: [[DYNSTRSIZE=]] Content: [[DYNSTRCONTENT=]] ## Used to trigger adding string `foo` to the string table section. Symbols: - Name: foo DynamicSymbols: - Name: bar ## For string table sections, `Size` can be used to override the ## implicit string table data. The content is filled with zeroes in this case. # RUN: yaml2obj --docnum=3 -DSTRTABSIZE=2 -DSHSTRTABSIZE=0x30 -DDYNSTRSIZE=4 %s -o %t5 # RUN: llvm-readobj --section-data -S %t5 | FileCheck %s --check-prefix=CASE5 # CASE5: Index: 1 # CASE5-NEXT: Name: (27) # CASE5-NEXT: Type: SHT_STRTAB # CASE5: SectionData ( # CASE5-NEXT: 0000: 0000 | # CASE5-NEXT: ) # CASE5: Index: 2 # CASE5-NEXT: Name: (17) # CASE5-NEXT: Type: SHT_STRTAB (0x3) # CASE5: SectionData ( # CASE5-NEXT: 0000: 00000000 00000000 00000000 00000000 | # CASE5-NEXT: 0010: 00000000 00000000 00000000 00000000 | # CASE5-NEXT: 0020: 00000000 00000000 00000000 00000000 | # CASE5-NEXT: ) # CASE5: Index: 3 # CASE5-NEXT: Name: (1) # CASE5-NEXT: Type: SHT_STRTAB (0x3) # CASE5: SectionData ( # CASE5-NEXT: 0000: 00000000 | # CASE5-NEXT: ) ## For string table sections, `Content` can be used to override the ## implicit string table data. # RUN: yaml2obj --docnum=3 %s \ # RUN: -DSTRTABCONTENT="01020304" \ # RUN: -DSHSTRTABCONTENT="6162636465666767696a6b6c6d6e6f707172737475767778797a61626364656667676900" \ # RUN: -DDYNSTRCONTENT="eeddaabb" -o %t6 # RUN: llvm-readobj --section-data -S %t6 | FileCheck %s --check-prefix=CASE6 # CASE6: Index: 1 # CASE6-NEXT: Name: bcdefggi (27) # CASE6: SectionData ( # CASE6-NEXT: 0000: 01020304 | # CASE6-NEXT: ) # CASE6: Index: 2 # CASE6-NEXT: Name: rstuvwxyzabcdefggi (17) # CASE6: SectionData ( # CASE6-NEXT: 0000: 61626364 65666767 696A6B6C 6D6E6F70 | # CASE6-NEXT: 0010: 71727374 75767778 797A6162 63646566 | # CASE6-NEXT: 0020: 67676900 | # CASE6-NEXT: ) # CASE6: Index: 3 # CASE6-NEXT: Name: bcdefggijklmnopqrstuvwxyzabcdefggi (1) # CASE6: SectionData ( # CASE6-NEXT: 0000: EEDDAABB | # CASE6-NEXT: ) ## For string table sections, check we can specify both `Size` and `Content` ## when size is greater than content size. In this case zeroes are ## added as padding after the specified content. # RUN: yaml2obj --docnum=3 %s \ # RUN: -DSTRTABCONTENT="01020304" -DSTRTABSIZE=5 \ # RUN: -DSHSTRTABCONTENT="6162636465666767696a6b6c6d6e6f707172737475767778797a61626364656667676900" -DSHSTRTABSIZE=0x26 \ # RUN: -DDYNSTRCONTENT="eeddaabb" -DDYNSTRSIZE=7 -o %t7 # RUN: llvm-readobj --section-data -S %t7 | FileCheck %s --check-prefix=CASE7 # CASE7: Index: 1 # CASE7-NEXT: Name: bcdefggi (27) # CASE7: SectionData ( # CASE7-NEXT: 0000: 01020304 00 | # CASE7-NEXT: ) # CASE7: Index: 2 # CASE7-NEXT: Name: rstuvwxyzabcdefggi (17) # CASE7: SectionData ( # CASE7-NEXT: 0000: 61626364 65666767 696A6B6C 6D6E6F70 | # CASE7-NEXT: 0010: 71727374 75767778 797A6162 63646566 | # CASE7-NEXT: 0020: 67676900 0000 | # CASE7-NEXT: ) # CASE7: Index: 3 # CASE7-NEXT: Name: bcdefggijklmnopqrstuvwxyzabcdefggi (1) # CASE7: SectionData ( # CASE7-NEXT: 0000: EEDDAABB 000000 | # CASE7-NEXT: ) ## For string table sections, check we can specify both `Size` and `Content` ## when size is equal to content size. # RUN: yaml2obj --docnum=3 %s \ # RUN: -DSTRTABCONTENT="01020304" -DSTRTABSIZE=4 \ # RUN: -DSHSTRTABCONTENT="6162636465666767696a6b6c6d6e6f707172737475767778797a61626364656667676900" -DSHSTRTABSIZE=0x24 \ # RUN: -DDYNSTRCONTENT="eeddaabb" -DDYNSTRSIZE=4 -o %t8 # RUN: llvm-readobj --section-data -S %t8 | FileCheck %s --check-prefix=CASE6 ## Check that we report an error when the the value of "Size" is less than the content size. # RUN: not yaml2obj --docnum=3 %s -DSTRTABCONTENT="01020304" -DSTRTABSIZE=3 2>&1 \ # RUN: | FileCheck %s --check-prefix=CASE8 # RUN: not yaml2obj --docnum=3 %s \ # RUN: -DSHSTRTABCONTENT="6162636465666767696a6b6c6d6e6f707172737475767778797a61626364656667676900" -DSHSTRTABSIZE=0x23 2>&1 \ # RUN: | FileCheck %s --check-prefix=CASE8 # RUN: not yaml2obj --docnum=3 %s -DDYNSTRCONTENT="eeddaabb" -DDYNSTRSIZE=0x3 2>&1 \ # RUN: | FileCheck %s --check-prefix=CASE8 # CASE8: Section size must be greater than or equal to the content size