| ## 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 (<corrupt>) |
| |
| --- !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=<none>]] |
| ShName: [[SHNAME=<none>]] |
| - Name: .dynstr |
| Type: SHT_STRTAB |
| ShName: [[DYNSTRNAME=<none>]] |
| 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: <invalid vda_name: 5> |
| # 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: <invalid vda_name: 5> |
| |
| --- !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@<corrupt> |
| |
| # 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 (<corrupt>) |
| |
| --- !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 |