| ## Check we print symbol versions, when they are available. |
| |
| ## Test undefined symbols. |
| # RUN: yaml2obj %s -o %t-undef.o |
| # RUN: llvm-objdump -T %t-undef.o 2>&1 | tr '\t' '|' | FileCheck %s \ |
| # RUN: -DFILE=%t-undef.o --check-prefix=UNDEF --match-full-lines --strict-whitespace |
| |
| ## version2sym and version3sym are invalid: undefined symbols cannot refer to .gnu.version_d. |
| ## We still check their behaviors. |
| # UNDEF:DYNAMIC SYMBOL TABLE: |
| # UNDEF-NEXT:0000000000000000 D *UND*|0000000000000000 localversym |
| # UNDEF-NEXT:0000000000000000 D *UND*|0000000000000000 globalversym |
| # UNDEF-NEXT:0000000000000000 D *UND*|0000000000000000 (v2) version2sym |
| # UNDEF-NEXT:0000000000000000 D *UND*|0000000000000000 (v3hidden) version3sym |
| # UNDEF-NEXT:0000000000000000 D *UND*|0000000000000000 (v4) version4sym |
| # UNDEF-NEXT:0000000000000000 D *UND*|0000000000000000 (v5hidden) .hidden version5sym |
| |
| ## Test defined symbols. |
| # RUN: yaml2obj -DINDEX=0x1 %s -o %t-def.o |
| # RUN: llvm-objdump -T %t-def.o 2>&1 | tr '\t' '|' | FileCheck %s \ |
| # RUN: -DFILE=%t-def.o --check-prefix=DEF --match-full-lines --strict-whitespace |
| |
| # DEF:DYNAMIC SYMBOL TABLE: |
| # DEF-NEXT:0000000000000000 g D .gnu.version|0000000000000000 localversym |
| # DEF-NEXT:0000000000000000 g D .gnu.version|0000000000000000 globalversym |
| # DEF-NEXT:0000000000000000 g D .gnu.version|0000000000000000 v2 version2sym |
| # DEF-NEXT:0000000000000000 g D .gnu.version|0000000000000000 (v3hidden) version3sym |
| # DEF-NEXT:0000000000000000 g D .gnu.version|0000000000000000 (v4) version4sym |
| # DEF-NEXT:0000000000000000 g D .gnu.version|0000000000000000 (v5hidden) .hidden version5sym |
| |
| --- !ELF |
| FileHeader: |
| Class: ELFCLASS64 |
| Data: ELFDATA2LSB |
| Type: ET_DYN |
| Sections: |
| - Name: .gnu.version |
| Type: SHT_GNU_versym |
| Flags: [ SHF_ALLOC ] |
| ## 0x8000 is a special VERSYM_HIDDEN bit. |
| Entries: [ 0, 0, 1, 2, 0x8003, 4, 0x8005 ] |
| ShSize: [[VERSYMSIZE=<none>]] |
| - Name: .gnu.version_d |
| Type: SHT_GNU_verdef |
| Flags: [ SHF_ALLOC ] |
| Link: .dynstr |
| AddressAlign: 0x4 |
| Info: 0x2 |
| ShOffset: [[VERDEFOFFSET=<none>]] |
| Entries: |
| - VersionNdx: 2 |
| Names: |
| - v2 |
| - VersionNdx: 3 |
| Names: |
| - v3hidden |
| - Name: .gnu.version_r |
| Type: SHT_GNU_verneed |
| Flags: [ SHF_ALLOC ] |
| Link: .dynstr |
| Info: 0x2 |
| Dependencies: |
| - Version: 1 |
| File: file1.so |
| Entries: |
| - Name: v4 |
| Hash: 0 |
| Flags: 0 |
| Other: 4 |
| - Version: 1 |
| File: file2.0 |
| Entries: |
| - Name: v5hidden |
| Hash: 0 |
| Flags: 0 |
| Other: 5 |
| - Name: .dynsym |
| Type: SHT_DYNSYM |
| EntSize: [[ENTSIZE=<none>]] |
| DynamicSymbols: |
| - Name: localversym |
| Index: [[INDEX=<none>]] |
| Binding: STB_GLOBAL |
| - Name: globalversym |
| Index: [[INDEX=<none>]] |
| Binding: STB_GLOBAL |
| - Name: version2sym |
| Index: [[INDEX=<none>]] |
| Binding: STB_GLOBAL |
| - Name: version3sym |
| Index: [[INDEX=<none>]] |
| Binding: STB_GLOBAL |
| - Name: version4sym |
| Index: [[INDEX=<none>]] |
| Binding: STB_GLOBAL |
| - Name: version5sym |
| Index: [[INDEX=<none>]] |
| Other: [ STV_HIDDEN ] |
| Binding: STB_GLOBAL |
| |
| ## Test the output with a long version name. |
| # RUN: yaml2obj --docnum=2 %s -o %t2 |
| # RUN: llvm-objdump -T %t2 2>&1 | tr '\t' '|' | FileCheck %s \ |
| # RUN: --check-prefix=LONGNAME --match-full-lines --strict-whitespace |
| |
| # LONGNAME:DYNAMIC SYMBOL TABLE: |
| # LONGNAME-NEXT:0000000000000000 g D .gnu.version|0000000000000000 v2 sym1 |
| # LONGNAME-NEXT:0000000000000000 g D .gnu.version|0000000000000000 v3withverylongname sym2 |
| |
| --- !ELF |
| FileHeader: |
| Class: ELFCLASS64 |
| Data: ELFDATA2LSB |
| Type: ET_DYN |
| Sections: |
| - Name: .gnu.version |
| Type: SHT_GNU_versym |
| Flags: [ SHF_ALLOC ] |
| Entries: [ 1, 2, 3 ] |
| - Name: .gnu.version_d |
| Type: SHT_GNU_verdef |
| Flags: [ SHF_ALLOC ] |
| Link: .dynstr |
| AddressAlign: 0x4 |
| Info: 0x2 |
| Entries: |
| - VersionNdx: 2 |
| Names: |
| - v2 |
| - VersionNdx: 3 |
| Names: |
| - v3withverylongname |
| - Name: .dynsym |
| Type: SHT_DYNSYM |
| DynamicSymbols: |
| - Name: sym1 |
| Index: 1 |
| Binding: STB_GLOBAL |
| - Name: sym2 |
| Index: 1 |
| Binding: STB_GLOBAL |
| |
| ## Check we report a warning when we are unable to read a SHT_GNU_versym section entry. |
| ## In this case, the section has a size that is not a multiple of its sh_entsize. |
| |
| # RUN: yaml2obj -DVERSYMSIZE=0xff %s -o %t2-broken-versym.o |
| # RUN: llvm-objdump -T %t2-broken-versym.o 2>&1 | FileCheck %s --check-prefixes=VERSION-ERR1,NOVER |
| |
| # VERSION-ERR1:warning: {{.*}}: unable to read an entry with index 1 from SHT_GNU_versym section |
| # NOVER-NEXT:0000000000000000 D *UND* 0000000000000000 localversym |
| # NOVER-NEXT:0000000000000000 D *UND* 0000000000000000 globalversym |
| # NOVER-NEXT:0000000000000000 D *UND* 0000000000000000 version2sym |
| # NOVER-NEXT:0000000000000000 D *UND* 0000000000000000 version3sym |
| # NOVER-NEXT:0000000000000000 D *UND* 0000000000000000 version4sym |
| # NOVER-NEXT:0000000000000000 D *UND* 0000000000000000 .hidden version5sym |