## Check how yaml2obj produces SHT_NOTE sections. ## Check we can describe SHT_NOTE using the "Notes" tag. We can define ## notes using names, descriptions and types. ## Check we produce a valid name size and description size fields. ## Check we produce valid paddings. # RUN: yaml2obj --docnum=1 %s -o %t1 # RUN: llvm-readobj --sections --section-data %t1 | FileCheck %s --check-prefix=NOTE # NOTE: Section { # NOTE: Index: 1 # NOTE-NEXT: Name: .note.foo (1) # NOTE-NEXT: Type: SHT_NOTE (0x7) # NOTE-NEXT: Flags [ (0x2) # NOTE-NEXT: SHF_ALLOC (0x2) # NOTE-NEXT: ] # NOTE-NEXT: Address: # NOTE-NEXT: Offset: # NOTE-NEXT: Size: 36 # NOTE-NEXT: Link: 0 # NOTE-NEXT: Info: 0 # NOTE-NEXT: AddressAlignment: 0 # NOTE-NEXT: EntrySize: 0 # NOTE-NEXT: SectionData ( ## namesz == (0x03000000) == sizeof("AB") + NUL terminator. ## descsz == (0x00000000) for an empty description. ## Check we produce a valid 2 bytes zeroes padding after the Name. # NOTE-NEXT: 0000: 03000000 00000000 FF000000 41420000 |............AB..| ## namesz == (0x04000000) == sizeof("ABC") + NUL terminator. ## descsz == (0x06000000) == sizeof("123456"). ## Check we produce a valid (zero align to 4) 1 byte padding after the Name. ## Check we produce a valid (zero align to 4) 2 bytes padding after the Desc. # NOTE-NEXT: 0010: 04000000 03000000 FE000000 41424300 |............ABC.| # NOTE-NEXT: 0020: 12345600 |.4V.| # NOTE-NEXT: ) --- !ELF FileHeader: Class: ELFCLASS64 Data: ELFDATA2LSB Type: ET_REL Sections: - Name: .note.foo Type: SHT_NOTE Flags: [ SHF_ALLOC ] Notes: - Name: AB Desc: '' Type: 0xFF - Name: ABC Desc: '123456' Type: 254 ## Check that for 32-bit little-endian case we produce the same section content. # RUN: yaml2obj --docnum=2 %s -o %t2 # RUN: llvm-readobj --sections --section-data %t2 | FileCheck %s --check-prefix=NOTE --- !ELF FileHeader: Class: ELFCLASS32 Data: ELFDATA2LSB Type: ET_REL Sections: - Name: .note.foo Type: SHT_NOTE Flags: [ SHF_ALLOC ] Notes: - Name: AB Desc: '' Type: 0xFF - Name: ABC Desc: '123456' Type: 254 ## Check big-endian 32/64 bit cases. ## Check they produce the same content. # RUN: yaml2obj --docnum=3 %s -o %t3 # RUN: llvm-readobj --sections --section-data %t3 | FileCheck %s --check-prefix=NOTE-BE # RUN: yaml2obj --docnum=4 %s -o %t4 # RUN: llvm-readobj --sections --section-data %t4 | FileCheck %s --check-prefix=NOTE-BE # NOTE-BE: Name: .note.foo # NOTE-BE: SectionData ( # NOTE-BE-NEXT: 0000: 00000004 00000003 000000FE 41424300 | # NOTE-BE-NEXT: 0010: 12345600 | # NOTE-BE-NEXT: ) --- !ELF FileHeader: Class: ELFCLASS32 Data: ELFDATA2MSB Type: ET_REL Sections: - Name: .note.foo Type: SHT_NOTE Notes: - Name: ABC Desc: '123456' Type: 254 --- !ELF FileHeader: Class: ELFCLASS64 Data: ELFDATA2MSB Type: ET_REL Sections: - Name: .note.foo Type: SHT_NOTE Notes: - Name: ABC Desc: '123456' Type: 254 ## Check that 'Type' field is mandatory. # RUN: not yaml2obj --docnum=5 %s 2>&1 | FileCheck %s --check-prefix=TYPE-REQ # TYPE-REQ: error: missing required key 'Type' --- !ELF FileHeader: Class: ELFCLASS64 Data: ELFDATA2LSB Type: ET_REL Sections: - Name: .note.foo Type: SHT_NOTE Notes: - Name: '' Desc: '' ## Check that neither `Name` nor `Desc` are mandatory fields. # RUN: yaml2obj --docnum=6 %s -o %t6 # RUN: llvm-readobj --sections --section-data %t6 | FileCheck %s --check-prefix=NAME-DESC # NAME-DESC: Name: .note.foo # NAME-DESC: SectionData ( # NAME-DESC-NEXT: 0000: 00000000 00000000 FF000000 | # NAME-DESC-NEXT: ) --- !ELF FileHeader: Class: ELFCLASS64 Data: ELFDATA2LSB Type: ET_REL Sections: - Name: .note.foo Type: SHT_NOTE Notes: - Type: 0xFF ## Check we can use the "Content" tag to specify any data for SHT_NOTE sections. # RUN: yaml2obj --docnum=7 %s -o %t7 # RUN: llvm-readobj --sections --section-data %t7 | FileCheck %s --check-prefix=CONTENT # CONTENT: Name: .note.foo # CONTENT: SectionData ( # CONTENT-NEXT: 0000: 11223344 55 | # CONTENT-NEXT: ) --- !ELF FileHeader: Class: ELFCLASS64 Data: ELFDATA2LSB Type: ET_DYN Sections: - Name: .note.foo Type: SHT_NOTE Content: "1122334455" ## Check we emit an empty section if neither "Content", "Size" nor "Notes" were set. # RUN: yaml2obj --docnum=8 %s -o %t8 # RUN: llvm-readelf --sections %t8 | FileCheck %s --check-prefix=NO-TAGS # NO-TAGS: [Nr] Name Type Address Off Size # NO-TAGS: [ 1] .note.foo NOTE 0000000000000000 000040 000000 --- !ELF FileHeader: Class: ELFCLASS64 Data: ELFDATA2LSB Type: ET_DYN Sections: - Name: .note.foo Type: SHT_NOTE ## "Content" and "Notes" cannot be used together to describe the SHT_NOTE section. # RUN: not yaml2obj --docnum=9 %s 2>&1 | FileCheck %s --check-prefix=CONTENT-NOTES # CONTENT-NOTES: error: "Notes" cannot be used with "Content" or "Size" --- !ELF FileHeader: Class: ELFCLASS64 Data: ELFDATA2LSB Type: ET_DYN Sections: - Name: .note.foo Type: SHT_NOTE Content: "" Notes: [] ## "Size" and "Notes" cannot be used together to describe the SHT_NOTE section. # RUN: not yaml2obj --docnum=10 %s 2>&1 | FileCheck %s --check-prefix=CONTENT-NOTES --- !ELF FileHeader: Class: ELFCLASS64 Data: ELFDATA2LSB Type: ET_DYN Sections: - Name: .note.foo Type: SHT_NOTE Size: 1 Notes: [] ## Check we can use only "Size" to create a SHT_NOTE section. # RUN: yaml2obj --docnum=11 %s -o %t11 # RUN: llvm-readobj --sections --section-data %t11 | FileCheck %s --check-prefix=SIZE # SIZE: Name: .note.foo # 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: .note.foo Type: SHT_NOTE Size: 0x11 ## Check we can use "Size" and "Content" together to create a SHT_NOTE section. # RUN: yaml2obj --docnum=12 %s -o %t12 # RUN: llvm-readobj --sections --section-data %t12 | FileCheck %s --check-prefix=SIZE-CONTENT # SIZE-CONTENT: Name: .note.sizegr # SIZE-CONTENT: SectionData ( # SIZE-CONTENT-NEXT: 0000: 11223300 00 | # SIZE-CONTENT-NEXT: ) # SIZE-CONTENT: Name: .note.sizeeq # SIZE-CONTENT: SectionData ( # SIZE-CONTENT-NEXT: 0000: 112233 | # SIZE-CONTENT-NEXT: ) --- !ELF FileHeader: Class: ELFCLASS64 Data: ELFDATA2LSB Type: ET_EXEC Sections: - Name: .note.sizegr Type: SHT_NOTE Size: 0x5 Content: "112233" - Name: .note.sizeeq Type: SHT_NOTE Size: 0x3 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=13 %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: .note Type: SHT_NOTE Size: 0x1 Content: "1122" ## Check we can't use "Size" and "Notes" tags together. # RUN: not yaml2obj --docnum=14 %s 2>&1 | FileCheck %s --check-prefix=CONTENT-NOTES --- !ELF FileHeader: Class: ELFCLASS64 Data: ELFDATA2LSB Type: ET_EXEC Sections: - Name: .note Type: SHT_NOTE Size: 0x1 Notes: []