| ## 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: 3 (.dynsym) |
| # GNU-VERNEED-NAME-NEXT: 000: 0 (*local*) 2 () |
| |
| # GNU-VERNEED-NAME: Version needs section '.gnu.version_r' contains 1 entries: |
| # GNU-VERNEED-NAME-NEXT: Addr: 0000000000200214 Offset: 0x000044 Link: 4 (.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 |
| Sections: |
| - Name: .gnu.version |
| Type: SHT_GNU_versym |
| Flags: [ SHF_ALLOC ] |
| Address: 0x200210 |
| Entries: [ 0, 2 ] |
| - Name: .gnu.version_r |
| Type: SHT_GNU_verneed |
| Flags: [ SHF_ALLOC ] |
| 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: 3 (.dynsym) |
| # 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: 000: 0 (*local*) 2 (<corrupt>) |
| # GNU-NOLINK: Version needs section '.gnu.version_r' contains 1 entries: |
| # GNU-NOLINK-NEXT: Addr: 0000000000000004 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-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 |
| Sections: |
| - Name: .gnu.version |
| Type: SHT_GNU_versym |
| Flags: [ SHF_ALLOC ] |
| Entries: [ 0, 2 ] |
| - Name: .gnu.version_r |
| Type: SHT_GNU_verneed |
| Flags: [ SHF_ALLOC ] |
| Link: 0 |
| 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: llvm-readelf -V %t3 2>&1 | FileCheck %s -DFILE=%t3 --check-prefix=BROKEN-AUX-GNU |
| # RUN: llvm-readobj -V %t3 2>&1 | FileCheck %s -DFILE=%t3 --check-prefix=BROKEN-AUX-LLVM |
| |
| # BROKEN-AUX-GNU: Version symbols section '.gnu.version' contains 1 entries: |
| # BROKEN-AUX-GNU-NEXT: Addr: 0000000000000000 Offset: 0x000040 Link: 3 (.dynsym) |
| # BROKEN-AUX-GNU-NEXT: warning: '[[FILE]]': invalid SHT_GNU_verneed section with index 2: found a misaligned auxiliary entry at offset 0x11 |
| # BROKEN-AUX-GNU-NEXT: 000: 2 (<corrupt>) |
| |
| # BROKEN-AUX-LLVM: VersionSymbols [ |
| # BROKEN-AUX-LLVM-NEXT: Symbol { |
| # BROKEN-AUX-LLVM-NEXT: Version: 2 |
| # BROKEN-AUX-LLVM-NEXT: warning: '[[FILE]]': invalid SHT_GNU_verneed section with index 2: found a misaligned auxiliary entry at offset 0x11 |
| # BROKEN-AUX-LLVM-NEXT: Name: @<corrupt> |
| # BROKEN-AUX-LLVM-NEXT: } |
| # BROKEN-AUX-LLVM-NEXT: ] |
| |
| --- !ELF |
| FileHeader: |
| Class: ELFCLASS64 |
| Data: ELFDATA2LSB |
| Type: ET_EXEC |
| Sections: |
| - Name: .gnu.version |
| Type: SHT_GNU_versym |
| Flags: [ SHF_ALLOC ] |
| Entries: [ 2 ] |
| - Name: .gnu.version_r |
| Type: SHT_GNU_verneed |
| Flags: [ SHF_ALLOC ] |
| Info: 1 |
| 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: 0000000000000004 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 |
| Sections: |
| - Name: .mystrtab |
| Type: SHT_STRTAB |
| Content: "00" |
| - Name: .gnu.version_r |
| Type: SHT_GNU_verneed |
| Flags: [ SHF_ALLOC ] |
| 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 |
| Sections: |
| - Name: .mystrtab |
| Type: SHT_STRTAB |
| Content: "" |
| - Name: .gnu.version_r |
| Type: SHT_GNU_verneed |
| Flags: [ SHF_ALLOC ] |
| 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 -DLINK=0xFF -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-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-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 |
| Sections: |
| - Name: .gnu.version_r |
| Type: SHT_GNU_verneed |
| Flags: [ SHF_ALLOC ] |
| Link: [[LINK=.dynstr]] |
| ShName: [[SHNAME=<none>]] |
| Dependencies: |
| - Version: 1 |
| File: foo |
| Entries: |
| - Name: 'foo' |
| Hash: 0 |
| Flags: 0 |
| Other: 0 |
| - 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_verneed section can't be read. |
| |
| # RUN: yaml2obj --docnum=6 %s -DSHNAME=0xFFFFFFFF -o %t.invalid.name |
| # RUN: llvm-readobj -V %t.invalid.name 2>&1 | \ |
| # RUN: FileCheck %s -DFILE=%t.invalid.name --check-prefix=INVALID-NAME-LLVM --implicit-check-not=warning: |
| # RUN: llvm-readelf -V %t.invalid.name 2>&1 | \ |
| # RUN: FileCheck %s -DFILE=%t.invalid.name --check-prefix=INVALID-NAME-GNU --implicit-check-not=warning: |
| |
| # INVALID-NAME-LLVM: VersionRequirements [ |
| # INVALID-NAME-LLVM-NEXT: Dependency { |
| # INVALID-NAME-LLVM-NEXT: Version: 1 |
| # INVALID-NAME-LLVM-NEXT: Count: 1 |
| # INVALID-NAME-LLVM-NEXT: FileName: foo |
| # INVALID-NAME-LLVM-NEXT: Entries [ |
| # INVALID-NAME-LLVM-NEXT: Entry { |
| # INVALID-NAME-LLVM-NEXT: Hash: 0 |
| # INVALID-NAME-LLVM-NEXT: Flags [ (0x0) |
| # INVALID-NAME-LLVM-NEXT: ] |
| # INVALID-NAME-LLVM-NEXT: Index: 0 |
| # INVALID-NAME-LLVM-NEXT: Name: foo |
| # INVALID-NAME-LLVM-NEXT: } |
| # INVALID-NAME-LLVM-NEXT: ] |
| # INVALID-NAME-LLVM-NEXT: } |
| # INVALID-NAME-LLVM-NEXT: ] |
| |
| # INVALID-NAME-GNU: warning: '[[FILE]]': unable to get the name of SHT_GNU_verneed section with index 1: a section [index 1] has an invalid sh_name (0xffffffff) offset which goes past the end of the section name string table |
| # INVALID-NAME-GNU-NEXT: Version needs section '<?>' contains 1 entries: |
| # INVALID-NAME-GNU-NEXT: Addr: 0000000000000000 Offset: 0x000040 Link: 2 (.dynstr) |
| # INVALID-NAME-GNU-NEXT: 0x0000: Version: 1 File: foo Cnt: 1 |
| # INVALID-NAME-GNU-NEXT: 0x0010: Name: foo Flags: none Version: 0 |
| |
| ## Check that llvm-readelf reports a warning when we are unable to read the name of |
| ## the section linked with the SHT_GNU_verneed section (usually ".dynstr"). |
| |
| # RUN: yaml2obj --docnum=6 %s -DDYNSTRNAME=0xFFFFFFFF -o %t.invalid.name2 |
| # RUN: llvm-readobj -V %t.invalid.name2 2>&1 | \ |
| # RUN: FileCheck %s -DFILE=%t.invalid.name2 --check-prefix=INVALID-NAME-LLVM --implicit-check-not=warning: |
| # RUN: llvm-readelf -V %t.invalid.name2 2>&1 | \ |
| # RUN: FileCheck %s -DFILE=%t.invalid.name2 --check-prefix=INVALID-NAME2-GNU --implicit-check-not=warning: |
| |
| # INVALID-NAME2-GNU: Version needs section '.gnu.version_r' contains 1 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 (0xffffffff) offset which goes past the end of the section name string table |
| # INVALID-NAME2-GNU-NEXT: Addr: 0000000000000000 Offset: 0x000040 Link: 2 (<?>) |
| # INVALID-NAME2-GNU-NEXT: 0x0000: Version: 1 File: foo Cnt: 1 |
| # INVALID-NAME2-GNU-NEXT: 0x0010: Name: foo Flags: none Version: 0 |
| |
| ## 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 (0x228) |
| |
| --- !ELF |
| FileHeader: |
| Class: ELFCLASS64 |
| Data: ELFDATA2LSB |
| Type: ET_EXEC |
| Sections: |
| - Name: .gnu.version_r |
| Type: SHT_GNU_verneed |
| Flags: [ SHF_ALLOC ] |
| 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 |
| Sections: |
| - Name: .gnu.version_r |
| Type: SHT_GNU_verneed |
| Flags: [ SHF_ALLOC ] |
| 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 |
| Sections: |
| - Type: Fill |
| Size: 0x1 |
| - Name: .gnu.version_r |
| Type: SHT_GNU_verneed |
| Flags: [ SHF_ALLOC ] |
| 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 |
| Sections: |
| - Name: .gnu.version_r |
| Type: SHT_GNU_verneed |
| Flags: [ SHF_ALLOC ] |
| 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 |
| Sections: |
| - Name: .gnu.version_r |
| Type: SHT_GNU_verneed |
| Flags: [ SHF_ALLOC ] |
| Info: 1 |
| ## 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 |
| Sections: |
| - Name: .gnu.version_r |
| Type: SHT_GNU_verneed |
| Flags: [ SHF_ALLOC ] |
| 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: 4 (.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: 0000000000000004 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 |
| Sections: |
| - Name: .gnu.version |
| Type: SHT_GNU_versym |
| Flags: [ SHF_ALLOC ] |
| Entries: [ 0, 2 ] |
| - Name: .gnu.version_r |
| Type: SHT_GNU_verneed |
| Flags: [ SHF_ALLOC ] |
| Link: .custom.dynstr |
| 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 |