Follow up to d0858bffa11, add missing REQUIRES x86
[llvm-project.git] / llvm / test / tools / llvm-objcopy / ELF / preserve-segment-contents.test
blob8ddef0a5a9f560cac6739f0152b9af2b796073a0
1 # We want to preserve areas in segments that are not covered by section headers.
2 # This test shows that we do this for areas at the start of a segment, between
3 # sections in a segment, and after all sections in a segment.
4 # To create inputs with arbitrary data in segments, not covered by sections, we
5 # use yaml2obj to create segments with sections covering all areas, then remove
6 # some sections in those segments, and finally write over the areas of the
7 # removed sections using python.
9 # blob* sections are the sections that will be removed to create unlabelled
10 # areas and then overwritten with data to show we preserve the data.
12 # RUN: yaml2obj %s -o %t.base
13 # RUN: llvm-objcopy %t.base %t.stripped --regex -R blob.*
14 # Show that the removal leaves the bytes as zeroes, as desired, for all our
15 # test cases.
16 # RUN: od -t x1 -j 0x2000 -N 28 %t.stripped | FileCheck %s --ignore-case --check-prefix=CHECK1 -DPATTERN="00 00 00 00"
17 # RUN: od -t x1 -j 0x2100 -N 12 %t.stripped | FileCheck %s --ignore-case --check-prefix=CHECK2 -DPATTERN="00 00 00 00"
18 # RUN: od -t x1 -j 0x2200 -N 4  %t.stripped | FileCheck %s --ignore-case --check-prefix=CHECK3 -DPATTERN="00 00 00 00"
19 # RUN: od -t x1 -j 0x2300 -N 12 %t.stripped | FileCheck %s --ignore-case --check-prefix=CHECK4 -DPATTERN="00 00 00 00"
20 # RUN: od -t x1 -j 0x3000 -N 68 %t.stripped | FileCheck %s --ignore-case --check-prefix=CHECK5 -DPATTERN="00 00 00 00"
21 # RUN: od -t x1 -j 0x4000 -N 60 %t.stripped | FileCheck %s --ignore-case --check-prefix=CHECK6 -DPATTERN="00 00 00 00"
22 # RUN: od -t x1 -j 0x5000 -N 60 %t.stripped | FileCheck %s --ignore-case --check-prefix=CHECK7 -DPATTERN="00 00 00 00"
24 # RUN: cp %t.stripped %t.in
25 # RUN: echo "with open('%/t.in', 'rb+') as input:"                                 > %t.py
26 # RUN: echo "  for offset in ["                                                   >> %t.py
27 # RUN: echo "   0x2000, 0x2008, 0x200C, 0x2018, 0x2104, 0x2300,"                  >> %t.py
28 # RUN: echo "   0x3008, 0x3010, 0x3018, 0x3020, 0x3028, 0x302C, 0x3034, 0x303C,"  >> %t.py
29 # RUN: echo "   0x4000, 0x4008, 0x4010, 0x4014, 0x401C, 0x4024, 0x4034,"          >> %t.py
30 # RUN: echo "   0x5000, 0x5008, 0x5010, 0x501C, 0x5024, 0x502C, 0x5030, 0x5038]:" >> %t.py
31 # RUN: echo "    input.seek(offset)"                                              >> %t.py
32 # RUN: echo "    input.write(bytearray.fromhex('DEADBEEF'))"                      >> %t.py
33 # RUN: %python %t.py
34 # RUN: llvm-objcopy %t.in %t.out
35 # RUN: od -t x1 -j 0x2000 -N 28 %t.out | FileCheck %s --ignore-case --check-prefix=CHECK1 -DPATTERN="de ad be ef"
36 # RUN: od -t x1 -j 0x2100 -N 12 %t.out | FileCheck %s --ignore-case --check-prefix=CHECK2 -DPATTERN="de ad be ef"
37 # RUN: od -t x1 -j 0x2200 -N 4  %t.out | FileCheck %s --ignore-case --check-prefix=CHECK3 -DPATTERN="de ad be ef"
38 # RUN: od -t x1 -j 0x2300 -N 12 %t.out | FileCheck %s --ignore-case --check-prefix=CHECK4 -DPATTERN="de ad be ef"
39 # RUN: od -t x1 -j 0x3000 -N 68 %t.out | FileCheck %s --ignore-case --check-prefix=CHECK5 -DPATTERN="de ad be ef"
40 # RUN: od -t x1 -j 0x4000 -N 60 %t.out | FileCheck %s --ignore-case --check-prefix=CHECK6 -DPATTERN="de ad be ef"
41 # RUN: od -t x1 -j 0x5000 -N 60 %t.out | FileCheck %s --ignore-case --check-prefix=CHECK7 -DPATTERN="de ad be ef"
43 # CHECK1:      [[PATTERN]] 11 22 33 44 [[PATTERN]] [[PATTERN]]
44 # CHECK1-NEXT: 00 00 00 00 55 66 77 88 [[PATTERN]]
45 # CHECK2:      99 00 aa bb [[PATTERN]] cc dd ee ff
46 # CHECK3:      fe fe fe fe
47 # CHECK4:      [[PATTERN]] 00 00 00 00 00 00 00 00
48 # CHECK5:      ff ff ee ee dd dd cc cc [[PATTERN]] bb bb aa aa
49 # CHECK5-NEXT: [[PATTERN]] 00 00 99 99 [[PATTERN]] 88 88 77 77
50 # CHECK5-NEXT: [[PATTERN]] 66 66 55 55 [[PATTERN]] [[PATTERN]]
51 # CHECK5-NEXT: 44 44 33 33 [[PATTERN]] 22 22 11 11 [[PATTERN]]
52 # CHECK5-NEXT: 00 11 22 33
53 # CHECK6:      [[PATTERN]] 44 55 66 77 [[PATTERN]] 88 99 aa bb
54 # CHECK6-NEXT: [[PATTERN]] [[PATTERN]] cc dd ee ff [[PATTERN]]
55 # CHECK6-NEXT: ff ee dd cc [[PATTERN]] bb aa 99 88 77 66 55 44
56 # CHECK6-NEXT: 33 22 11 00 [[PATTERN]] 11 11 11 11
57 # CHECK7:      [[PATTERN]] 12 34 56 78 [[PATTERN]] 90 ab cd ef
58 # CHECK7-NEXT: [[PATTERN]] fe dc ba 09 87 65 43 21 [[PATTERN]]
59 # CHECK7-NEXT: 22 22 22 22 [[PATTERN]] 33 33 33 33 [[PATTERN]]
60 # CHECK7-NEXT: [[PATTERN]] 44 44 44 44 [[PATTERN]]
62 --- !ELF
63 FileHeader:
64   Class:   ELFCLASS64
65   Data:    ELFDATA2LSB
66   Type:    ET_EXEC
67   Machine: EM_X86_64
68 Sections:
69   - Name: blob1
70     Type: SHT_PROGBITS
71     Content: 'abbababa'
72     Address: 0x2000
73     AddressAlign: 0x2000
74   - Name: section1
75     Type: SHT_PROGBITS
76     Address: 0x2004
77     Content: '11223344'
78   - Name: blob2
79     Type: SHT_PROGBITS
80     Content: 'abbababa'
81     Address: 0x2008
82   - Name: section2
83     Type: SHT_NOBITS
84     Size: 4
85     Address: 0x200C
86   - Name: blob3
87     Type: SHT_PROGBITS
88     Content: 'abbababa'
89     Address: 0x2010
90   - Name: section3
91     Type: SHT_PROGBITS
92     Content: '55667788'
93     Address: 0x2014
94   - Name: blob4
95     Type: SHT_PROGBITS
96     Content: 'abbababa'
97     Address: 0x2018
98   - Name: section4
99     Type: SHT_PROGBITS
100     Content: '9900aabb'
101     Address: 0x2100
102     AddressAlign: 0x100
103   - Name: blob5
104     Type: SHT_PROGBITS
105     Content: 'abbababa'
106     Address: 0x2104
107   - Name: section5
108     Type: SHT_PROGBITS
109     Address: 0x2108
110     Content: 'ccddeeff'
111   - Name: section6
112     Type: SHT_PROGBITS
113     Content: 'fefefefe'
114     Address: 0x2200
115     AddressAlign: 0x100
116   - Name: blob6
117     Type: SHT_PROGBITS
118     Content: 'abbababa'
119     Address: 0x2300
120     AddressAlign: 0x100
121   - Name: sectionA
122     Type: SHT_PROGBITS
123     Content: 'ffffeeee'
124     Address: 0x3000
125     AddressAlign: 0x1000
126   - Name: sectionB
127     Type: SHT_PROGBITS
128     Content: 'ddddcccc'
129     Address: 0x3004
130   - Name: blobA
131     Type: SHT_PROGBITS
132     Content: 'abbababa'
133     Address: 0x3008
134   - Name: sectionC
135     Type: SHT_PROGBITS
136     Content: 'bbbbaaaa'
137     Address: 0x300C
138   - Name: blobB
139     Type: SHT_PROGBITS
140     Content: 'abbababa'
141     Address: 0x3010
142   - Name: sectionD
143     Type: SHT_PROGBITS
144     Content: '00009999'
145     Address: 0x3014
146   - Name: blobC
147     Type: SHT_PROGBITS
148     Content: 'abbababa'
149     Address: 0x3018
150   - Name: sectionE
151     Type: SHT_PROGBITS
152     Content: '88887777'
153     Address: 0x301C
154   - Name: blobD
155     Type: SHT_PROGBITS
156     Content: 'abbababa'
157     Address: 0x3020
158   - Name: sectionF
159     Type: SHT_PROGBITS
160     Content: '66665555'
161     Address: 0x3024
162   - Name: blobE
163     Type: SHT_PROGBITS
164     Content: 'abbababa'
165     Address: 0x3028
166   - Name: blobF
167     Type: SHT_PROGBITS
168     Content: 'abbababa'
169     Address: 0x302C
170   - Name: sectionG
171     Type: SHT_PROGBITS
172     Content: '44443333'
173     Address: 0x3030
174   - Name: blobG
175     Type: SHT_PROGBITS
176     Content: 'abbababa'
177     Address: 0x3034
178   - Name: sectionH
179     Type: SHT_PROGBITS
180     Content: '22221111'
181     Address: 0x3038
182   - Name: blobH
183     Type: SHT_PROGBITS
184     Content: 'abbababa'
185     Address: 0x303C
186   - Name: sectionI
187     Type: SHT_PROGBITS
188     Content: '00112233'
189     Address: 0x3040
190   - Name: blobz
191     Type: SHT_PROGBITS
192     Content: 'abbababa'
193     Address: 0x4000
194     AddressAlign: 0x1000
195   - Name: sectionz
196     Type: SHT_PROGBITS
197     Content: '44556677'
198     Address: 0x4004
199   - Name: bloby
200     Type: SHT_PROGBITS
201     Content: 'abbababa'
202     Address: 0x4008
203   - Name: sectiony
204     Type: SHT_PROGBITS
205     Content: '8899aabb'
206     Address: 0x400C
207   - Name: blobx
208     Type: SHT_PROGBITS
209     Content: 'abbababa'
210     Address: 0x4010
211   - Name: blobw
212     Type: SHT_PROGBITS
213     Content: 'abbababa'
214     Address: 0x4014
215   - Name: sectionx
216     Type: SHT_PROGBITS
217     Content: 'ccddeeff'
218     Address: 0x4018
219   - Name: blobv
220     Type: SHT_PROGBITS
221     Content: 'abbababa'
222     Address: 0x401C
223   - Name: sectionw
224     Type: SHT_PROGBITS
225     Content: 'ffeeddcc'
226     Address: 0x4020
227   - Name: blobu
228     Type: SHT_PROGBITS
229     Content: 'abbababa'
230     Address: 0x4024
231   - Name: sectionv
232     Type: SHT_PROGBITS
233     Content: 'bbaa9988'
234     Address: 0x4028
235   - Name: sectionu
236     Type: SHT_PROGBITS
237     Content: '77665544'
238     Address: 0x402C
239   - Name: sectiont
240     Type: SHT_PROGBITS
241     Content: '33221100'
242     Address: 0x4030
243   - Name: blobt
244     Type: SHT_PROGBITS
245     Content: 'abbababa'
246     Address: 0x4034
247   - Name: sections
248     Type: SHT_PROGBITS
249     Content: '11111111'
250     Address: 0x4038
251   - Name: bloba
252     Type: SHT_PROGBITS
253     Content: 'abbababa'
254     Address: 0x5000
255     AddressAlign: 0x1000
256   - Name: sectiona
257     Type: SHT_PROGBITS
258     Content: '12345678'
259     Address: 0x5004
260   - Name: blobb
261     Type: SHT_PROGBITS
262     Content: 'abbababa'
263     Address: 0x5008
264   - Name: sectionb
265     Type: SHT_PROGBITS
266     Content: '90abcdef'
267     Address: 0x500C
268   - Name: blobc
269     Type: SHT_PROGBITS
270     Content: 'abbababa'
271     Address: 0x5010
272   - Name: sectionc
273     Type: SHT_PROGBITS
274     Content: 'fedcba09'
275     Address: 0x5014
276   - Name: sectiond
277     Type: SHT_PROGBITS
278     Content: '87654321'
279     Address: 0x5018
280   - Name: blobd
281     Type: SHT_PROGBITS
282     Content: 'abbababa'
283     Address: 0x501C
284   - Name: sectione
285     Type: SHT_PROGBITS
286     Content: '22222222'
287     Address: 0x5020
288   - Name: blobe
289     Type: SHT_PROGBITS
290     Content: 'abbababa'
291     Address: 0x5024
292   - Name: sectionf
293     Type: SHT_PROGBITS
294     Content: '33333333'
295     Address: 0x5028
296   - Name: blobf
297     Type: SHT_PROGBITS
298     Content: 'abbababa'
299     Address: 0x502C
300   - Name: blobg
301     Type: SHT_PROGBITS
302     Content: 'abbababa'
303     Address: 0x5030
304   - Name: sectiong
305     Type: SHT_PROGBITS
306     Content: '44444444'
307     Address: 0x5034
308   - Name: blobh
309     Type: SHT_PROGBITS
310     Content: 'abbababa'
311     Address: 0x5038
312 ProgramHeaders:
313   # First segment has unlabelled space at start and end.
314   - Type:     0x6ABCDEF0 # Non-specific segment type.
315     VAddr:    0x2000
316     Align:    0x2000
317     FirstSec: blob1
318     LastSec:  blob4
319   # Second segment has sections at start and end.
320   - Type:     0x6ABCDEF0
321     VAddr:    0x2100
322     Align:    0x100
323     FirstSec: section4
324     LastSec:  section5
325   # Third segment is all covered by a section.
326   - Type:     0x6ABCDEF0
327     VAddr:    0x2200
328     Align:    0x100
329     FirstSec: section6
330     LastSec:  section6
331   # Fourth segment has no sections (after removing blob headers).
332   - Type:     0x6ABCDEF0
333     VAddr:    0x2300
334     Align:    0x100
335     FirstSec: blob6
336     LastSec:  blob6
337   # Fifth segment is empty.
338   - Type:   0x6ABCDEF0
339     VAddr:  0x2308
340     Offset: 0x2308
341   # The next few segments test behaviour of fully nested segments.
342   # Sixth segment is the "parent" segment.
343   - Type:     0x6ABCDEF0
344     VAddr:    0x3000
345     Align:    0x1000
346     FirstSec: sectionA
347     LastSec:  sectionI
348   # Seventh segment is empty and nested.
349   - Type:   0x6ABCDEF0
350     VAddr:  0x3002
351     Offset: 0x3002
352   # Eighth segment contains only a section and is nested.
353   - Type:     0x6ABCDEF0
354     VAddr:    0x3004
355     FirstSec: sectionB
356     LastSec:  sectionB
357   # Ninth segment contains only unlabelled space and is nested.
358   - Type:     0x6ABCDEF0
359     VAddr:    0x3008
360     FirstSec: blobA
361     LastSec:  blobA
362   # Tenth segment contains two sections with space between and is nested.
363   - Type:     0x6ABCDEF0
364     VAddr:    0x300C
365     FirstSec: sectionC
366     LastSec:  sectionD
367   # Eleventh segment contains two sections with space between and at ends and is nested.
368   - Type:     0x6ABCDEF0
369     VAddr:    0x3018
370     FirstSec: blobC
371     LastSec:  blobE
372   # Twelfth segment contains one section with space at ends adjacent to space in parent segment.
373   - Type:     0x6ABCDEF0
374     VAddr:    0x302E
375     Offset:   0x302E
376     FileSize: 8
377     FirstSec: sectionG
378     LastSec:  sectionG
379   # Thirteenth segment contains overlaps sections at either end in parent segment.
380   - Type:     0x6ABCDEF0
381     VAddr:    0x303A
382     Offset:   0x303A
383     FileSize: 0x8
384     FirstSec: blobH
385     LastSec:  blobH
387   # The next batch of segments are segments that only partially overlap other segments.
389   # Segment14: |-unlabelled-|-Sec-|
390   # Segment15:           |--|-Sec-|-unlabelled-|
391   - Type:     0x6ABCDEF0
392     VAddr:    0x4000
393     FirstSec: blobz
394     LastSec:  sectionz
395   - Type:     0x6ABCDEF0
396     VAddr:    0x4002
397     Offset:   0x4002
398     FirstSec: sectionz
399     LastSec:  bloby
401   # Segment16: |-Sec-|--|
402   # Segment17:    |--|----unlabelled---|
403   - Type:     0x6ABCDEF0
404     VAddr:    0x400C
405     FileSize: 6
406     FirstSec: sectiony
407     LastSec:  sectiony
408   - Type:     0x6ABCDEF0
409     VAddr:    0x400E
410     Offset:   0x400E
411     FirstSec: blobx
412     LastSec:  blobx
414   # Segment18: |-unlabelled-|-Sec-|
415   # Segment19:              |-Sec-|-unlabelled-|
416   - Type:     0x6ABCDEF0
417     VAddr:    0x4014
418     FirstSec: blobw
419     LastSec:  sectionx
420   - Type:     0x6ABCDEF0
421     VAddr:    0x4018
422     FirstSec: sectionx
423     LastSec:  blobv
425   # Segment20: |-Sec-|
426   # Segment21:    |--|-unlabelled-|-Sec-|
427   - Type:     0x6ABCDEF0
428     VAddr:    0x4020
429     FirstSec: sectionw
430     LastSec:  sectionw
432   - Type:   0x6ABCDEF0
433     VAddr:  0x4022
434     Offset: 0x4022
435     FirstSec: blobu
436     LastSec:  sectionv
438   # Segment22: |-Sec-|
439   # Segment23:    |--|-Sec-|
440   - Type:     0x6ABCDEF0
441     VAddr:    0x402C
442     FirstSec: sectionu
443     LastSec:  sectionu
444   - Type:     0x6ABCDEF0
445     VAddr:    0x402E
446     Offset:   0x402E
447     FirstSec: sectiont
448     LastSec:  sectiont
450   # Segment24: |-unlabelled-|--|
451   # Segment25:              |--Sec--|
452   - Type:     0x6ABCDEF0
453     VAddr:    0x4034
454     FileSize: 6
455     FirstSec: blobt
456     LastSec:  blobt
457   - Type:     0x6ABCDEF0
458     VAddr:    0x4038
459     FirstSec: sections
460     LastSec:  sections
462   # The next batch of segments represent groups of three nested/overlapping segments,
463   # with one parent segment containing two overlapping segments.
465   # Segment26: |-unlabelled-|-Sec-|-unlabelled-|
466   # Segment27: |------------|--|
467   # Segment28:              |-Sec-|------------|
468   - Type:     0x6ABCDEF0
469     VAddr:    0x5000
470     Align:    0x1000
471     FirstSec: bloba
472     LastSec:  blobb
473   - Type:     0x6ABCDEF0
474     VAddr:    0x5000
475     FileSize: 6
476     FirstSec: bloba
477     LastSec:  bloba
478   - Type:     0x6ABCDEF0
479     VAddr:    0x5004
480     FirstSec: sectiona
481     LastSec:  blobb
483   # Segment29: |-Sec-|-unlabelled-|-Sec-|
484   # Segment30: |-Sec-|--------|
485   # Segment31:          |---------|-Sec-|
486   - Type:     0x6ABCDEF0
487     VAddr:    0x500C
488     FirstSec: sectionb
489     LastSec:  sectionc
490   - Type:     0x6ABCDEF0
491     VAddr:    0x500C
492     FileSize: 7
493     FirstSec: sectionb
494     LastSec:  sectionb
495   - Type:     0x6ABCDEF0
496     VAddr:    0x5011
497     Offset:   0x5011
498     FirstSec: sectionc
499     LastSec:  sectionc
501   # Segment32: |-Sec-|-unlabelled-|-Sec-|
502   # Segment33: |-Sec-|------------|
503   # Segment34:       |------------|-Sec-|
504   - Type:    0x6ABCDEF0
505     VAddr:   0x5018
506     FirstSec: sectiond
507     LastSec:  sectione
508   - Type:     0x6ABCDEF0
509     VAddr:    0x5018
510     FirstSec: sectiond
511     LastSec:  blobd
512   - Type:     0x6ABCDEF0
513     VAddr:    0x501C
514     FirstSec: blobd
515     LastSec:  sectione
517   # Segment35: |-unlabelled-|-Sec-|-unlabelled-|
518   # Segment36: |------------|-Sec-|
519   # Segment37:              |-Sec-|------------|
520   - Type:     0x6ABCDEF0
521     VAddr:    0x5024
522     FirstSec: blobe
523     LastSec:  blobf
524   - Type:     0x6ABCDEF0
525     VAddr:    0x5024
526     FirstSec: blobe
527     LastSec:  sectionf
528   - Type:     0x6ABCDEF0
529     VAddr:    0x5028
530     FirstSec: sectionf
531     LastSec:  blobf
533   # Segment38: |-unlabelled-|-Sec-|-unlabelled-|
534   # Segment39: |------------|---|
535   # Segment40:                |---|------------|
536   - Type:     0x6ABCDEF0
537     VAddr:    0x5030
538     FirstSec: blobg
539     LastSec:  blobh
540   - Type:     0x6ABCDEF0
541     VAddr:    0x5030
542     FileSize: 7
543     FirstSec: blobg
544     LastSec:  blobg
545   - Type:     0x6ABCDEF0
546     VAddr:    0x5035
547     Offset:   0x5035
548     FirstSec: blobh
549     LastSec:  blobh