[llvm-readelf] - Report a warning when .hash section contains a chain with a cycle.
[llvm-complete.git] / test / tools / llvm-readobj / elf-hash-symbols.test
blob4ffecf9fcc6d4bd4aab5e1560e434d355fa479fd
1 ## Check llvm-readelf is able to dump the content of hash sections correctly.
3 ## Check the output when both .hash and .gnu.hash sections are present.
5 # RUN: yaml2obj --docnum=1 %s -o %t1-32.so
6 # RUN: llvm-readelf --hash-symbols %t1-32.so \
7 # RUN:   | FileCheck %s --strict-whitespace --match-full-lines --check-prefix HASH-32
9 # HASH-32: Symbol table of .hash for image:
10 # HASH-32-NEXT:  Num Buc:    Value  Size   Type   Bind Vis      Ndx Name
11 # HASH-32-NEXT:    1   0: 00000000     0 NOTYPE  GLOBAL DEFAULT UND ccc
12 # HASH-32-NEXT:    5   0: 00001001     0 NOTYPE  WEAK   DEFAULT   1 bbb
13 # HASH-32-NEXT:    3   0: 00000001     0 NOTYPE  GLOBAL DEFAULT ABS ddd
14 # HASH-32-NEXT:    2   0: 00001000     0 NOTYPE  GLOBAL DEFAULT   1 aaa
15 # HASH-32-NEXT:    4   0: 00000000     0 NOTYPE  GLOBAL DEFAULT   2 eee
16 # HASH-32-EMPTY:
17 # HASH-32: Symbol table of .gnu.hash for image:
18 # HASH-32-NEXT:  Num Buc:    Value  Size   Type   Bind Vis      Ndx Name
19 # HASH-32-NEXT:    2   1: 00001000     0 NOTYPE  GLOBAL DEFAULT   1 aaa
20 # HASH-32-NEXT:    3   1: 00000001     0 NOTYPE  GLOBAL DEFAULT ABS ddd
21 # HASH-32-NEXT:    4   2: 00000000     0 NOTYPE  GLOBAL DEFAULT   2 eee
22 # HASH-32-NEXT:    5   2: 00001001     0 NOTYPE  WEAK   DEFAULT   1 bbb
23 # HASH-32-NOT: {{.}}
25 --- !ELF
26 FileHeader:
27   Class:   ELFCLASS32
28   Data:    ELFDATA2LSB
29   Type:    ET_DYN
30   Machine: EM_386
31 Sections:
32 ## The contents of .hash and .gnu.hash were generated by a linker.
33   - Name:    .hash
34     Type:    SHT_HASH
35     Flags:   [ SHF_ALLOC ]
36     Link:    .dynsym
37     Content: '0300000006000000010000000000000000000000000000000500000004000000020000000000000003000000'
38   - Name:    .gnu.hash
39     Type:    SHT_GNU_HASH
40     Flags:   [ SHF_ALLOC ]
41     Link:    .dynsym
42     Content: 0300000002000000010000000500000048991200000000000200000004000000685C880B9169880BF46D880BCB60880B
43   - Name:  .dynamic
44     Type:  SHT_DYNAMIC
45     Flags: [ SHF_ALLOC ]
46     Link:  .dynstr
47     Entries:
48 ## PT_LOAD's p_vaddr is 0x0. PT_LOAD's p_offset = 0x1bc. DT_HASH value is 0x0. 
49 ## llvm-readelf will read .hash content from p_offset + (p_vaddr - DT_HASH value) = 0x1bc.
50 ## This matches the file offset of the .hash section.
51       - Tag:   DT_HASH
52         Value: 0x0000000000000000
53       - Tag:   DT_GNU_HASH
54 ## PT_LOAD's p_vaddr is 0x0. PT_LOAD's p_offset = 0x1bc. DT_GNU_HASH value is 0x2c (size of .hash = 0x2c).
55 ## llvm-readelf will read .gnu.hash content from p_offset + (p_vaddr - DT_GNU_HASH value) = 0x1e8.
56 ## This matches the file offset of the .gnu.hash section.
57         Value: 0x000000000000002C
58       - Tag:   DT_NULL
59         Value: 0x0000000000000000
60 DynamicSymbols:
61   - Name:    ccc
62     Binding: STB_GLOBAL
63   - Name:    aaa
64     Section: .hash
65     Binding: STB_GLOBAL
66     Value:   0x0000000000001000
67   - Name:    ddd
68     Index:   SHN_ABS
69     Binding: STB_GLOBAL
70     Value:   0x0000000000000001
71   - Name:    eee
72     Section: .gnu.hash
73     Binding: STB_GLOBAL
74   - Name:    bbb
75     Section: .hash
76     Binding: STB_WEAK
77     Value:   0x0000000000001001
78 ProgramHeaders:
79   - Type:  PT_LOAD
80     Flags: [ PF_R, PF_X ]
81     Sections:
82       - Section: .hash
83       - Section: .gnu.hash
84       - Section: .dynamic
86 # RUN: yaml2obj --docnum=2 %s -o %t1-64.so
87 # RUN: llvm-readelf --hash-symbols %t1-64.so | FileCheck %s --check-prefix HASH-64
89 # HASH-64:      Symbol table of .hash for image:
90 # HASH-64-NEXT:  Num Buc:    Value          Size   Type   Bind Vis      Ndx Name
91 # HASH-64-NEXT:    1   0: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT UND ccc
92 # HASH-64-NEXT:    5   0: 0000000000001001     0 NOTYPE  WEAK   DEFAULT   1 bbb
93 # HASH-64-NEXT:    3   0: 0000000000000001     0 NOTYPE  GLOBAL DEFAULT ABS ddd
94 # HASH-64-NEXT:    2   0: 0000000000001000     0 NOTYPE  GLOBAL DEFAULT   1 aaa
95 # HASH-64-NEXT:    4   0: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT   2 eee
96 # HASH-64-EMPTY:
97 # HASH-64-NEXT: Symbol table of .gnu.hash for image:
98 # HASH-64-NEXT:  Num Buc:    Value          Size   Type   Bind Vis      Ndx Name
99 # HASH-64-NEXT:    2   1: 0000000000001000     0 NOTYPE  GLOBAL DEFAULT   1 aaa
100 # HASH-64-NEXT:    3   1: 0000000000000001     0 NOTYPE  GLOBAL DEFAULT ABS ddd
101 # HASH-64-NEXT:    4   2: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT   2 eee
102 # HASH-64-NEXT:    5   2: 0000000000001001     0 NOTYPE  WEAK   DEFAULT   1 bbb
103 # HASH-64-NOT: {{.}}
105 --- !ELF
106 FileHeader:
107   Class:   ELFCLASS64
108   Data:    ELFDATA2LSB
109   Type:    ET_DYN
110   Machine: EM_X86_64
111 Sections:
112 ## The contents of .hash and .gnu.hash were generated by a linker.
113   - Name:    .hash
114     Type:    SHT_HASH
115     Flags:   [ SHF_ALLOC ]
116     Link:    .dynsym
117     Content: '0300000006000000010000000000000000000000000000000500000004000000020000000000000003000000'
118   - Name:    .gnu.hash
119     Type:    SHT_GNU_HASH
120     Flags:   [ SHF_ALLOC ]
121     Link:    .dynsym
122     Content: 030000000200000001000000060000000808020040019200000000000200000004000000685C880B9169880BF46D880BCB60880B
123   - Name:  .dynamic
124     Type:  SHT_DYNAMIC
125     Flags: [ SHF_ALLOC ]
126     Link:  .dynstr
127     Entries:
128       - Tag:   DT_HASH
129 ## PT_LOAD's p_vaddr is 0x0. PT_LOAD's p_offset = 0x2b8. DT_HASH value is 0x0. 
130 ## llvm-readelf will read .hash content from p_offset + (p_vaddr - DT_HASH value) = 0x2b8.
131 ## This matches the file offset of the .hash section. 
132         Value: 0x0000000000000000
133       - Tag:   DT_GNU_HASH
134 ## PT_LOAD's p_vaddr is 0x0. PT_LOAD's p_offset = 0x2b8. DT_GNU_HASH value is 0x2c (size of .hash = 0x2c).
135 ## llvm-readelf will read .gnu.hash content from p_offset + (p_vaddr - DT_GNU_HASH value) = 0x2e4.
136 ## This matches the file offset of the .gnu.hash section.
137         Value: 0x000000000000002c
138       - Tag:   DT_NULL
139         Value: 0x0000000000000000
140 DynamicSymbols:
141   - Name:    ccc
142     Binding: STB_GLOBAL
143   - Name:    aaa
144     Section: .hash
145     Binding: STB_GLOBAL
146     Value:   0x0000000000001000
147   - Name:    ddd
148     Index:   SHN_ABS
149     Binding: STB_GLOBAL
150     Value:   0x0000000000000001
151   - Name:    eee
152     Section: .gnu.hash
153     Binding: STB_GLOBAL
154   - Name:    bbb
155     Section: .hash
156     Binding: STB_WEAK
157     Value:   0x0000000000001001
158 ProgramHeaders:
159   - Type:  PT_LOAD
160     Flags: [ PF_R, PF_X ]
161     Sections:
162       - Section: .hash
163       - Section: .gnu.hash
164       - Section: .dynamic
166 ## Check the output when only .hash section is present.
168 # RUN: yaml2obj --docnum=3 %s -o %t2-32.so
169 # RUN: llvm-readelf --hash-symbols %t2-32.so \
170 # RUN:   | FileCheck %s --strict-whitespace --match-full-lines --check-prefix ONLY-HASH-32
172 # ONLY-HASH-32: Symbol table of .hash for image:
173 # ONLY-HASH-32-NEXT:  Num Buc:    Value  Size   Type   Bind Vis      Ndx Name
174 # ONLY-HASH-32-NEXT:    1   0: 00000000     0 NOTYPE  GLOBAL DEFAULT UND ccc
175 # ONLY-HASH-32-NEXT:    5   0: 00001001     0 NOTYPE  WEAK   DEFAULT   1 bbb
176 # ONLY-HASH-32-NEXT:    3   0: 00000001     0 NOTYPE  GLOBAL DEFAULT ABS ddd
177 # ONLY-HASH-32-NEXT:    2   0: 00001000     0 NOTYPE  GLOBAL DEFAULT   1 aaa
178 # ONLY-HASH-32-NEXT:    4   0: 00000000     0 NOTYPE  GLOBAL DEFAULT   2 eee
179 # ONLY-HASH-32-NOT: {{.}}
181 --- !ELF
182 FileHeader:
183   Class:   ELFCLASS32
184   Data:    ELFDATA2LSB
185   Type:    ET_DYN
186   Machine: EM_386
187 Sections:
188 ## The contents of .hash was generated by a linker.
189   - Name:    .hash
190     Type:    SHT_HASH
191     Flags:   [ SHF_ALLOC ]
192     Link:    .dynsym
193     Content: '0300000006000000010000000000000000000000000000000500000004000000020000000000000003000000'
194   - Name:  .dynamic
195     Type:  SHT_DYNAMIC
196     Flags: [ SHF_ALLOC ]
197     Link:  .dynstr
198     Entries:
199       - Tag:   DT_HASH
200         Value: 0x0000000000000000
201       - Tag:   DT_NULL
202         Value: 0x0000000000000000
203 DynamicSymbols:
204   - Name:    ccc
205     Binding: STB_GLOBAL
206   - Name:    aaa
207     Section: .hash
208     Binding: STB_GLOBAL
209     Value:   0x0000000000001000
210   - Name:    ddd
211     Index:   SHN_ABS
212     Binding: STB_GLOBAL
213     Value:   0x0000000000000001
214   - Name:    eee
215     Section: .dynamic
216     Binding: STB_GLOBAL
217   - Name:    bbb
218     Section: .hash
219     Binding: STB_WEAK
220     Value:   0x0000000000001001
221 ProgramHeaders:
222   - Type:  PT_LOAD
223     Flags: [ PF_R, PF_X ]
224     Sections:
225       - Section: .hash
226       - Section: .dynamic
228 ## Check the output when only .gnu.hash section is present.
230 # RUN: yaml2obj --docnum=4 %s -o %t3-32.so
231 # RUN: llvm-readelf --hash-symbols %t3-32.so \
232 # RUN:   | FileCheck %s --strict-whitespace --match-full-lines --check-prefix ONLY-GNUHASH-32
234 # ONLY-GNUHASH-32: Symbol table of .gnu.hash for image:
235 # ONLY-GNUHASH-32-NEXT:  Num Buc:    Value  Size   Type   Bind Vis      Ndx Name
236 # ONLY-GNUHASH-32-NEXT:    2   1: 00001000     0 NOTYPE  GLOBAL DEFAULT   2 aaa
237 # ONLY-GNUHASH-32-NEXT:    3   1: 00000001     0 NOTYPE  GLOBAL DEFAULT ABS ddd
238 # ONLY-GNUHASH-32-NEXT:    4   2: 00000000     0 NOTYPE  GLOBAL DEFAULT   1 eee
239 # ONLY-GNUHASH-32-NEXT:    5   2: 00001001     0 NOTYPE  WEAK   DEFAULT   2 bbb
240 # ONLY-GNUHASH-32-NOT: {{.}}
242 --- !ELF
243 FileHeader:
244   Class:   ELFCLASS32
245   Data:    ELFDATA2LSB
246   Type:    ET_DYN
247   Machine: EM_386
248 Sections:
249 ## The contents of .gnu.hash was generated by a linker.
250   - Name:    .gnu.hash
251     Type:    SHT_GNU_HASH
252     Flags:   [ SHF_ALLOC ]
253     Link:    .dynsym
254     Content: 0300000002000000010000000500000048991200000000000200000004000000685C880B9169880BF46D880BCB60880B
255   - Name:  .dynamic
256     Type:  SHT_DYNAMIC
257     Flags: [ SHF_ALLOC ]
258     Link:  .dynstr
259     Entries:
260       - Tag:   DT_GNU_HASH
261         Value: 0x0000000000000000
262       - Tag:   DT_NULL
263         Value: 0x0000000000000000
264 DynamicSymbols:
265   - Name:    ccc
266     Binding: STB_GLOBAL
267   - Name:    aaa
268     Section: .dynamic
269     Binding: STB_GLOBAL
270     Value:   0x0000000000001000
271   - Name:    ddd
272     Index:   SHN_ABS
273     Binding: STB_GLOBAL
274     Value:   0x0000000000000001
275   - Name:    eee
276     Section: .gnu.hash
277     Binding: STB_GLOBAL
278   - Name:    bbb
279     Section: .dynamic
280     Binding: STB_WEAK
281     Value:   0x0000000000001001
282 ProgramHeaders:
283   - Type:  PT_LOAD
284     Flags: [ PF_R, PF_X ]
285     Sections:
286       - Section: .gnu.hash
287       - Section: .dynamic
289 ## Show that if there are no hash sections, we do not print anything.
290 # RUN: yaml2obj --docnum=5 %s -o %t4.so
291 # RUN: llvm-readelf --hash-symbols %t4.so \
292 # RUN:   | FileCheck %s --check-prefix NO-HASH --allow-empty
294 # NO-HASH-NOT: {{.}}
296 ## Sanity check that we can still find the dynamic symbols (i.e. the above test
297 ## doesn't pass due to a mistake in the dynamic section).
298 # RUN: llvm-readelf --dyn-symbols %t4.so | FileCheck %s --check-prefix DYNSYMS
300 # DYNSYMS: Symbol table '.dynsym' contains 2 entries:
302 --- !ELF
303 FileHeader:
304   Class:   ELFCLASS64
305   Data:    ELFDATA2LSB
306   Type:    ET_DYN
307   Machine: EM_X86_64
308 Sections:
309   - Name:         .dynstr
310     Type:         SHT_STRTAB
311     Flags:        [ SHF_ALLOC ]
312     AddressAlign: 0x100
313     EntSize:      0x1
314   - Name:         .dynsym
315     Type:         SHT_DYNSYM
316     Flags:        [ SHF_ALLOC ]
317     Link:         .dynstr
318     Address:      0x100
319     AddressAlign: 0x100
320     EntSize:      0x18
321   - Name:         .dynamic
322     Type:         SHT_DYNAMIC
323     Flags:        [ SHF_ALLOC ]
324     Address:      0x0000000000001000
325     Link:         .dynstr
326     AddressAlign: 0x0000000000001000
327     EntSize:      0x0000000000000010
328     Entries:
329       - Tag:   DT_STRTAB
330         Value: 0x0000000000000000
331       - Tag:   DT_STRSZ
332         Value: 0x0000000000000009
333       - Tag:   DT_SYMTAB
334         Value: 0x0000000000000100
335       - Tag:   DT_SYMENT
336         Value: 0x0000000000000018
337       - Tag:   DT_NULL
338         Value: 0x0000000000000000
339   - Name:  .text.foo
340     Type:  SHT_PROGBITS
341     Flags: [ SHF_ALLOC, SHF_EXECINSTR, SHF_GROUP ]
342     Size:  0x40
343     Address: 0x2000
344     AddressAlign: 0x2000
345 DynamicSymbols:
346   - Name:    _Z3fooi
347     Binding: STB_GLOBAL
348 ProgramHeaders:
349   - Type:  PT_LOAD
350     Flags: [ PF_R, PF_X ]
351     VAddr: 0x0
352     PAddr: 0x0
353     Sections:
354       - Section: .dynsym
355       - Section: .dynstr
356       - Section: .dynamic
357       - Section: .text.foo
358   - Type:  PT_DYNAMIC
359     Flags: [ PF_R ]
360     VAddr: 0x1000
361     PAddr: 0x1000
362     Sections:
363       - Section: .dynamic
365 ## Show that we report a warning for a hash table which contains an entry of
366 ## the bucket array pointing to a cycle.
368 # RUN: yaml2obj --docnum=6 %s -o %t6.so
369 # RUN: llvm-readelf --hash-symbols %t6.so 2>&1 | FileCheck %s -DFILE=%t6.so --check-prefix=BROKEN
371 # BROKEN:      Symbol table of .hash for image:
372 # BROKEN-NEXT:  Num Buc:    Value  Size   Type   Bind Vis      Ndx Name
373 # BROKEN-NEXT:    1   0: 00000000     0 NOTYPE  LOCAL  DEFAULT UND aaa
374 # BROKEN: warning: '[[FILE]]': .hash section is invalid: bucket 1: a cycle was detected in the linked chain
376 --- !ELF
377 FileHeader:
378   Class:   ELFCLASS32
379   Data:    ELFDATA2LSB
380   Type:    ET_DYN
381   Machine: EM_386
382 Sections:
383   - Name:    .hash
384     Type:    SHT_HASH
385     Link:    .dynsym
386     Bucket:  [ 1 ]
387     Chain:   [ 1, 1 ]
388   - Name:  .dynamic
389     Type:  SHT_DYNAMIC
390     Entries:
391 ## llvm-readelf will read the hash table from the file offset
392 ## p_offset + (p_vaddr - DT_HASH) = p_offset + (0 - 0) = p_offset,
393 ## which is the start of PT_LOAD, i.e. the file offset of .hash.
394       - Tag:   DT_HASH
395         Value: 0x0
396 DynamicSymbols:
397   - Name:    aaa
398   - Name:    bbb
399 ProgramHeaders:
400   - Type:  PT_LOAD
401     Sections:
402       - Section: .hash
403       - Section: .dynamic