1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155
|
## 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
|