blob: e21b3544be8543026f3289dd1f816b524ae00fbe (
plain)
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
|