Follow up to d0858bffa11, add missing REQUIRES x86
[llvm-project.git] / llvm / test / tools / yaml2obj / ELF / section-headers.yaml
blob5bc6ac5496f4d45297c4fe2de34fa067723511ed
1 ## Check we can use "SectionHeaderTable" tag to reorder section header entries.
3 ## This is a general test that has sections with unique prefixes, a fill and a
4 ## section without the unique prefix. The section header table describes sections
5 ## in the same order they are listed in the YAML.
6 # RUN: yaml2obj %s --docnum=1 -o %t1 -DSEC1=".section (1)" -DSEC2=".section (2)" -DSEC3=".section.foo"
7 # RUN: llvm-readelf --section-headers %t1 | FileCheck %s --check-prefix=NO-OP
9 # NO-OP:      Section Headers:
10 # NO-OP-NEXT:   [Nr] Name         Type     Address          Off    Size   ES Flg Lk Inf Al
11 # NO-OP-NEXT:   [ 0]              NULL     0000000000000000 000000 000000 00      0   0  0
12 # NO-OP-NEXT:   [ 1] .section     PROGBITS 0000000000000000 000040 000010 00      0   0  0
13 # NO-OP-NEXT:   [ 2] .section     PROGBITS 0000000000000000 000050 000020 00      0   0  0
14 # NO-OP-NEXT:   [ 3] .section.foo PROGBITS 0000000000000000 0000a0 000040 00      0   0  0
15 # NO-OP-NEXT:   [ 4] .strtab      STRTAB   0000000000000000 0000e0 000001 00      0   0  1
16 # NO-OP-NEXT:   [ 5] .shstrtab    STRTAB   0000000000000000 0000e1 000029 00      0   0  1
18 --- !ELF
19 FileHeader:
20   Class: ELFCLASS64
21   Data:  ELFDATA2LSB
22   Type:  ET_REL
23 Sections:
24   - Name: .section (1)
25     Type: SHT_PROGBITS
26     Size: 0x10
27   - Name: .section (2)
28     Type: SHT_PROGBITS
29     Size: 0x20
30   - Type:    Fill
31     Name:    .filler
32     Size:    0x30
33     Pattern: ""
34   - Name: .section.foo
35     Type: SHT_PROGBITS
36     Size: 0x40
37   - Type: SectionHeaderTable
38     Sections:
39       - Name: [[SEC1]]
40       - Name: [[SEC2]]
41       - Name: [[SEC3]]
42       - Name: .strtab
43       - Name: .shstrtab
45 ## Show we are able to reorder sections.
46 # RUN: yaml2obj %s -o %t2 -DSEC3=".section (1)" -DSEC2=".section (2)" -DSEC1=".section.foo"
47 # RUN: llvm-readelf --section-headers %t2 | FileCheck %s --check-prefix=REORDERED
49 # REORDERED:      Section Headers:
50 # REORDERED-NEXT:   [Nr] Name         Type     Address          Off    Size   ES Flg Lk Inf Al
51 # REORDERED-NEXT:   [ 0]              NULL     0000000000000000 000000 000000 00      0   0  0
52 # REORDERED-NEXT:   [ 1] .section.foo PROGBITS 0000000000000000 0000a0 000040 00      0   0  0
53 # REORDERED-NEXT:   [ 2] .section     PROGBITS 0000000000000000 000050 000020 00      0   0  0
54 # REORDERED-NEXT:   [ 3] .section     PROGBITS 0000000000000000 000040 000010 00      0   0  0
55 # REORDERED-NEXT:   [ 4] .strtab      STRTAB   0000000000000000 0000e0 000001 00      0   0  1
56 # REORDERED-NEXT:   [ 5] .shstrtab    STRTAB   0000000000000000 0000e1 000029 00      0   0  1
58 ## Show we report proper errors when the section header description:
59 ##  a) contains a repeated section name.
60 ##  b) omits any section that exists.
61 ##  c) contains a non-existent section.
62 # RUN: not yaml2obj %s -o /dev/null -DSEC1=".section.foo" -DSEC2="unknown" -DSEC3=".section.foo" 2>&1 | \
63 # RUN:   FileCheck %s --check-prefix=ERR1
64 #   d) contains a repeated implicit section name.
65 #   e) contains a fill name.
66 # RUN: not yaml2obj %s -o /dev/null -DSEC1=".strtab" -DSEC2=".shstrtab" -DSEC3=".filler" 2>&1 | \
67 # RUN:   FileCheck %s --check-prefix=ERR2
69 # ERR1:      error: repeated section name: '.section.foo' in the section header description
70 # ERR1-NEXT: error: section '.section (1)' should be present in the 'Sections' or 'Excluded' lists
71 # ERR1-NEXT: error: section '.section (2)' should be present in the 'Sections' or 'Excluded' lists
72 # ERR1-NEXT: error: section header contains undefined section 'unknown'
74 # ERR2:      error: repeated section name: '.strtab' in the section header description
75 # ERR2-NEXT: error: repeated section name: '.shstrtab' in the section header description
76 # ERR2-NEXT: error: section '.section (1)' should be present in the 'Sections' or 'Excluded' lists
77 # ERR2-NEXT: error: section '.section (2)' should be present in the 'Sections' or 'Excluded' lists
78 # ERR2-NEXT: error: section '.section.foo' should be present in the 'Sections' or 'Excluded' lists
79 # ERR2-NEXT: error: section header contains undefined section '.filler'
81 ## Check that when the an empty "Sections" list is used, we do not create an empty section header table.
82 # RUN: not yaml2obj %s --docnum=2 -o /dev/null 2>&1 | FileCheck %s --check-prefix=EMPTY-SECTIONS
84 # EMPTY-SECTIONS:      error: section '.foo' should be present in the 'Sections' or 'Excluded' lists
85 # EMPTY-SECTIONS-NEXT: error: section '.strtab' should be present in the 'Sections' or 'Excluded' lists
86 # EMPTY-SECTIONS-NEXT: error: section '.shstrtab' should be present in the 'Sections' or 'Excluded' lists
88 --- !ELF
89 FileHeader:
90   Class: ELFCLASS64
91   Data:  ELFDATA2LSB
92   Type:  ET_REL
93 Sections:
94   - Name: .foo
95     Type: SHT_PROGBITS
96   - Type: SectionHeaderTable
97     Sections: []
99 ## Test that we are able to use "NoHeaders" property to produce an empty section header table.
100 # RUN: yaml2obj %s --docnum=3 -DNOHEADERS=true -o %t3.1
101 # RUN: llvm-readelf --file-headers %t3.1 | FileCheck %s --check-prefix=NO-HEADERS-TRUE
103 # NO-HEADERS-TRUE: Start of section headers:          0  (bytes into file)
104 # NO-HEADERS-TRUE: Size of section headers:           64 (bytes)
105 # NO-HEADERS-TRUE: Number of section headers:         0
106 # NO-HEADERS-TRUE: Section header string table index: 0
108 --- !ELF
109 FileHeader:
110   Class: ELFCLASS64
111   Data:  ELFDATA2LSB
112   Type:  ET_REL
113 Sections:
114   - Name: .foo
115     Type: SHT_PROGBITS
116   - Type: SectionHeaderTable
117     NoHeaders: [[NOHEADERS]]
119 ## Test that we are able to set NoHeaders to false. In this case the tool produces an output
120 ## as if there were no `SectionHeaderTable` key at all.
121 # RUN: yaml2obj %s --docnum=3 -DNOHEADERS=false -o %t3.2
122 # RUN: llvm-readelf --file-headers --sections %t3.2 | FileCheck %s --check-prefix=NO-HEADERS-FALSE
124 # NO-HEADERS-FALSE: Start of section headers:          96 (bytes into file)
125 # NO-HEADERS-FALSE: Size of section headers:           64 (bytes)
126 # NO-HEADERS-FALSE: Number of section headers:         4
127 # NO-HEADERS-FALSE: Section header string table index: 3
129 # NO-HEADERS-FALSE:      Section Headers:
130 # NO-HEADERS-FALSE-NEXT:  [Nr] Name      Type     Address          Off    Size   ES Flg Lk Inf Al
131 # NO-HEADERS-FALSE-NEXT:  [ 0]           NULL     0000000000000000 000000 000000 00      0   0  0
132 # NO-HEADERS-FALSE-NEXT:  [ 1] .foo      PROGBITS 0000000000000000 000040 000000 00      0   0  0
133 # NO-HEADERS-FALSE-NEXT:  [ 2] .strtab   STRTAB   0000000000000000 000040 000001 00      0   0  1
134 # NO-HEADERS-FALSE-NEXT:  [ 3] .shstrtab STRTAB   0000000000000000 000041 000018 00      0   0  1
136 ## Check we do not allow using "Sections" together with "NoHeaders".
137 # RUN: not yaml2obj %s --docnum=4 -DNOHEADERS=true -o /dev/null 2>&1 | FileCheck %s --check-prefix=SECTIONS-NO-HEADERS
138 # RUN: not yaml2obj %s --docnum=4 -DNOHEADERS=false -o /dev/null 2>&1 | FileCheck %s --check-prefix=SECTIONS-NO-HEADERS
140 # SECTIONS-NO-HEADERS: error: NoHeaders can't be used together with Offset/Sections/Excluded
142 --- !ELF
143 FileHeader:
144   Class: ELFCLASS64
145   Data:  ELFDATA2LSB
146   Type:  ET_REL
147 Sections:
148   - Name: .foo
149     Type: SHT_PROGBITS
150   - Type: SectionHeaderTable
151     Sections:  []
152     NoHeaders: [[NOHEADERS]]
154 ## Check that we allow using an empty SectionHeaderTable definition.
155 ## It can be used to emit the default section header table at an arbitrary position.
157 # RUN: yaml2obj %s --docnum=5 -o %t5.novalues
158 # RUN: llvm-readelf --sections %t5.novalues | \
159 # RUN:   FileCheck %s --check-prefix=NO-VALUES
161 ## Check we placed the section header table before the .foo section.
163 # NO-VALUES: There are 4 section headers, starting at offset 0x40:
164 # NO-VALUES: [Nr] Name Type     Address          Off    Size
165 # NO-VALUES: [ 1] .foo PROGBITS 0000000000000000 000140 000000
167 --- !ELF
168 FileHeader:
169   Class: ELFCLASS64
170   Data:  ELFDATA2LSB
171   Type:  ET_REL
172 Sections:
173   - Type: SectionHeaderTable
174   - Name: .foo
175     Type: SHT_PROGBITS
177 ## Test that we are still able to override e_shoff, e_shnum and e_shstrndx
178 ## fields even when we do not produce section headers.
179 # RUN: yaml2obj %s --docnum=6 -o %t4
180 # RUN: not llvm-readelf --file-headers %t4 | FileCheck %s --check-prefix=NO-HEADERS-OVERRIDE
182 # NO-HEADERS-OVERRIDE: Start of section headers:          2 (bytes into file)
183 # NO-HEADERS-OVERRIDE: Number of section headers:         3
184 # NO-HEADERS-OVERRIDE: Section header string table index: 4
186 --- !ELF
187 FileHeader:
188   Class:     ELFCLASS64
189   Data:      ELFDATA2LSB
190   Type:      ET_REL
191   EShOff:    0x2
192   EShNum:    0x3
193   EShStrNdx: 0x4
194 Sections:
195   - Type:      SectionHeaderTable
196     NoHeaders: true
198 ## Check that section indices are updated properly in other places when we
199 ## reorder sections in the section header table.
200 # RUN: yaml2obj %s --docnum=7 -o %t5 -DSEC1=".foo" -DSEC2=".bar"
201 # RUN: llvm-readelf --section-headers --symbols %t5 | FileCheck %s --check-prefix=INDICES-A
202 # RUN: yaml2obj %s --docnum=7 -o %t6 -DSEC2=".foo" -DSEC1=".bar"
203 # RUN: llvm-readelf --section-headers --symbols %t6 | FileCheck %s --check-prefix=INDICES-B
205 # INDICES-A:      [Nr] Name       Type     Address          Off    Size   ES Flg Lk
206 # INDICES-A:      [ 1] .foo       PROGBITS 0000000000000000 000040 000000 00      0
207 # INDICES-A-NEXT: [ 2] .bar       PROGBITS 0000000000000000 000040 000000 00      0
208 # INDICES-A-NEXT: [ 3] .another.1 PROGBITS 0000000000000000 000040 000000 00      1
209 # INDICES-A-NEXT: [ 4] .another.2 PROGBITS 0000000000000000 000040 000000 00      2
211 # INDICES-A:      Num:    Value          Size Type    Bind   Vis       Ndx Name
212 # INDICES-A:        1: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT     1 foo
213 # INDICES-A-NEXT:   2: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT     2 bar
215 # INDICES-B:      [ 1] .bar       PROGBITS 0000000000000000 000040 000000 00      0
216 # INDICES-B-NEXT: [ 2] .foo       PROGBITS 0000000000000000 000040 000000 00      0
217 # INDICES-B-NEXT: [ 3] .another.1 PROGBITS 0000000000000000 000040 000000 00      2
218 # INDICES-B-NEXT: [ 4] .another.2 PROGBITS 0000000000000000 000040 000000 00      1
220 # INDICES-B:      Num: Value            Size Type   Bind  Vis     Ndx Name
221 # INDICES-B:        1: 0000000000000000    0 NOTYPE LOCAL DEFAULT   2 foo
222 # INDICES-B-NEXT:   2: 0000000000000000    0 NOTYPE LOCAL DEFAULT   1 bar
224 --- !ELF
225 FileHeader:
226   Class: ELFCLASS64
227   Data:  ELFDATA2LSB
228   Type:  ET_REL
229 Sections:
230   - Name: .foo
231     Type: SHT_PROGBITS
232   - Name: .bar
233     Type: SHT_PROGBITS
234   - Name: .another.1
235     Link: .foo
236     Type: SHT_PROGBITS
237   - Name: .another.2
238     Link: .bar
239     Type: SHT_PROGBITS
240   - Type: SectionHeaderTable
241     Sections:
242       - Name: [[SEC1]]
243       - Name: [[SEC2]]
244       - Name: .another.1
245       - Name: .another.2
246       - Name: .symtab
247       - Name: .strtab
248       - Name: .shstrtab
249 Symbols:
250   - Name:    foo
251     Section: .foo
252   - Name:    bar
253     Section: .bar
255 ## Check that when "NoHeaders" is set to "true" then we don't emit
256 ## the .shstrtab section implicitly and don't write the data of the
257 ## section header table to the file.
259 # RUN: yaml2obj %s --docnum=8 -o %t8
260 # RUN: wc -c < %t8 | FileCheck %s --check-prefix=SIZE
262 # SIZE: 511{{$}}
264 --- !ELF
265 FileHeader:
266   Class: ELFCLASS64
267   Data:  ELFDATA2LSB
268   Type:  ET_REL
269 Sections:
270 ## We don't want any implicit sections to be added after the .foo section,
271 ## so add them here explicitly.
272   - Name: .strtab
273     Type: SHT_STRTAB
274 ## Nothing should be emitted after the following section.
275 ## So we know that the expected file size is 0x100 + 0xFF == 0x1FF == 511.
276   - Name:   .foo
277     Type:   SHT_PROGBITS
278 ## Unaligned size. Used to make sure that we don't try to align the file offset
279 ## for writing the section header table.
280     Size:   0xFF
281     Offset: 0x100
282   - Type:      SectionHeaderTable
283     NoHeaders: true
285 ## Check we do not allow using "Offset" together with "NoHeaders".
286 # RUN: not yaml2obj %s --docnum=9 -DNOHEADERS=true -o /dev/null 2>&1 | FileCheck %s --check-prefix=NO-HEADERS-OFFSET
287 # RUN: not yaml2obj %s --docnum=9 -DNOHEADERS=false -o /dev/null 2>&1 | FileCheck %s --check-prefix=NO-HEADERS-OFFSET
289 # NO-HEADERS-OFFSET: error: NoHeaders can't be used together with Offset/Sections/Excluded
291 --- !ELF
292 FileHeader:
293   Class: ELFCLASS64
294   Data:  ELFDATA2LSB
295   Type:  ET_REL
296 Sections:
297   - Name: .foo
298     Type: SHT_PROGBITS
299   - Type:      SectionHeaderTable
300     Offset:    0x1000
301     NoHeaders: [[NOHEADERS]]
303 ## Check we can place the section header table before other sections.
305 # RUN: yaml2obj %s --docnum=10 -o %t10
306 # RUN: llvm-readelf --file-headers --sections %t10 | FileCheck %s --check-prefix=PLACE-BEFORE
308 # PLACE-BEFORE: Start of section headers:  64 (bytes into file)
309 # PLACE-BEFORE: Size of section headers:   64 (bytes)
310 # PLACE-BEFORE: Number of section headers: 4
312 # PLACE-BEFORE: Section Headers:
313 # PLACE-BEFORE:   [Nr] Name Type     Address          Off    Size
314 ## 0x140 == Start of section headers (64) + Size of section headers (64) * Number of section headers (4);
315 # PLACE-BEFORE:   [ 1] .foo PROGBITS 0000000000000000 000140 000000
317 --- !ELF
318 FileHeader:
319   Class: ELFCLASS64
320   Data:  ELFDATA2LSB
321   Type:  ET_REL
322 Sections:
323   - Type:   SectionHeaderTable
324     Offset: [[OFFSET=<none>]]
325     Sections:
326       - Name: .foo
327       - Name: .strtab
328       - Name: .shstrtab
329   - Name: .foo
330     Type: SHT_PROGBITS
332 ## Check we can use the Offset key to place the section header table at a different location.
334 # RUN: yaml2obj %s --docnum=10 -DOFFSET=0x1000 -o %t10.offset
335 # RUN: llvm-readelf --file-headers --sections %t10.offset | \
336 # RUN:   FileCheck %s --check-prefix=PLACE-BEFORE-OFFSET
338 # PLACE-BEFORE-OFFSET: Start of section headers:          4096 (bytes into file)
339 # PLACE-BEFORE-OFFSET: Size of section headers:           64 (bytes)
340 # PLACE-BEFORE-OFFSET: Number of section headers:         4
342 # PLACE-BEFORE-OFFSET: Section Headers:
343 # PLACE-BEFORE-OFFSET:   [Nr] Name Type     Address          Off    Size
344 ## 0x1100 == Start of section headers (0x1000) + Size of section headers (64) * Number of section headers (4);
345 # PLACE-BEFORE-OFFSET:   [ 1] .foo PROGBITS 0000000000000000 001100 000000
347 ## Check we can place the section header table somewhere in the middle of the sections list.
349 # RUN: yaml2obj %s --docnum=11 -o %t11
350 # RUN: llvm-readelf --sections %t11 | FileCheck %s --check-prefix=PLACE-AT-MIDDLE
352 # PLACE-AT-MIDDLE: There are 5 section headers, starting at offset 0x140:
353 # PLACE-AT-MIDDLE:      [Nr] Name      Type     Address          Off    Size
354 # PLACE-AT-MIDDLE:      [ 1] .foo      PROGBITS 0000000000000000 000040 000100
355 ## The section header table is placed here, at 0x40 + 0x100 == 0x140.
356 ## The size of the table is 5 * 64 == 320 == 0x140.
357 ## 0x140 + 0x140 == offset of the .bar section.
358 # PLACE-AT-MIDDLE-NEXT: [ 2] .bar      PROGBITS 0000000000000000 000280 000200
359 # PLACE-AT-MIDDLE-NEXT: [ 3] .strtab   STRTAB   0000000000000000 000480 000001
360 # PLACE-AT-MIDDLE-NEXT: [ 4] .shstrtab STRTAB   0000000000000000 000481 00001d
362 --- !ELF
363 FileHeader:
364   Class: ELFCLASS64
365   Data:  ELFDATA2LSB
366   Type:  ET_REL
367 Sections:
368   - Name: .foo
369     Type: SHT_PROGBITS
370     Size: 0x100
371   - Type: SectionHeaderTable
372     Sections:
373       - Name: .foo
374       - Name: .bar
375       - Name: .strtab
376       - Name: .shstrtab
377   - Name: .bar
378     Type: SHT_PROGBITS
379     Size: 0x200
381 ## Check we don`t allow having multiple SectionHeaderTable chunks.
383 # RUN: not yaml2obj %s --docnum=12 -o /dev/null 2>&1 | FileCheck %s --check-prefix=MULTIPLE
385 # MULTIPLE: error: multiple section header tables are not allowed
387 --- !ELF
388 FileHeader:
389   Class: ELFCLASS64
390   Data:  ELFDATA2LSB
391   Type:  ET_REL
392 Sections:
393   - Type:     SectionHeaderTable
394     Sections: []
395   - Type:     SectionHeaderTable
396     Sections: []
398 ## Check that we place implicit sections before the section header table
399 ## when it is placed at the end explicitly.
401 # RUN: yaml2obj %s --docnum=13 -o %t13
402 # RUN: llvm-readelf --sections %t13 | FileCheck %s --check-prefix=IMPLICIT
404 # IMPLICIT:      There are 3 section headers, starting at offset 0x58:
405 # IMPLICIT:      [Nr] Name      Type   Address          Off    Size
406 # IMPLICIT:      [ 1] .strtab   STRTAB 0000000000000000 000040 000001
407 # IMPLICIT-NEXT: [ 2] .shstrtab STRTAB 0000000000000000 000041 000013
408 ## The section header table is placed here, at 0x58.
409 ## alignTo(8, 0x41 + 0x13) == 0x58.
411 --- !ELF
412 FileHeader:
413   Class: ELFCLASS64
414   Data:  ELFDATA2LSB
415   Type:  ET_REL
416 Sections:
417   - Type: SectionHeaderTable
418     Sections:
419       - Name: .strtab
420       - Name: .shstrtab
422 ## Show that we can reference both the first and last section in the section
423 ## header table, via sh_link.
425 # RUN: yaml2obj %s --docnum=14 -o %t14
426 # RUN: llvm-readelf --sections %t14 | FileCheck %s --check-prefix=LINK
428 --- !ELF
429 FileHeader:
430   Class: ELFCLASS64
431   Data:  ELFDATA2LSB
432   Type:  ET_REL
433 Sections:
434   - Name: .strtab
435     Type: SHT_STRTAB
436   - Type: SectionHeaderTable
437     Sections:
438       - Name: .strtab
439       - Name: .ref.first
440       - Name: .ref.last
441       - Name: .shstrtab
442   - Name: .ref.first
443     Type: SHT_PROGBITS
444     Link: .strtab
445   - Name: .ref.last
446     Type: SHT_PROGBITS
447     Link: .shstrtab
448   - Name: .shstrtab
449     Type: SHT_STRTAB
451 # LINK:      There are 5 section headers
452 # LINK:        [Nr] Name       Type     Address  Off      Size     ES       Flg Lk
453 # LINK:        [ 1] .strtab
454 # LINK-NEXT:   [ 2] .ref.first PROGBITS [[#%x,]] [[#%x,]] [[#%x,]] [[#%x,]]      1
455 # LINK-NEXT:   [ 3] .ref.last  PROGBITS [[#%x,]] [[#%x,]] [[#%x,]] [[#%x,]]      4
456 # LINK-NEXT:   [ 4] .shstrtab