## Test how llvm-readobj/llvm-readelf tools handle invalid SHT_GNU_verdef sections. ## Check that we report a warning when sh_link references a non-existent section. # RUN: yaml2obj %s --docnum=1 -DLINK=0xFF -o %t1 # RUN: llvm-readobj -V %t1 2>&1 | FileCheck %s --check-prefix=INVALID-LINK-LLVM --implicit-check-not="warning:" -DFILE=%t1 # RUN: llvm-readelf -V %t1 2>&1 | FileCheck %s --check-prefix=INVALID-LINK-GNU --implicit-check-not="warning:" -DFILE=%t1 # INVALID-LINK-LLVM: warning: '[[FILE]]': invalid section linked to SHT_GNU_verdef section with index 1: invalid section index: 255 # INVALID-LINK-GNU: Version definition section '.gnu.version_d' contains 0 entries: # INVALID-LINK-GNU: warning: '[[FILE]]': invalid section linked to SHT_GNU_verdef section with index 1: invalid section index: 255 # INVALID-LINK-GNU-NEXT: Addr: 0000000000000000 Offset: 0x000040 Link: 255 () --- !ELF FileHeader: Class: ELFCLASS64 Data: ELFDATA2LSB Type: ET_DYN Sections: - Name: .gnu.version_d Type: SHT_GNU_verdef Link: [[LINK]] Entries: [] ## Check that we report a warning when the sh_link field of a SHT_GNU_verdef section references a non-string table section. # RUN: yaml2obj %s --docnum=1 -DLINK=0x0 -o %t2 # RUN: llvm-readobj -V %t2 2>&1 | FileCheck %s --check-prefix=INVALID-STRING-TABLE -DFILE=%t2 # RUN: llvm-readelf -V %t2 2>&1 | FileCheck %s --check-prefix=INVALID-STRING-TABLE -DFILE=%t2 # INVALID-STRING-TABLE: warning: '[[FILE]]': invalid string table linked to SHT_GNU_verdef section with index 1: invalid sh_type for string table section [index 0]: expected SHT_STRTAB, but got SHT_NULL ## Check that we report a warning when we can't read the content of the SHT_GNU_verdef section. # RUN: yaml2obj %s --docnum=2 -DSHOFFSET=0xFFFFFFFF -o %t3 # RUN: llvm-readobj -V %t3 2>&1 | FileCheck %s --check-prefix=INVALID-DATA -DFILE=%t3 # RUN: llvm-readelf -V %t3 2>&1 | FileCheck %s --check-prefix=INVALID-DATA -DFILE=%t3 # INVALID-DATA: warning: '[[FILE]]': cannot read content of SHT_GNU_verdef section with index 1: section [index 1] has a sh_offset (0xffffffff) + sh_size (0x0) that is greater than the file size (0x230) --- !ELF FileHeader: Class: ELFCLASS64 Data: ELFDATA2LSB Type: ET_DYN Sections: - Name: .gnu.version_d Type: SHT_GNU_verdef Entries: [] ShOffset: [[SHOFFSET=]] ShName: [[SHNAME=]] - Name: .dynstr Type: SHT_STRTAB ShName: [[DYNSTRNAME=]] DynamicSymbols: - Name: foo ## Check that llvm-readelf reports a warning when the name of the SHT_GNU_verdef section can't be read. # RUN: yaml2obj %s --docnum=2 -DSHNAME=0xFF -o %t.invalid.name # RUN: llvm-readobj -V %t.invalid.name 2>&1 | \ # RUN: FileCheck %s --check-prefix=INVALID-NAME-LLVM -DFILE=%t.invalid.name --implicit-check-not=warning: # RUN: llvm-readelf -V %t.invalid.name 2>&1 | \ # RUN: FileCheck %s --check-prefix=INVALID-NAME-GNU -DFILE=%t.invalid.name --implicit-check-not=warning: # INVALID-NAME-LLVM: VersionDefinitions [ # INVALID-NAME-LLVM-NEXT: ] # INVALID-NAME-GNU: warning: '[[FILE]]': unable to get the name of SHT_GNU_verdef section with index 1: a section [index 1] has an invalid sh_name (0xff) offset which goes past the end of the section name string table # INVALID-NAME-GNU-NEXT: Version definition section '' contains 0 entries: # INVALID-NAME-GNU-NEXT: Addr: 0000000000000000 Offset: 0x000040 Link: 2 (.dynstr) ## Check that llvm-readelf reports a warning when we are unable to read the name of ## the section linked with the SHT_GNU_verdef section (usually ".dynstr"). # RUN: yaml2obj %s --docnum=2 -DDYNSTRNAME=0xFF -o %t.invalid.name2 # RUN: llvm-readobj -V %t.invalid.name2 2>&1 | \ # RUN: FileCheck %s --check-prefix=INVALID-NAME-LLVM -DFILE=%t.invalid.name2 --implicit-check-not=warning: # RUN: llvm-readelf -V %t.invalid.name2 2>&1 | \ # RUN: FileCheck %s --check-prefix=INVALID-NAME2-GNU -DFILE=%t.invalid.name2 --implicit-check-not=warning: # INVALID-NAME2-GNU: Version definition section '.gnu.version_d' contains 0 entries: # INVALID-NAME2-GNU-NEXT: warning: '[[FILE]]': unable to get the name of SHT_STRTAB section with index 2: a section [index 2] has an invalid sh_name (0xff) offset which goes past the end of the section name string table # INVALID-NAME2-GNU-NEXT: Addr: 0000000000000000 Offset: 0x000040 Link: 2 () ## Check that we report a warning when a SHT_GNU_verdef section contains a version definition ## that goes past the end of the section. # RUN: yaml2obj %s --docnum=3 -o %t4 # RUN: llvm-readobj -V %t4 2>&1 | FileCheck %s --check-prefix=DEF-PAST-END -DFILE=%t4 # RUN: llvm-readelf -V %t4 2>&1 | FileCheck %s --check-prefix=DEF-PAST-END -DFILE=%t4 # DEF-PAST-END: warning: '[[FILE]]': invalid SHT_GNU_verdef section with index 1: version definition 1 goes past the end of the section --- !ELF FileHeader: Class: ELFCLASS64 Data: ELFDATA2LSB Type: ET_DYN Sections: - Name: .gnu.version_d Type: SHT_GNU_verdef Entries: - Names: - FOO ShSize: 1 DynamicSymbols: - Name: foo ## Check that we report a warning when a SHT_GNU_verdef section contains a version definition ## that refers to an auxiliary entry that goes past the end of the section. # RUN: yaml2obj %s --docnum=4 -o %t5 # RUN: llvm-readobj -V %t5 2>&1 | FileCheck %s --check-prefix=AUX-PAST-END -DFILE=%t5 # RUN: llvm-readelf -V %t5 2>&1 | FileCheck %s --check-prefix=AUX-PAST-END -DFILE=%t5 # AUX-PAST-END: warning: '[[FILE]]': invalid SHT_GNU_verdef section with index 1: version definition 1 refers to an auxiliary entry that goes past the end of the section --- !ELF FileHeader: Class: ELFCLASS64 Data: ELFDATA2LSB Type: ET_DYN Sections: - Name: .gnu.version_d Type: SHT_GNU_verdef Entries: - Names: - FOO ShSize: 21 DynamicSymbols: - Name: foo ## Check that we can dump a SHT_GNU_verdef section properly even if it contains version names strings ## that overrun the linked string table. # RUN: yaml2obj %s --docnum=5 -o %t6 # RUN: llvm-readobj -V %t6 2>&1 | FileCheck %s --check-prefix=PAST-STRTAB-END-LLVM --implicit-check-not="warning:" -DFILE=%t6 # RUN: llvm-readelf -V %t6 2>&1 | FileCheck %s --check-prefix=PAST-STRTAB-END-GNU --implicit-check-not="warning:" -DFILE=%t6 # PAST-STRTAB-END-LLVM: VersionDefinitions [ # PAST-STRTAB-END-LLVM-NEXT: Definition { # PAST-STRTAB-END-LLVM-NEXT: Version: 1 # PAST-STRTAB-END-LLVM-NEXT: Flags [ (0x0) # PAST-STRTAB-END-LLVM-NEXT: ] # PAST-STRTAB-END-LLVM-NEXT: Index: 0 # PAST-STRTAB-END-LLVM-NEXT: Hash: 0 # PAST-STRTAB-END-LLVM-NEXT: Name: # PAST-STRTAB-END-LLVM-NEXT: Predecessors: [] # PAST-STRTAB-END-LLVM-NEXT: } # PAST-STRTAB-END-LLVM-NEXT: ] # PAST-STRTAB-END-GNU: Version definition section '.gnu.version_d' contains 1 entries: # PAST-STRTAB-END-GNU-NEXT: Addr: 0000000000000000 Offset: 0x000040 Link: 2 (.strtab) # PAST-STRTAB-END-GNU-NEXT: 0x0000: Rev: 1 Flags: none Index: 0 Cnt: 1 Name: --- !ELF FileHeader: Class: ELFCLASS64 Data: ELFDATA2LSB Type: ET_DYN Sections: - Name: .gnu.version_d Type: SHT_GNU_verdef Link: .strtab Entries: - Names: - FOO - Name: .strtab Type: SHT_STRTAB DynamicSymbols: - Name: BAR ## Check we report a warning when a version definition is not correctly aligned in memory. # RUN: yaml2obj %s --docnum=6 -o %t7 # RUN: llvm-readobj -V %t7 2>&1 | FileCheck %s --check-prefix=MISALIGNED-DEF -DFILE=%t7 # RUN: llvm-readelf -V %t7 2>&1 | FileCheck %s --check-prefix=MISALIGNED-DEF -DFILE=%t7 # MISALIGNED-DEF: warning: '[[FILE]]': invalid SHT_GNU_verdef section with index 1: found a misaligned version definition entry at offset 0x0 --- !ELF FileHeader: Class: ELFCLASS64 Data: ELFDATA2LSB Type: ET_DYN Sections: - Type: Fill Size: 0x1 - Name: .gnu.version_d Type: SHT_GNU_verdef Link: .dynstr Info: 0x1 Entries: - Names: - FOO DynamicSymbols: - Name: foo ## Check we report a warning when an auxiliary entry is not correctly aligned in memory. # RUN: yaml2obj %s --docnum=7 -o %t8 # RUN: llvm-readobj -V %t8 2>&1 | FileCheck %s --check-prefix=MISALIGNED-AUX -DFILE=%t8 # RUN: llvm-readelf -V %t8 2>&1 | FileCheck %s --check-prefix=MISALIGNED-AUX -DFILE=%t8 # MISALIGNED-AUX: warning: '[[FILE]]': invalid SHT_GNU_verdef section with index 1: found a misaligned auxiliary entry at offset 0x13 --- !ELF FileHeader: Class: ELFCLASS64 Data: ELFDATA2LSB Type: ET_DYN Sections: - Name: .gnu.version_d Type: SHT_GNU_verdef Flags: [ SHF_ALLOC ] Link: .dynstr Info: 0x1 ## The byte offset to the auxiliary entry is 0x13, i.e. it is not correctly aligned in memory. Content: "0100000000000100000000001300000000000000" DynamicSymbols: - Name: foo Binding: STB_GLOBAL ## Check how we handle a version definition entry with an unsupported version. # RUN: yaml2obj %s --docnum=8 -o %t9 # RUN: llvm-readobj -V %t9 2>&1 | FileCheck %s --check-prefix=UNSUPPORTED-VERSION -DFILE=%t9 # RUN: llvm-readelf -V %t9 2>&1 | FileCheck %s --check-prefix=UNSUPPORTED-VERSION -DFILE=%t9 # UNSUPPORTED-VERSION: warning: '[[FILE]]': unable to dump SHT_GNU_verdef section with index 1: version 65278 is not yet supported --- !ELF FileHeader: Class: ELFCLASS64 Data: ELFDATA2LSB Type: ET_DYN Sections: - Name: .gnu.version_d Type: SHT_GNU_verdef Link: .dynstr Info: 0x1 Entries: - Version: 0xfefe Names: [] DynamicSymbols: - Name: foo ## Check we report a warning when trying to print version symbols, but SHT_GNU_verdef ## is invalid due to any reason. # RUN: yaml2obj %s --docnum=9 -o %t10 # RUN: llvm-readobj -V %t10 2>&1 | FileCheck %s --check-prefix=INVALID-VERDEF-LLVM -DFILE=%t10 # RUN: llvm-readelf -V %t10 2>&1 | FileCheck %s --check-prefix=INVALID-VERDEF-GNU -DFILE=%t10 # INVALID-VERDEF-LLVM: VersionSymbols [ # INVALID-VERDEF-LLVM-NEXT: Symbol { # INVALID-VERDEF-LLVM-NEXT: Version: 0 # INVALID-VERDEF-LLVM-NEXT: Name: {{$}} # INVALID-VERDEF-LLVM-NEXT: } # INVALID-VERDEF-LLVM-NEXT: Symbol { # INVALID-VERDEF-LLVM-NEXT: Version: 2 # INVALID-VERDEF-LLVM-NEXT: warning: '[[FILE]]': invalid SHT_GNU_verdef section with index 2: version definition 1 goes past the end of the section # INVALID-VERDEF-LLVM-NEXT: Name: foo@ # INVALID-VERDEF-GNU: Version symbols section '.gnu.version' contains 2 entries: # INVALID-VERDEF-GNU-NEXT: Addr: 0000000000000000 Offset: 0x000040 Link: 3 (.dynsym) # INVALID-VERDEF-GNU-NEXT: warning: '[[FILE]]': invalid SHT_GNU_verdef section with index 2: version definition 1 goes past the end of the section # INVALID-VERDEF-GNU-NEXT: 000: 0 (*local*) 2 () --- !ELF FileHeader: Class: ELFCLASS64 Data: ELFDATA2LSB Type: ET_DYN Sections: - Name: .gnu.version Type: SHT_GNU_versym Flags: [ SHF_ALLOC ] AddressAlign: 0x0000000000000002 EntSize: 0x0000000000000002 Entries: [ 0, 2 ] - Name: .gnu.version_d Type: SHT_GNU_verdef Flags: [ SHF_ALLOC ] AddressAlign: 0x4 Info: 0x1 Entries: [] DynamicSymbols: - Name: foo Binding: STB_GLOBAL