Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / tools / llvm-readobj / ELF / verneed-invalid.test
blob548920838bca5f6d96360c73c9a9cb4f819195e0
1 ## Test how llvm-readobj/llvm-readelf tools handle invalid SHT_GNU_verneed sections.
3 ## In the first case we have a SHT_GNU_versym section that refers to
4 ## a version listed in a SHT_GNU_verneed section. That version has an
5 ## empty name, making it invalid.
7 # RUN: yaml2obj --docnum=1 %s -o %t1
8 # RUN: llvm-readelf -V %t1 | FileCheck %s --check-prefix=GNU-VERNEED-NAME
9 # RUN: llvm-readobj -V %t1 | FileCheck %s --check-prefix=LLVM-VERNEED-NAME
11 # GNU-VERNEED-NAME:      Version symbols section '.gnu.version' contains 2 entries:
12 # GNU-VERNEED-NAME-NEXT:  Addr: 0000000000200210  Offset: 0x000040  Link: 3 (.dynsym)
13 # GNU-VERNEED-NAME-NEXT:   000:   0 (*local*)       2 ()
15 # GNU-VERNEED-NAME:      Version needs section '.gnu.version_r' contains 1 entries:
16 # GNU-VERNEED-NAME-NEXT:  Addr: 0000000000200214  Offset: 0x000044  Link: 4 (.dynstr)
17 # GNU-VERNEED-NAME-NEXT:   0x0000: Version: 1  File: somefile  Cnt: 1
18 # GNU-VERNEED-NAME-NEXT:   0x0010:   Name:   Flags: none  Version: 2
20 # LLVM-VERNEED-NAME:      VersionSymbols [
21 # LLVM-VERNEED-NAME:        Symbol {
22 # LLVM-VERNEED-NAME-NEXT:     Version: 0
23 # LLVM-VERNEED-NAME-NEXT:     Name:
24 # LLVM-VERNEED-NAME-NEXT:   }
25 # LLVM-VERNEED-NAME-NEXT:   Symbol {
26 # LLVM-VERNEED-NAME-NEXT:     Version: 2
27 # LLVM-VERNEED-NAME-NEXT:     Name: foo
28 # LLVM-VERNEED-NAME-NEXT:   }
29 # LLVM-VERNEED-NAME-NEXT: ]
31 # LLVM-VERNEED-NAME:      VersionRequirements [
32 # LLVM-VERNEED-NAME-NEXT:   Dependency {
33 # LLVM-VERNEED-NAME-NEXT:     Version: 1
34 # LLVM-VERNEED-NAME-NEXT:     Count: 1
35 # LLVM-VERNEED-NAME-NEXT:     FileName: somefile
36 # LLVM-VERNEED-NAME-NEXT:     Entries [
37 # LLVM-VERNEED-NAME-NEXT:       Entry {
38 # LLVM-VERNEED-NAME-NEXT:         Hash:  0
39 # LLVM-VERNEED-NAME-NEXT:         Flags [ (0x0)
40 # LLVM-VERNEED-NAME-NEXT:         ]
41 # LLVM-VERNEED-NAME-NEXT:         Index: 2
42 # LLVM-VERNEED-NAME-NEXT:         Name: {{$}}
43 # LLVM-VERNEED-NAME-NEXT:       }
44 # LLVM-VERNEED-NAME-NEXT:     ]
45 # LLVM-VERNEED-NAME-NEXT:   }
46 # LLVM-VERNEED-NAME-NEXT: ]
48 --- !ELF
49 FileHeader:
50   Class: ELFCLASS64
51   Data:  ELFDATA2LSB
52   Type:  ET_EXEC
53 Sections:
54   - Name:    .gnu.version
55     Type:    SHT_GNU_versym
56     Flags:   [ SHF_ALLOC ]
57     Address: 0x200210
58     Entries: [ 0, 2 ]
59   - Name:  .gnu.version_r
60     Type:  SHT_GNU_verneed
61     Flags: [ SHF_ALLOC ]
62     AddressAlign: 4
63     Dependencies:
64       - Version:   1
65         File:      somefile
66         Entries:
67           - Name:  '' ## invalid name
68             Hash:  0
69             Flags: 0
70             Other: 2
71 DynamicSymbols:
72   - Name:    foo
73     Binding: STB_GLOBAL
74 ...
76 ## In this case SHT_GNU_verneed is not linked to a dynamic string table. We check we handle
77 ## this situation properly.
79 # RUN: yaml2obj --docnum=2 %s -o %t2
80 # RUN: llvm-readelf -V %t2 2>&1 | FileCheck %s -DFILE=%t2 --check-prefix=GNU-NOLINK
81 # RUN: llvm-readobj -V %t2 2>&1 | FileCheck %s -DFILE=%t2 --check-prefix=LLVM-NOLINK
83 # GNU-NOLINK:      Version symbols section '.gnu.version' contains 2 entries:
84 # GNU-NOLINK-NEXT:  Addr: 0000000000000000  Offset: 0x000040  Link: 3 (.dynsym)
85 # 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
86 # GNU-NOLINK-NEXT:   000:   0 (*local*) 2 (<corrupt>)
87 # GNU-NOLINK:      Version needs section '.gnu.version_r' contains 1 entries:
88 # GNU-NOLINK-NEXT:  Addr: 0000000000000004  Offset: 0x000044  Link: 0 ()
89 # GNU-NOLINK-NEXT:   0x0000: Version: 1  File: <corrupt vn_file: 9>  Cnt: 1
90 # GNU-NOLINK-NEXT:   0x0010:   Name: <corrupt>  Flags: none Version: 2
92 # LLVM-NOLINK:      VersionSymbols [
93 # LLVM-NOLINK:        Symbol {
94 # LLVM-NOLINK-NEXT:     Version: 0
95 # LLVM-NOLINK-NEXT:     Name:
96 # LLVM-NOLINK-NEXT:   }
97 # LLVM-NOLINK-NEXT:   Symbol {
98 # LLVM-NOLINK-NEXT:     Version: 2
99 # 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
100 # LLVM-NOLINK-NEXT:     Name: foo@<corrupt>
101 # LLVM-NOLINK-NEXT:   }
102 # LLVM-NOLINK-NEXT: ]
104 # LLVM-NOLINK:      VersionRequirements [
105 # LLVM-NOLINK-NEXT:   Dependency {
106 # LLVM-NOLINK-NEXT:     Version: 1
107 # LLVM-NOLINK-NEXT:     Count: 1
108 # LLVM-NOLINK-NEXT:     FileName: <corrupt vn_file: 9>
109 # LLVM-NOLINK-NEXT:     Entries [
110 # LLVM-NOLINK-NEXT:       Entry {
111 # LLVM-NOLINK-NEXT:         Hash: 0
112 # LLVM-NOLINK-NEXT:         Flags [ (0x0)
113 # LLVM-NOLINK-NEXT:         ]
114 # LLVM-NOLINK-NEXT:         Index: 2
115 # LLVM-NOLINK-NEXT:         Name: <corrupt>
116 # LLVM-NOLINK-NEXT:       }
117 # LLVM-NOLINK-NEXT:     ]
118 # LLVM-NOLINK-NEXT:   }
119 # LLVM-NOLINK-NEXT: ]
121 --- !ELF
122 FileHeader:
123   Class: ELFCLASS64
124   Data:  ELFDATA2LSB
125   Type:  ET_EXEC
126 Sections:
127   - Name:    .gnu.version
128     Type:    SHT_GNU_versym
129     Flags:   [ SHF_ALLOC ]
130     Entries: [ 0, 2 ]
131   - Name:  .gnu.version_r
132     Type:  SHT_GNU_verneed
133     Flags: [ SHF_ALLOC ]
134     Link:  0
135     AddressAlign: 4
136     Dependencies:
137       - Version: 1
138         File:    somefile
139         Entries:
140           - Name:  'bar'
141             Hash:  0
142             Flags: 0
143             Other: 2
144 DynamicSymbols:
145   - Name:    foo
146     Binding: STB_GLOBAL
148 ## We can't parse misaligned auxiliary version records.
150 # RUN: yaml2obj --docnum=3 %s -o %t3
151 # RUN: llvm-readelf -V %t3 2>&1 | FileCheck %s -DFILE=%t3 --check-prefix=BROKEN-AUX-GNU
152 # RUN: llvm-readobj -V %t3 2>&1 | FileCheck %s -DFILE=%t3 --check-prefix=BROKEN-AUX-LLVM
154 # BROKEN-AUX-GNU:      Version symbols section '.gnu.version' contains 1 entries:
155 # BROKEN-AUX-GNU-NEXT:  Addr: 0000000000000000  Offset: 0x000040  Link: 3 (.dynsym)
156 # BROKEN-AUX-GNU-NEXT: warning: '[[FILE]]': invalid SHT_GNU_verneed section with index 2: found a misaligned auxiliary entry at offset 0x11
157 # BROKEN-AUX-GNU-NEXT:  000:   2 (<corrupt>)
159 # BROKEN-AUX-LLVM:      VersionSymbols [
160 # BROKEN-AUX-LLVM-NEXT:   Symbol {
161 # BROKEN-AUX-LLVM-NEXT:     Version: 2
162 # BROKEN-AUX-LLVM-NEXT: warning: '[[FILE]]': invalid SHT_GNU_verneed section with index 2: found a misaligned auxiliary entry at offset 0x11
163 # BROKEN-AUX-LLVM-NEXT:     Name: @<corrupt>
164 # BROKEN-AUX-LLVM-NEXT:   }
165 # BROKEN-AUX-LLVM-NEXT: ]
167 --- !ELF
168 FileHeader:
169   Class: ELFCLASS64
170   Data:  ELFDATA2LSB
171   Type:  ET_EXEC
172 Sections:
173   - Name:    .gnu.version
174     Type:    SHT_GNU_versym
175     Flags:   [ SHF_ALLOC ]
176     Entries: [ 2 ]
177   - Name:         .gnu.version_r
178     Type:         SHT_GNU_verneed
179     Flags:        [ SHF_ALLOC ]
180     Info:         1
181     AddressAlign: 4
182 ## The byte offset to the auxiliary entry is 0x11, i.e. it is not correctly aligned in memory.
183     Content: "0100010001000000110000000000000000000000"
184 DynamicSymbols: []
186 ## Here we check that we can properly dump the case when a dependency file name
187 ## and/or a dependency name string offset is equal to the string table size.
189 ## We set the version dependency vn_file field to the offset of string 'foo' in
190 ## the .dynstr, which is 1. We create a custom string table .mystrtab of size 1
191 ## and link it with the .gnu.version_r section. For the vna_name we use the same trick.
193 # RUN: yaml2obj --docnum=4 %s -o %t4
194 # RUN: llvm-readobj --sections --section-data -V %t4 | FileCheck %s --check-prefix=LLVM-OFFSET-EQ
195 # RUN: llvm-readelf --sections -V %t4 | FileCheck %s --check-prefix=GNU-OFFSET-EQ
197 # LLVM-OFFSET-EQ: Name: .mystrtab
198 # LLVM-OFFSET-EQ: Size:
199 # LLVM-OFFSET-EQ-SAME:  1
201 # LLVM-OFFSET-EQ:      Name: .dynstr
202 # LLVM-OFFSET-EQ:      SectionData (
203 # LLVM-OFFSET-EQ-NEXT:   0000: 00666F6F 00 |.foo.|
204 # LLVM-OFFSET-EQ-NEXT: )
206 # LLVM-OFFSET-EQ:      VersionRequirements [
207 # LLVM-OFFSET-EQ-NEXT:   Dependency {
208 # LLVM-OFFSET-EQ-NEXT:     Version: 1
209 # LLVM-OFFSET-EQ-NEXT:     Count: 1
210 # LLVM-OFFSET-EQ-NEXT:     FileName: <corrupt vn_file: 1>
211 # LLVM-OFFSET-EQ-NEXT:     Entries [
212 # LLVM-OFFSET-EQ-NEXT:       Entry {
213 # LLVM-OFFSET-EQ-NEXT:         Hash: 0
214 # LLVM-OFFSET-EQ-NEXT:         Flags [ (0x0)
215 # LLVM-OFFSET-EQ-NEXT:         ]
216 # LLVM-OFFSET-EQ-NEXT:         Index: 0
217 # LLVM-OFFSET-EQ-NEXT:         Name: <corrupt>
218 # LLVM-OFFSET-EQ-NEXT:       }
219 # LLVM-OFFSET-EQ-NEXT:     ]
220 # LLVM-OFFSET-EQ-NEXT:   }
221 # LLVM-OFFSET-EQ-NEXT: ]
223 # GNU-OFFSET-EQ:      Version needs section '.gnu.version_r' contains 1 entries:
224 # GNU-OFFSET-EQ-NEXT:  Addr: 0000000000000004  Offset: 0x000044  Link: 1 (.mystrtab)
225 # GNU-OFFSET-EQ-NEXT:   0x0000: Version: 1  File: <corrupt vn_file: 1>  Cnt: 1
226 # GNU-OFFSET-EQ-NEXT:   0x0010:   Name: <corrupt>  Flags: none  Version: 0
228 --- !ELF
229 FileHeader:
230   Class: ELFCLASS64
231   Data:  ELFDATA2LSB
232   Type:  ET_EXEC
233 Sections:
234   - Name: .mystrtab
235     Type: SHT_STRTAB
236     Content: "00"
237   - Name:  .gnu.version_r
238     Type:  SHT_GNU_verneed
239     Flags: [ SHF_ALLOC ]
240     Link:  .mystrtab
241     AddressAlign: 4
242     Dependencies:
243       - Version: 1
244         File:    foo
245         Entries:
246           - Name:  'foo'
247             Hash:  0
248             Flags: 0
249             Other: 0
250 DynamicSymbols:
251   - Name: foo
253 ## Here we check that we can properly dump the case when a dependency file name
254 ## and/or a dependency name string offset is greater than the string table size.
256 # RUN: yaml2obj --docnum=5 %s -o %t5
257 # RUN: llvm-readobj --sections -V %t5 | FileCheck %s --check-prefix=LLVM-OFFSET-GR
258 # RUN: llvm-readelf --sections -V %t5 | FileCheck %s --check-prefix=GNU-OFFSET-GR
260 # LLVM-OFFSET-GR:      VersionRequirements [
261 # LLVM-OFFSET-GR-NEXT:   Dependency {
262 # LLVM-OFFSET-GR-NEXT:     Version: 1
263 # LLVM-OFFSET-GR-NEXT:     Count: 1
264 # LLVM-OFFSET-GR-NEXT:     FileName: <corrupt vn_file: 1>
265 # LLVM-OFFSET-GR-NEXT:     Entries [
266 # LLVM-OFFSET-GR-NEXT:       Entry {
267 # LLVM-OFFSET-GR-NEXT:         Hash: 0
268 # LLVM-OFFSET-GR-NEXT:         Flags [ (0x0)
269 # LLVM-OFFSET-GR-NEXT:         ]
270 # LLVM-OFFSET-GR-NEXT:         Index: 0
271 # LLVM-OFFSET-GR-NEXT:         Name: <corrupt>
272 # LLVM-OFFSET-GR-NEXT:       }
273 # LLVM-OFFSET-GR-NEXT:     ]
274 # LLVM-OFFSET-GR-NEXT:   }
275 # LLVM-OFFSET-GR-NEXT: ]
277 # GNU-OFFSET-GR:      Version needs section '.gnu.version_r' contains 1 entries:
278 # GNU-OFFSET-GR-NEXT:  Addr: 0000000000000000  Offset: 0x000040  Link: 1 (.mystrtab)
279 # GNU-OFFSET-GR-NEXT:   0x0000: Version: 1  File: <corrupt vn_file: 1>  Cnt: 1
280 # GNU-OFFSET-GR-NEXT:   0x0010:   Name: <corrupt>  Flags: none  Version: 0
282 --- !ELF
283 FileHeader:
284   Class: ELFCLASS64
285   Data:  ELFDATA2LSB
286   Type:  ET_EXEC
287 Sections:
288   - Name: .mystrtab
289     Type: SHT_STRTAB
290     Content: ""
291   - Name:  .gnu.version_r
292     Type:  SHT_GNU_verneed
293     Flags: [ SHF_ALLOC ]
294     Link:  .mystrtab
295     AddressAlign: 4
296     Dependencies:
297       - Version: 1
298         File:    foo
299         Entries:
300           - Name:  'foo'
301             Hash:  0
302             Flags: 0
303             Other: 0
304 DynamicSymbols:
305   - Name: foo
307 ## Check that we report a warning when sh_link references a non-existent section.
309 # RUN: yaml2obj --docnum=6 %s -DLINK=0xFF -o %t6
310 # RUN: llvm-readobj --sections -V %t6 2>&1 | FileCheck %s -DFILE=%t6 --implicit-check-not="warning:" --check-prefix=INVALID-LINK-LLVM
311 # RUN: llvm-readelf --sections -V %t6 2>&1 | FileCheck %s -DFILE=%t6 --implicit-check-not="warning:" --check-prefix=INVALID-LINK-GNU
313 # INVALID-LINK-LLVM:      VersionRequirements [
314 # INVALID-LINK-LLVM-NEXT:  warning: '[[FILE]]': invalid section linked to SHT_GNU_verneed section with index 1: invalid section index: 255
315 # INVALID-LINK-LLVM-NEXT:   Dependency {
316 # INVALID-LINK-LLVM-NEXT:     Version: 1
317 # INVALID-LINK-LLVM-NEXT:     Count: 1
318 # INVALID-LINK-LLVM-NEXT:     FileName: <corrupt vn_file: 1>
319 # INVALID-LINK-LLVM-NEXT:     Entries [
320 # INVALID-LINK-LLVM-NEXT:       Entry {
321 # INVALID-LINK-LLVM-NEXT:         Hash: 0
322 # INVALID-LINK-LLVM-NEXT:         Flags [ (0x0)
323 # INVALID-LINK-LLVM-NEXT:         ]
324 # INVALID-LINK-LLVM-NEXT:         Index: 0
325 # INVALID-LINK-LLVM-NEXT:         Name: <corrupt>
326 # INVALID-LINK-LLVM-NEXT:       }
327 # INVALID-LINK-LLVM-NEXT:     ]
328 # INVALID-LINK-LLVM-NEXT:   }
329 # INVALID-LINK-LLVM-NEXT: ]
331 # INVALID-LINK-GNU:      Version needs section '.gnu.version_r' contains 1 entries:
332 # INVALID-LINK-GNU-NEXT: warning: '[[FILE]]': invalid section linked to SHT_GNU_verneed section with index 1: invalid section index: 255
333 # INVALID-LINK-GNU-NEXT: Addr: 0000000000000000 Offset: 0x000040 Link: 255 (<corrupt>)
334 # INVALID-LINK-GNU-NEXT:  0x0000: Version: 1 File: <corrupt vn_file: 1> Cnt: 1
335 # INVALID-LINK-GNU-NEXT:  0x0010: Name: <corrupt> Flags: none Version: 0
337 --- !ELF
338 FileHeader:
339   Class: ELFCLASS64
340   Data:  ELFDATA2LSB
341   Type:  ET_EXEC
342 Sections:
343   - Name:   .gnu.version_r
344     Type:   SHT_GNU_verneed
345     Flags:  [ SHF_ALLOC ]
346     Link:   [[LINK=.dynstr]]
347     ShName: [[SHNAME=<none>]]
348     Dependencies:
349       - Version: 1
350         File:    foo
351         Entries:
352           - Name:  'foo'
353             Hash:  0
354             Flags: 0
355             Other: 0
356   - Name:   .dynstr
357     Type:   SHT_STRTAB
358     ShName: [[DYNSTRNAME=<none>]]
359 DynamicSymbols:
360   - Name: foo
362 ## Check that llvm-readelf reports a warning when the name of the SHT_GNU_verneed section can't be read.
364 # RUN: yaml2obj --docnum=6 %s -DSHNAME=0xFFFFFFFF -o %t.invalid.name
365 # RUN: llvm-readobj -V %t.invalid.name 2>&1 | \
366 # RUN:   FileCheck %s -DFILE=%t.invalid.name --check-prefix=INVALID-NAME-LLVM --implicit-check-not=warning:
367 # RUN: llvm-readelf -V %t.invalid.name 2>&1 | \
368 # RUN:   FileCheck %s -DFILE=%t.invalid.name --check-prefix=INVALID-NAME-GNU --implicit-check-not=warning:
370 # INVALID-NAME-LLVM:      VersionRequirements [
371 # INVALID-NAME-LLVM-NEXT:   Dependency {
372 # INVALID-NAME-LLVM-NEXT:     Version: 1
373 # INVALID-NAME-LLVM-NEXT:     Count: 1
374 # INVALID-NAME-LLVM-NEXT:     FileName: foo
375 # INVALID-NAME-LLVM-NEXT:     Entries [
376 # INVALID-NAME-LLVM-NEXT:       Entry {
377 # INVALID-NAME-LLVM-NEXT:         Hash: 0
378 # INVALID-NAME-LLVM-NEXT:         Flags [ (0x0)
379 # INVALID-NAME-LLVM-NEXT:         ]
380 # INVALID-NAME-LLVM-NEXT:         Index: 0
381 # INVALID-NAME-LLVM-NEXT:         Name: foo
382 # INVALID-NAME-LLVM-NEXT:       }
383 # INVALID-NAME-LLVM-NEXT:     ]
384 # INVALID-NAME-LLVM-NEXT:   }
385 # INVALID-NAME-LLVM-NEXT: ]
387 # 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
388 # INVALID-NAME-GNU-NEXT: Version needs section '<?>' contains 1 entries:
389 # INVALID-NAME-GNU-NEXT:  Addr: 0000000000000000  Offset: 0x000040  Link: 2 (.dynstr)
390 # INVALID-NAME-GNU-NEXT:   0x0000: Version: 1  File: foo  Cnt: 1
391 # INVALID-NAME-GNU-NEXT:   0x0010:   Name: foo  Flags: none  Version: 0
393 ## Check that llvm-readelf reports a warning when we are unable to read the name of
394 ## the section linked with the SHT_GNU_verneed section (usually ".dynstr").
396 # RUN: yaml2obj --docnum=6 %s -DDYNSTRNAME=0xFFFFFFFF -o %t.invalid.name2
397 # RUN: llvm-readobj -V %t.invalid.name2 2>&1 | \
398 # RUN:   FileCheck %s -DFILE=%t.invalid.name2 --check-prefix=INVALID-NAME-LLVM --implicit-check-not=warning:
399 # RUN: llvm-readelf -V %t.invalid.name2 2>&1 | \
400 # RUN:   FileCheck %s -DFILE=%t.invalid.name2 --check-prefix=INVALID-NAME2-GNU --implicit-check-not=warning:
402 # INVALID-NAME2-GNU:      Version needs section '.gnu.version_r' contains 1 entries:
403 # 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
404 # INVALID-NAME2-GNU-NEXT:  Addr: 0000000000000000  Offset: 0x000040  Link: 2 (<?>)
405 # INVALID-NAME2-GNU-NEXT:   0x0000: Version: 1  File: foo  Cnt: 1
406 # INVALID-NAME2-GNU-NEXT:   0x0010:   Name: foo  Flags: none  Version: 0
408 ## Check that we report a warning when we can't read the content of the SHT_GNU_verneed section.
410 # RUN: yaml2obj --docnum=7 %s -o %t7
411 # RUN: llvm-readobj --sections -V %t7 2>&1 | FileCheck %s -DFILE=%t7 --check-prefix=INVALID-DATA
412 # RUN: llvm-readelf --sections -V %t7 2>&1 | FileCheck %s -DFILE=%t7 --check-prefix=INVALID-DATA
414 # 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)
416 --- !ELF
417 FileHeader:
418   Class: ELFCLASS64
419   Data:  ELFDATA2LSB
420   Type:  ET_EXEC
421 Sections:
422   - Name:     .gnu.version_r
423     Type:     SHT_GNU_verneed
424     Flags:    [ SHF_ALLOC ]
425     ShOffset: 0xFFFFFFFF
426 ## Triggers creation of the .dynstr.
427 DynamicSymbols:
428   - Name: foo
430 ## Check that we report a warning when a SHT_GNU_verneed section contains a version dependency
431 ## that goes past the end of the section.
433 # RUN: yaml2obj --docnum=8 %s -o %t8
434 # RUN: llvm-readobj --sections -V %t8 2>&1 | FileCheck %s -DFILE=%t8 --check-prefix=DEP-PAST-END
435 # RUN: llvm-readelf --sections -V %t8 2>&1 | FileCheck %s -DFILE=%t8 --check-prefix=DEP-PAST-END
437 # DEP-PAST-END: warning: '[[FILE]]': invalid SHT_GNU_verneed section with index 1: version dependency 1 goes past the end of the section
439 --- !ELF
440 FileHeader:
441   Class: ELFCLASS64
442   Data:  ELFDATA2LSB
443   Type:  ET_EXEC
444 Sections:
445   - Name:   .gnu.version_r
446     Type:   SHT_GNU_verneed
447     Flags:  [ SHF_ALLOC ]
448     ShSize: 0x1
449     Dependencies:
450       - Version: 1
451         File:    foo
452         Entries:
453           - Name:  'foo'
454             Hash:  0
455             Flags: 0
456             Other: 0
457 DynamicSymbols:
458   - Name: foo
460 ## Check we report a warning when a version dependency is not correctly aligned in memory.
462 # RUN: yaml2obj --docnum=9 %s -o %t9
463 # RUN: llvm-readobj --sections -V %t9 2>&1 | FileCheck %s -DFILE=%t9 --check-prefix=MISALIGNED-DEP
464 # RUN: llvm-readelf --sections -V %t9 2>&1 | FileCheck %s -DFILE=%t9 --check-prefix=MISALIGNED-DEP
466 # MISALIGNED-DEP: warning: '[[FILE]]': invalid SHT_GNU_verneed section with index 1: found a misaligned version dependency entry at offset 0x0
468 --- !ELF
469 FileHeader:
470   Class: ELFCLASS64
471   Data:  ELFDATA2LSB
472   Type:  ET_EXEC
473 Sections:
474   - Type: Fill
475     Size: 0x1
476   - Name:  .gnu.version_r
477     Type:  SHT_GNU_verneed
478     Flags: [ SHF_ALLOC ]
479     Link:  .dynstr
480     Dependencies:
481       - Version: 1
482         File:    foo
483         Entries:
484           - Name:  'foo'
485             Hash:  0
486             Flags: 0
487             Other: 0
488 DynamicSymbols:
489   - Name: foo
491 ## Check that we report a warning when a SHT_GNU_verneed section contains a dependency definition
492 ## that refers to an auxiliary entry that goes past the end of the section.
494 # RUN: yaml2obj --docnum=10 %s -o %t10
495 # RUN: llvm-readobj --sections -V %t10 2>&1 | FileCheck %s -DFILE=%t10 --check-prefix=AUX-PAST-END
496 # RUN: llvm-readelf --sections -V %t10 2>&1 | FileCheck %s -DFILE=%t10 --check-prefix=AUX-PAST-END
498 # 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
500 --- !ELF
501 FileHeader:
502   Class: ELFCLASS64
503   Data:  ELFDATA2LSB
504   Type:  ET_EXEC
505 Sections:
506   - Name:   .gnu.version_r
507     Type:   SHT_GNU_verneed
508     Flags:  [ SHF_ALLOC ]
509     ShSize: 21
510     Dependencies:
511       - Version: 1
512         File:    foo
513         Entries:
514           - Name:  'foo'
515             Hash:  0
516             Flags: 0
517             Other: 0
518 DynamicSymbols:
519   - Name: foo
521 ## Check we report a warning when an auxiliary entry is not correctly aligned in memory.
523 # RUN: yaml2obj %s --docnum=11 -o %t11
524 # RUN: llvm-readobj -V %t11 2>&1 | FileCheck %s --check-prefix=MISALIGNED-AUX -DFILE=%t11
525 # RUN: llvm-readelf -V %t11 2>&1 | FileCheck %s --check-prefix=MISALIGNED-AUX -DFILE=%t11
527 # MISALIGNED-AUX: warning: '[[FILE]]': invalid SHT_GNU_verneed section with index 1: found a misaligned auxiliary entry at offset 0x11
529 --- !ELF
530 FileHeader:
531   Class: ELFCLASS64
532   Data:  ELFDATA2LSB
533   Type:  ET_EXEC
534 Sections:
535   - Name:  .gnu.version_r
536     Type:  SHT_GNU_verneed
537     Flags: [ SHF_ALLOC ]
538     Info:  1
539 ## The byte offset to the auxiliary entry is 0x11, i.e. it is not correctly aligned in memory.
540     Content: "0100010001000000110000000000000000000000"
541 DynamicSymbols:
542   - Name: foo
544 ## Check how we handle the case when a dependency definition entry has an unsupported version.
546 # RUN: yaml2obj %s --docnum=12 -o %t12
547 # RUN: llvm-readobj -V %t12 2>&1 | FileCheck %s --check-prefix=UNSUPPORTED-VERSION -DFILE=%t12
548 # RUN: llvm-readelf -V %t12 2>&1 | FileCheck %s --check-prefix=UNSUPPORTED-VERSION -DFILE=%t12
550 # UNSUPPORTED-VERSION: warning: '[[FILE]]': unable to dump SHT_GNU_verneed section with index 1: version 65278 is not yet supported
552 --- !ELF
553 FileHeader:
554   Class: ELFCLASS64
555   Data:  ELFDATA2LSB
556   Type:  ET_EXEC
557 Sections:
558   - Name:  .gnu.version_r
559     Type:  SHT_GNU_verneed
560     Flags: [ SHF_ALLOC ]
561     Dependencies:
562       - Version: 0xfefe
563         File:    foo
564         Entries:
565           - Name:  'foo'
566             Hash:  0
567             Flags: 0
568             Other: 0
569 DynamicSymbols:
570   - Name: foo
572 ## In this case SHT_GNU_verneed is linked to a custom dynamic string table, which is not
573 ## called ".dynstr". Check we handle this case properly.
575 # RUN: yaml2obj --docnum=13 %s -o %t13
576 # RUN: llvm-readelf -V %t13 2>&1 | FileCheck %s -DFILE=%t13 --check-prefix=GNU-CUSTOM-DYNSTR
577 # RUN: llvm-readobj -V %t13 2>&1 | FileCheck %s -DFILE=%t13 --check-prefix=LLVM-CUSTOM-DYNSTR
579 # GNU-CUSTOM-DYNSTR:      Version symbols section '.gnu.version' contains 2 entries:
580 # GNU-CUSTOM-DYNSTR-NEXT:  Addr: 0000000000000000  Offset: 0x000040  Link: 4 (.dynsym)
581 # GNU-CUSTOM-DYNSTR-NEXT:   000:   0 (*local*)       2 (bcdefghij)
582 # GNU-CUSTOM-DYNSTR:      Version needs section '.gnu.version_r' contains 1 entries:
583 # GNU-CUSTOM-DYNSTR-NEXT:  Addr: 0000000000000004  Offset: 0x000044  Link: 3 (.custom.dynstr)
584 # GNU-CUSTOM-DYNSTR-NEXT:   0x0000: Version: 1  File: j  Cnt: 1
585 # GNU-CUSTOM-DYNSTR-NEXT:   0x0010:   Name: bcdefghij  Flags: none  Version: 2
587 # LLVM-CUSTOM-DYNSTR:      VersionSymbols [
588 # LLVM-CUSTOM-DYNSTR:      Symbol {
589 # LLVM-CUSTOM-DYNSTR:        Version: 2
590 # LLVM-CUSTOM-DYNSTR-NEXT:   Name: foo@bcdefghij
592 # LLVM-CUSTOM-DYNSTR:      VersionRequirements [
593 # LLVM-CUSTOM-DYNSTR:        Dependency {
594 # LLVM-CUSTOM-DYNSTR:          Entries [
595 # LLVM-CUSTOM-DYNSTR:            Entry {
596 # LLVM-CUSTOM-DYNSTR:              Index: 2
597 # LLVM-CUSTOM-DYNSTR-NEXT:          Name: bcdefghij
599 --- !ELF
600 FileHeader:
601   Class: ELFCLASS64
602   Data:  ELFDATA2LSB
603   Type:  ET_EXEC
604 Sections:
605   - Name:    .gnu.version
606     Type:    SHT_GNU_versym
607     Flags:   [ SHF_ALLOC ]
608     Entries: [ 0, 2 ]
609   - Name:  .gnu.version_r
610     Type:  SHT_GNU_verneed
611     Flags: [ SHF_ALLOC ]
612     Link:  .custom.dynstr
613     AddressAlign: 4
614     Dependencies:
615       - Version: 1
616         File:    zed
617         Entries:
618           - Name:  'bar'
619             Hash:  0
620             Flags: 0
621             Other: 2
622   - Name: .custom.dynstr
623     Type: SHT_STRTAB
624     Content: "6162636465666768696a00" ## 'a','b','c','d','e','f','g','h','i','j',NIL
625 DynamicSymbols:
626   - Name:    foo
627     Binding: STB_GLOBAL