xref: /llvm-project/llvm/test/tools/llvm-readobj/ELF/verneed-invalid.test (revision 51f4958057d6c246e85c3fbc65353bc0d7c1049b)
1## Test how llvm-readobj/llvm-readelf tools handle invalid SHT_GNU_verneed sections.
2
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.
6
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
10
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 ()
14
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
19
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: ]
30
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: ]
47
48--- !ELF
49FileHeader:
50  Class: ELFCLASS64
51  Data:  ELFDATA2LSB
52  Type:  ET_EXEC
53Sections:
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
71DynamicSymbols:
72  - Name:    foo
73    Binding: STB_GLOBAL
74...
75
76## In this case SHT_GNU_verneed is not linked to a dynamic string table. We check we handle
77## this situation properly.
78
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
82
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
91
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: ]
103
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: ]
120
121--- !ELF
122FileHeader:
123  Class: ELFCLASS64
124  Data:  ELFDATA2LSB
125  Type:  ET_EXEC
126Sections:
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
144DynamicSymbols:
145  - Name:    foo
146    Binding: STB_GLOBAL
147
148## We can't parse misaligned auxiliary version records.
149
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
153
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>)
158
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: ]
166
167--- !ELF
168FileHeader:
169  Class: ELFCLASS64
170  Data:  ELFDATA2LSB
171  Type:  ET_EXEC
172Sections:
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"
184DynamicSymbols: []
185
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.
188##
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.
192
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
196
197# LLVM-OFFSET-EQ: Name: .mystrtab
198# LLVM-OFFSET-EQ: Size:
199# LLVM-OFFSET-EQ-SAME:  1
200
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: )
205
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: ]
222
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
227
228--- !ELF
229FileHeader:
230  Class: ELFCLASS64
231  Data:  ELFDATA2LSB
232  Type:  ET_EXEC
233Sections:
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
250DynamicSymbols:
251  - Name: foo
252
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.
255##
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
259
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: ]
276
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
281
282--- !ELF
283FileHeader:
284  Class: ELFCLASS64
285  Data:  ELFDATA2LSB
286  Type:  ET_EXEC
287Sections:
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
304DynamicSymbols:
305  - Name: foo
306
307## Check that we report a warning when sh_link references a non-existent section.
308
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
312
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: ]
330
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
336
337--- !ELF
338FileHeader:
339  Class: ELFCLASS64
340  Data:  ELFDATA2LSB
341  Type:  ET_EXEC
342Sections:
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>]]
359DynamicSymbols:
360  - Name: foo
361
362## Check that llvm-readelf reports a warning when the name of the SHT_GNU_verneed section can't be read.
363
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:
369
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: ]
386
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
392
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").
395
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:
401
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
407
408## Check that we report a warning when we can't read the content of the SHT_GNU_verneed section.
409
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
413
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)
415
416--- !ELF
417FileHeader:
418  Class: ELFCLASS64
419  Data:  ELFDATA2LSB
420  Type:  ET_EXEC
421Sections:
422  - Name:     .gnu.version_r
423    Type:     SHT_GNU_verneed
424    Flags:    [ SHF_ALLOC ]
425    ShOffset: 0xFFFFFFFF
426## Triggers creation of the .dynstr.
427DynamicSymbols:
428  - Name: foo
429
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.
432
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
436
437# DEP-PAST-END: warning: '[[FILE]]': invalid SHT_GNU_verneed section with index 1: version dependency 1 goes past the end of the section
438
439--- !ELF
440FileHeader:
441  Class: ELFCLASS64
442  Data:  ELFDATA2LSB
443  Type:  ET_EXEC
444Sections:
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
457DynamicSymbols:
458  - Name: foo
459
460## Check we report a warning when a version dependency is not correctly aligned in memory.
461
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
465
466# MISALIGNED-DEP: warning: '[[FILE]]': invalid SHT_GNU_verneed section with index 1: found a misaligned version dependency entry at offset 0x0
467
468--- !ELF
469FileHeader:
470  Class: ELFCLASS64
471  Data:  ELFDATA2LSB
472  Type:  ET_EXEC
473Sections:
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
488DynamicSymbols:
489  - Name: foo
490
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.
493
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
497
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
499
500--- !ELF
501FileHeader:
502  Class: ELFCLASS64
503  Data:  ELFDATA2LSB
504  Type:  ET_EXEC
505Sections:
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
518DynamicSymbols:
519  - Name: foo
520
521## Check we report a warning when an auxiliary entry is not correctly aligned in memory.
522
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
526
527# MISALIGNED-AUX: warning: '[[FILE]]': invalid SHT_GNU_verneed section with index 1: found a misaligned auxiliary entry at offset 0x11
528
529--- !ELF
530FileHeader:
531  Class: ELFCLASS64
532  Data:  ELFDATA2LSB
533  Type:  ET_EXEC
534Sections:
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"
541DynamicSymbols:
542  - Name: foo
543
544## Check how we handle the case when a dependency definition entry has an unsupported version.
545
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
549
550# UNSUPPORTED-VERSION: warning: '[[FILE]]': unable to dump SHT_GNU_verneed section with index 1: version 65278 is not yet supported
551
552--- !ELF
553FileHeader:
554  Class: ELFCLASS64
555  Data:  ELFDATA2LSB
556  Type:  ET_EXEC
557Sections:
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
569DynamicSymbols:
570  - Name: foo
571
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.
574
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
578
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
586
587# LLVM-CUSTOM-DYNSTR:      VersionSymbols [
588# LLVM-CUSTOM-DYNSTR:      Symbol {
589# LLVM-CUSTOM-DYNSTR:        Version: 2
590# LLVM-CUSTOM-DYNSTR-NEXT:   Name: foo@bcdefghij
591
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
598
599--- !ELF
600FileHeader:
601  Class: ELFCLASS64
602  Data:  ELFDATA2LSB
603  Type:  ET_EXEC
604Sections:
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
625DynamicSymbols:
626  - Name:    foo
627    Binding: STB_GLOBAL
628