diff options
Diffstat (limited to 'llvm/test/tools/llvm-readobj/ELF/verneed-invalid.test')
-rw-r--r-- | llvm/test/tools/llvm-readobj/ELF/verneed-invalid.test | 606 |
1 files changed, 606 insertions, 0 deletions
diff --git a/llvm/test/tools/llvm-readobj/ELF/verneed-invalid.test b/llvm/test/tools/llvm-readobj/ELF/verneed-invalid.test new file mode 100644 index 00000000000..e8d75afe1e6 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/verneed-invalid.test @@ -0,0 +1,606 @@ +## Test how llvm-readobj/llvm-readelf tools handle invalid SHT_GNU_verneed sections. + +## In the first case we have a SHT_GNU_versym section that refers to +## a version listed in a SHT_GNU_verneed section. That version has an +## empty name, making it invalid. + +# RUN: yaml2obj --docnum=1 %s -o %t1 +# RUN: llvm-readelf -V %t1 | FileCheck %s --check-prefix=GNU-VERNEED-NAME +# RUN: llvm-readobj -V %t1 | FileCheck %s --check-prefix=LLVM-VERNEED-NAME + +# GNU-VERNEED-NAME: Version symbols section '.gnu.version' contains 2 entries: +# GNU-VERNEED-NAME-NEXT: Addr: 0000000000200210 Offset: 0x000040 Link: 5 (.dynsym) +# GNU-VERNEED-NAME-NEXT: 000: 0 (*local*) 2 (*invalid*) + +# GNU-VERNEED-NAME: Version needs section '.gnu.version_r' contains 1 entries: +# GNU-VERNEED-NAME-NEXT: Addr: 0000000000000000 Offset: 0x000044 Link: 6 (.dynstr) +# GNU-VERNEED-NAME-NEXT: 0x0000: Version: 1 File: somefile Cnt: 1 +# GNU-VERNEED-NAME-NEXT: 0x0010: Name: Flags: none Version: 2 + +# LLVM-VERNEED-NAME: VersionSymbols [ +# LLVM-VERNEED-NAME: Symbol { +# LLVM-VERNEED-NAME-NEXT: Version: 0 +# LLVM-VERNEED-NAME-NEXT: Name: +# LLVM-VERNEED-NAME-NEXT: } +# LLVM-VERNEED-NAME-NEXT: Symbol { +# LLVM-VERNEED-NAME-NEXT: Version: 2 +# LLVM-VERNEED-NAME-NEXT: Name: foo +# LLVM-VERNEED-NAME-NEXT: } +# LLVM-VERNEED-NAME-NEXT: ] + +# LLVM-VERNEED-NAME: VersionRequirements [ +# LLVM-VERNEED-NAME-NEXT: Dependency { +# LLVM-VERNEED-NAME-NEXT: Version: 1 +# LLVM-VERNEED-NAME-NEXT: Count: 1 +# LLVM-VERNEED-NAME-NEXT: FileName: somefile +# LLVM-VERNEED-NAME-NEXT: Entries [ +# LLVM-VERNEED-NAME-NEXT: Entry { +# LLVM-VERNEED-NAME-NEXT: Hash: 0 +# LLVM-VERNEED-NAME-NEXT: Flags [ (0x0) +# LLVM-VERNEED-NAME-NEXT: ] +# LLVM-VERNEED-NAME-NEXT: Index: 2 +# LLVM-VERNEED-NAME-NEXT: Name: {{$}} +# LLVM-VERNEED-NAME-NEXT: } +# LLVM-VERNEED-NAME-NEXT: ] +# LLVM-VERNEED-NAME-NEXT: } +# LLVM-VERNEED-NAME-NEXT: ] + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 +Sections: + - Name: .gnu.version + Type: SHT_GNU_versym + Flags: [ SHF_ALLOC ] + Address: 0x200210 + Link: .dynsym + Entries: [ 0, 2 ] + - Name: .gnu.version_r + Type: SHT_GNU_verneed + Flags: [ SHF_ALLOC ] + Link: .dynstr + Info: 1 + AddressAlign: 4 + Dependencies: + - Version: 1 + File: somefile + Entries: + - Name: '' ## invalid name + Hash: 0 + Flags: 0 + Other: 2 +DynamicSymbols: + - Name: foo + Binding: STB_GLOBAL +... + +## In this case SHT_GNU_verneed is not linked to a dynamic string table. We check we handle +## this situation properly. + +# RUN: yaml2obj --docnum=2 %s -o %t2 +# RUN: llvm-readelf -V %t2 2>&1 | FileCheck %s -DFILE=%t2 --check-prefix=GNU-NOLINK +# RUN: llvm-readobj -V %t2 2>&1 | FileCheck %s -DFILE=%t2 --check-prefix=LLVM-NOLINK + +# GNU-NOLINK: Version symbols section '.gnu.version' contains 2 entries: +# GNU-NOLINK-NEXT: Addr: 0000000000000000 Offset: 0x000040 Link: 5 (.dynsym) +# GNU-NOLINK-NEXT: 000: 0 (*local*) +# GNU-NOLINK-NEXT: warning: '[[FILE]]': invalid string table linked to SHT_GNU_verneed section with index 2: invalid sh_type for string table section [index 0]: expected SHT_STRTAB, but got SHT_NULL +# GNU-NOLINK-NEXT: 2 (<corrupt>) +# GNU-NOLINK-EMPTY: +# GNU-NOLINK: Version needs section '.gnu.version_r' contains 1 entries: +# GNU-NOLINK-NEXT: Addr: 0000000000000000 Offset: 0x000044 Link: 0 () +# GNU-NOLINK-NEXT: 0x0000: Version: 1 File: <corrupt vn_file: 9> Cnt: 1 +# GNU-NOLINK-NEXT: 0x0010: Name: <corrupt> Flags: none Version: 2 + +# LLVM-NOLINK: VersionSymbols [ +# LLVM-NOLINK: Symbol { +# LLVM-NOLINK-NEXT: Version: 0 +# LLVM-NOLINK-NEXT: Name: +# LLVM-NOLINK-NEXT: } +# LLVM-NOLINK-NEXT: Symbol { +# LLVM-NOLINK-NEXT: Version: 2 +# LLVM-NOLINK-EMPTY: +# LLVM-NOLINK-NEXT: warning: '[[FILE]]': invalid string table linked to SHT_GNU_verneed section with index 2: invalid sh_type for string table section [index 0]: expected SHT_STRTAB, but got SHT_NULL +# LLVM-NOLINK-NEXT: Name: foo@<corrupt> +# LLVM-NOLINK-NEXT: } +# LLVM-NOLINK-NEXT: ] + +# LLVM-NOLINK: VersionRequirements [ +# LLVM-NOLINK-NEXT: Dependency { +# LLVM-NOLINK-NEXT: Version: 1 +# LLVM-NOLINK-NEXT: Count: 1 +# LLVM-NOLINK-NEXT: FileName: <corrupt vn_file: 9> +# LLVM-NOLINK-NEXT: Entries [ +# LLVM-NOLINK-NEXT: Entry { +# LLVM-NOLINK-NEXT: Hash: 0 +# LLVM-NOLINK-NEXT: Flags [ (0x0) +# LLVM-NOLINK-NEXT: ] +# LLVM-NOLINK-NEXT: Index: 2 +# LLVM-NOLINK-NEXT: Name: <corrupt> +# LLVM-NOLINK-NEXT: } +# LLVM-NOLINK-NEXT: ] +# LLVM-NOLINK-NEXT: } +# LLVM-NOLINK-NEXT: ] + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 +Sections: + - Name: .gnu.version + Type: SHT_GNU_versym + Flags: [ SHF_ALLOC ] + Link: .dynsym + Entries: [ 0, 2 ] + - Name: .gnu.version_r + Type: SHT_GNU_verneed + Flags: [ SHF_ALLOC ] + Link: 0 + Info: 1 + AddressAlign: 4 + Dependencies: + - Version: 1 + File: somefile + Entries: + - Name: 'bar' + Hash: 0 + Flags: 0 + Other: 2 +DynamicSymbols: + - Name: foo + Binding: STB_GLOBAL + +## We can't parse misaligned auxiliary version records. + +# RUN: yaml2obj --docnum=3 %s -o %t3 +# RUN: not llvm-readelf -V %t3 2>&1 | FileCheck %s -DFILE=%t3 --check-prefix=BROKEN-AUX +# RUN: not llvm-readobj -V %t3 2>&1 | FileCheck %s -DFILE=%t3 --check-prefix=BROKEN-AUX + +# BROKEN-AUX: error: '[[FILE]]': invalid SHT_GNU_verneed section with index 2: found a misaligned auxiliary entry at offset 0x11 + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 +Sections: + - Name: .gnu.version + Type: SHT_GNU_versym + Flags: [ SHF_ALLOC ] + Link: .dynsym + Entries: [ 2 ] + - Name: .gnu.version_r + Type: SHT_GNU_verneed + Flags: [ SHF_ALLOC ] + Info: 1 + Link: .dynstr + AddressAlign: 4 +## The byte offset to the auxiliary entry is 0x11, i.e. it is not correctly aligned in memory. + Content: "0100010001000000110000000000000000000000" +DynamicSymbols: [] + +## Here we check that we can properly dump the case when a dependency file name +## and/or a dependency name string offset is equal to the string table size. +## +## We set the version dependency vn_file field to the offset of string 'foo' in +## the .dynstr, which is 1. We create a custom string table .mystrtab of size 1 +## and link it with the .gnu.version_r section. For the vna_name we use the same trick. + +# RUN: yaml2obj --docnum=4 %s -o %t4 +# RUN: llvm-readobj --sections --section-data -V %t4 | FileCheck %s --check-prefix=LLVM-OFFSET-EQ +# RUN: llvm-readelf --sections -V %t4 | FileCheck %s --check-prefix=GNU-OFFSET-EQ + +# LLVM-OFFSET-EQ: Name: .mystrtab +# LLVM-OFFSET-EQ: Size: +# LLVM-OFFSET-EQ-SAME: 1 + +# LLVM-OFFSET-EQ: Name: .dynstr +# LLVM-OFFSET-EQ: SectionData ( +# LLVM-OFFSET-EQ-NEXT: 0000: 00666F6F 00 |.foo.| +# LLVM-OFFSET-EQ-NEXT: ) + +# LLVM-OFFSET-EQ: VersionRequirements [ +# LLVM-OFFSET-EQ-NEXT: Dependency { +# LLVM-OFFSET-EQ-NEXT: Version: 1 +# LLVM-OFFSET-EQ-NEXT: Count: 1 +# LLVM-OFFSET-EQ-NEXT: FileName: <corrupt vn_file: 1> +# LLVM-OFFSET-EQ-NEXT: Entries [ +# LLVM-OFFSET-EQ-NEXT: Entry { +# LLVM-OFFSET-EQ-NEXT: Hash: 0 +# LLVM-OFFSET-EQ-NEXT: Flags [ (0x0) +# LLVM-OFFSET-EQ-NEXT: ] +# LLVM-OFFSET-EQ-NEXT: Index: 0 +# LLVM-OFFSET-EQ-NEXT: Name: <corrupt> +# LLVM-OFFSET-EQ-NEXT: } +# LLVM-OFFSET-EQ-NEXT: ] +# LLVM-OFFSET-EQ-NEXT: } +# LLVM-OFFSET-EQ-NEXT: ] + +# GNU-OFFSET-EQ: Version needs section '.gnu.version_r' contains 1 entries: +# GNU-OFFSET-EQ-NEXT: Addr: 0000000000000000 Offset: 0x000044 Link: 1 (.mystrtab) +# GNU-OFFSET-EQ-NEXT: 0x0000: Version: 1 File: <corrupt vn_file: 1> Cnt: 1 +# GNU-OFFSET-EQ-NEXT: 0x0010: Name: <corrupt> Flags: none Version: 0 + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 +Sections: + - Name: .mystrtab + Type: SHT_STRTAB + Content: "00" + - Name: .gnu.version_r + Type: SHT_GNU_verneed + Flags: [ SHF_ALLOC ] + Info: 1 + Link: .mystrtab + AddressAlign: 4 + Dependencies: + - Version: 1 + File: foo + Entries: + - Name: 'foo' + Hash: 0 + Flags: 0 + Other: 0 +DynamicSymbols: + - Name: foo + +## Here we check that we can properly dump the case when a dependency file name +## and/or a dependency name string offset is greater than the string table size. +## +# RUN: yaml2obj --docnum=5 %s -o %t5 +# RUN: llvm-readobj --sections -V %t5 | FileCheck %s --check-prefix=LLVM-OFFSET-GR +# RUN: llvm-readelf --sections -V %t5 | FileCheck %s --check-prefix=GNU-OFFSET-GR + +# LLVM-OFFSET-GR: VersionRequirements [ +# LLVM-OFFSET-GR-NEXT: Dependency { +# LLVM-OFFSET-GR-NEXT: Version: 1 +# LLVM-OFFSET-GR-NEXT: Count: 1 +# LLVM-OFFSET-GR-NEXT: FileName: <corrupt vn_file: 1> +# LLVM-OFFSET-GR-NEXT: Entries [ +# LLVM-OFFSET-GR-NEXT: Entry { +# LLVM-OFFSET-GR-NEXT: Hash: 0 +# LLVM-OFFSET-GR-NEXT: Flags [ (0x0) +# LLVM-OFFSET-GR-NEXT: ] +# LLVM-OFFSET-GR-NEXT: Index: 0 +# LLVM-OFFSET-GR-NEXT: Name: <corrupt> +# LLVM-OFFSET-GR-NEXT: } +# LLVM-OFFSET-GR-NEXT: ] +# LLVM-OFFSET-GR-NEXT: } +# LLVM-OFFSET-GR-NEXT: ] + +# GNU-OFFSET-GR: Version needs section '.gnu.version_r' contains 1 entries: +# GNU-OFFSET-GR-NEXT: Addr: 0000000000000000 Offset: 0x000040 Link: 1 (.mystrtab) +# GNU-OFFSET-GR-NEXT: 0x0000: Version: 1 File: <corrupt vn_file: 1> Cnt: 1 +# GNU-OFFSET-GR-NEXT: 0x0010: Name: <corrupt> Flags: none Version: 0 + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 +Sections: + - Name: .mystrtab + Type: SHT_STRTAB + Content: "" + - Name: .gnu.version_r + Type: SHT_GNU_verneed + Flags: [ SHF_ALLOC ] + Info: 1 + Link: .mystrtab + AddressAlign: 4 + Dependencies: + - Version: 1 + File: foo + Entries: + - Name: 'foo' + Hash: 0 + Flags: 0 + Other: 0 +DynamicSymbols: + - Name: foo + +## Check that we report a warning when sh_link references a non-existent section. + +# RUN: yaml2obj --docnum=6 %s -o %t6 +# RUN: llvm-readobj --sections -V %t6 2>&1 | FileCheck %s -DFILE=%t6 --implicit-check-not="warning:" --check-prefix=INVALID-LINK-LLVM +# RUN: llvm-readelf --sections -V %t6 2>&1 | FileCheck %s -DFILE=%t6 --implicit-check-not="warning:" --check-prefix=INVALID-LINK-GNU + +# INVALID-LINK-LLVM: VersionRequirements [ +# INVALID-LINK-LLVM-EMPTY: +# INVALID-LINK-LLVM-NEXT: warning: '[[FILE]]': invalid section linked to SHT_GNU_verneed section with index 1: invalid section index: 255 +# INVALID-LINK-LLVM-NEXT: Dependency { +# INVALID-LINK-LLVM-NEXT: Version: 1 +# INVALID-LINK-LLVM-NEXT: Count: 1 +# INVALID-LINK-LLVM-NEXT: FileName: <corrupt vn_file: 1> +# INVALID-LINK-LLVM-NEXT: Entries [ +# INVALID-LINK-LLVM-NEXT: Entry { +# INVALID-LINK-LLVM-NEXT: Hash: 0 +# INVALID-LINK-LLVM-NEXT: Flags [ (0x0) +# INVALID-LINK-LLVM-NEXT: ] +# INVALID-LINK-LLVM-NEXT: Index: 0 +# INVALID-LINK-LLVM-NEXT: Name: <corrupt> +# INVALID-LINK-LLVM-NEXT: } +# INVALID-LINK-LLVM-NEXT: ] +# INVALID-LINK-LLVM-NEXT: } +# INVALID-LINK-LLVM-NEXT: ] + +# INVALID-LINK-GNU: Version needs section '.gnu.version_r' contains 1 entries: +# INVALID-LINK-GNU-EMPTY: +# INVALID-LINK-GNU-NEXT: warning: '[[FILE]]': invalid section linked to SHT_GNU_verneed section with index 1: invalid section index: 255 +# INVALID-LINK-GNU-NEXT: Addr: 0000000000000000 Offset: 0x000040 Link: 255 (<corrupt>) +# INVALID-LINK-GNU-NEXT: 0x0000: Version: 1 File: <corrupt vn_file: 1> Cnt: 1 +# INVALID-LINK-GNU-NEXT: 0x0010: Name: <corrupt> Flags: none Version: 0 + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 +Sections: + - Name: .gnu.version_r + Type: SHT_GNU_verneed + Flags: [ SHF_ALLOC ] + Info: 1 + Link: 0xFF + Dependencies: + - Version: 1 + File: foo + Entries: + - Name: 'foo' + Hash: 0 + Flags: 0 + Other: 0 +DynamicSymbols: + - Name: foo + +## Check that we report a warning when we can't read the content of the SHT_GNU_verneed section. + +# RUN: yaml2obj --docnum=7 %s -o %t7 +# RUN: llvm-readobj --sections -V %t7 2>&1 | FileCheck %s -DFILE=%t7 --check-prefix=INVALID-DATA +# RUN: llvm-readelf --sections -V %t7 2>&1 | FileCheck %s -DFILE=%t7 --check-prefix=INVALID-DATA + +# INVALID-DATA: warning: '[[FILE]]': cannot read content of SHT_GNU_verneed 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_EXEC + Machine: EM_X86_64 +Sections: + - Name: .gnu.version_r + Type: SHT_GNU_verneed + Flags: [ SHF_ALLOC ] + Info: 1 + Link: .dynstr + ShOffset: 0xFFFFFFFF +## Triggers creation of the .dynstr. +DynamicSymbols: + - Name: foo + +## Check that we report a warning when a SHT_GNU_verneed section contains a version dependency +## that goes past the end of the section. + +# RUN: yaml2obj --docnum=8 %s -o %t8 +# RUN: llvm-readobj --sections -V %t8 2>&1 | FileCheck %s -DFILE=%t8 --check-prefix=DEP-PAST-END +# RUN: llvm-readelf --sections -V %t8 2>&1 | FileCheck %s -DFILE=%t8 --check-prefix=DEP-PAST-END + +# DEP-PAST-END: warning: '[[FILE]]': invalid SHT_GNU_verneed section with index 1: version dependency 1 goes past the end of the section + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 +Sections: + - Name: .gnu.version_r + Type: SHT_GNU_verneed + Flags: [ SHF_ALLOC ] + Info: 1 + Link: .dynstr + ShSize: 0x1 + Dependencies: + - Version: 1 + File: foo + Entries: + - Name: 'foo' + Hash: 0 + Flags: 0 + Other: 0 +DynamicSymbols: + - Name: foo + +## Check we report a warning when a version dependency is not correctly aligned in memory. + +# RUN: yaml2obj --docnum=9 %s -o %t9 +# RUN: llvm-readobj --sections -V %t9 2>&1 | FileCheck %s -DFILE=%t9 --check-prefix=MISALIGNED-DEP +# RUN: llvm-readelf --sections -V %t9 2>&1 | FileCheck %s -DFILE=%t9 --check-prefix=MISALIGNED-DEP + +# MISALIGNED-DEP: warning: '[[FILE]]': invalid SHT_GNU_verneed section with index 1: found a misaligned version dependency entry at offset 0x0 + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 +Sections: + - Type: Fill + Size: 0x1 + - Name: .gnu.version_r + Type: SHT_GNU_verneed + Flags: [ SHF_ALLOC ] + Info: 1 + Link: .dynstr + Dependencies: + - Version: 1 + File: foo + Entries: + - Name: 'foo' + Hash: 0 + Flags: 0 + Other: 0 +DynamicSymbols: + - Name: foo + +## Check that we report a warning when a SHT_GNU_verneed section contains a dependency definition +## that refers to an auxiliary entry that goes past the end of the section. + +# RUN: yaml2obj --docnum=10 %s -o %t10 +# RUN: llvm-readobj --sections -V %t10 2>&1 | FileCheck %s -DFILE=%t10 --check-prefix=AUX-PAST-END +# RUN: llvm-readelf --sections -V %t10 2>&1 | FileCheck %s -DFILE=%t10 --check-prefix=AUX-PAST-END + +# AUX-PAST-END: warning: '[[FILE]]': invalid SHT_GNU_verneed section with index 1: version dependency 1 refers to an auxiliary entry that goes past the end of the section + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 +Sections: + - Name: .gnu.version_r + Type: SHT_GNU_verneed + Flags: [ SHF_ALLOC ] + Info: 1 + Link: .dynstr + ShSize: 21 + Dependencies: + - Version: 1 + File: foo + Entries: + - Name: 'foo' + Hash: 0 + Flags: 0 + Other: 0 +DynamicSymbols: + - Name: foo + +## Check we report a warning when an auxiliary entry is not correctly aligned in memory. + +# RUN: yaml2obj %s --docnum=11 -o %t11 +# RUN: llvm-readobj -V %t11 2>&1 | FileCheck %s --check-prefix=MISALIGNED-AUX -DFILE=%t11 +# RUN: llvm-readelf -V %t11 2>&1 | FileCheck %s --check-prefix=MISALIGNED-AUX -DFILE=%t11 + +# MISALIGNED-AUX: warning: '[[FILE]]': invalid SHT_GNU_verneed section with index 1: found a misaligned auxiliary entry at offset 0x11 + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 +Sections: + - Name: .gnu.version_r + Type: SHT_GNU_verneed + Flags: [ SHF_ALLOC ] + Info: 1 + Link: .dynstr +## The byte offset to the auxiliary entry is 0x11, i.e. it is not correctly aligned in memory. + Content: "0100010001000000110000000000000000000000" +DynamicSymbols: + - Name: foo + +## Check how we handle the case when a dependency definition entry has an unsupported version. + +# RUN: yaml2obj %s --docnum=12 -o %t12 +# RUN: llvm-readobj -V %t12 2>&1 | FileCheck %s --check-prefix=UNSUPPORTED-VERSION -DFILE=%t12 +# RUN: llvm-readelf -V %t12 2>&1 | FileCheck %s --check-prefix=UNSUPPORTED-VERSION -DFILE=%t12 + +# UNSUPPORTED-VERSION: warning: '[[FILE]]': unable to dump SHT_GNU_verneed section with index 1: version 65278 is not yet supported + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 +Sections: + - Name: .gnu.version_r + Type: SHT_GNU_verneed + Flags: [ SHF_ALLOC ] + Info: 1 + Link: .dynstr + Dependencies: + - Version: 0xfefe + File: foo + Entries: + - Name: 'foo' + Hash: 0 + Flags: 0 + Other: 0 +DynamicSymbols: + - Name: foo + +## In this case SHT_GNU_verneed is linked to a custom dynamic string table, which is not +## called ".dynstr". Check we handle this case properly. + +# RUN: yaml2obj --docnum=13 %s -o %t13 +# RUN: llvm-readelf -V %t13 2>&1 | FileCheck %s -DFILE=%t13 --check-prefix=GNU-CUSTOM-DYNSTR +# RUN: llvm-readobj -V %t13 2>&1 | FileCheck %s -DFILE=%t13 --check-prefix=LLVM-CUSTOM-DYNSTR + +# GNU-CUSTOM-DYNSTR: Version symbols section '.gnu.version' contains 2 entries: +# GNU-CUSTOM-DYNSTR-NEXT: Addr: 0000000000000000 Offset: 0x000040 Link: 6 (.dynsym) +# GNU-CUSTOM-DYNSTR-NEXT: 000: 0 (*local*) 2 (bcdefghij) +# GNU-CUSTOM-DYNSTR: Version needs section '.gnu.version_r' contains 1 entries: +# GNU-CUSTOM-DYNSTR-NEXT: Addr: 0000000000000000 Offset: 0x000044 Link: 3 (.custom.dynstr) +# GNU-CUSTOM-DYNSTR-NEXT: 0x0000: Version: 1 File: j Cnt: 1 +# GNU-CUSTOM-DYNSTR-NEXT: 0x0010: Name: bcdefghij Flags: none Version: 2 + +# LLVM-CUSTOM-DYNSTR: VersionSymbols [ +# LLVM-CUSTOM-DYNSTR: Symbol { +# LLVM-CUSTOM-DYNSTR: Version: 2 +# LLVM-CUSTOM-DYNSTR-NEXT: Name: foo@bcdefghij + +# LLVM-CUSTOM-DYNSTR: VersionRequirements [ +# LLVM-CUSTOM-DYNSTR: Dependency { +# LLVM-CUSTOM-DYNSTR: Entries [ +# LLVM-CUSTOM-DYNSTR: Entry { +# LLVM-CUSTOM-DYNSTR: Index: 2 +# LLVM-CUSTOM-DYNSTR-NEXT: Name: bcdefghij + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 +Sections: + - Name: .gnu.version + Type: SHT_GNU_versym + Flags: [ SHF_ALLOC ] + Link: .dynsym + Entries: [ 0, 2 ] + - Name: .gnu.version_r + Type: SHT_GNU_verneed + Flags: [ SHF_ALLOC ] + Link: .custom.dynstr + Info: 1 + AddressAlign: 4 + Dependencies: + - Version: 1 + File: zed + Entries: + - Name: 'bar' + Hash: 0 + Flags: 0 + Other: 2 + - Name: .custom.dynstr + Type: SHT_STRTAB + Content: "6162636465666768696a00" ## 'a','b','c','d','e','f','g','h','i','j',NIL +DynamicSymbols: + - Name: foo + Binding: STB_GLOBAL |