summaryrefslogtreecommitdiffstats
path: root/llvm/test/tools/llvm-readobj/ELF/verneed-invalid.test
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/test/tools/llvm-readobj/ELF/verneed-invalid.test')
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/verneed-invalid.test606
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
OpenPOWER on IntegriCloud