550 lines
15 KiB
Plaintext
550 lines
15 KiB
Plaintext
# We want to preserve areas in segments that are not covered by section headers.
|
|
# This test shows that we do this for areas at the start of a segment, between
|
|
# sections in a segment, and after all sections in a segment.
|
|
# To create inputs with arbitrary data in segments, not covered by sections, we
|
|
# use yaml2obj to create segments with sections covering all areas, then remove
|
|
# some sections in those segments, and finally write over the areas of the
|
|
# removed sections using python.
|
|
|
|
# blob* sections are the sections that will be removed to create unlabelled
|
|
# areas and then overwritten with data to show we preserve the data.
|
|
|
|
# RUN: yaml2obj %s -o %t.base
|
|
# RUN: llvm-objcopy %t.base %t.stripped --regex -R blob.*
|
|
# Show that the removal leaves the bytes as zeroes, as desired, for all our
|
|
# test cases.
|
|
# RUN: od -t x1 -j 0x2000 -N 28 %t.stripped | FileCheck %s --ignore-case --check-prefix=CHECK1 -DPATTERN="00 00 00 00"
|
|
# RUN: od -t x1 -j 0x2100 -N 12 %t.stripped | FileCheck %s --ignore-case --check-prefix=CHECK2 -DPATTERN="00 00 00 00"
|
|
# RUN: od -t x1 -j 0x2200 -N 4 %t.stripped | FileCheck %s --ignore-case --check-prefix=CHECK3 -DPATTERN="00 00 00 00"
|
|
# RUN: od -t x1 -j 0x2300 -N 12 %t.stripped | FileCheck %s --ignore-case --check-prefix=CHECK4 -DPATTERN="00 00 00 00"
|
|
# RUN: od -t x1 -j 0x3000 -N 68 %t.stripped | FileCheck %s --ignore-case --check-prefix=CHECK5 -DPATTERN="00 00 00 00"
|
|
# RUN: od -t x1 -j 0x4000 -N 60 %t.stripped | FileCheck %s --ignore-case --check-prefix=CHECK6 -DPATTERN="00 00 00 00"
|
|
# RUN: od -t x1 -j 0x5000 -N 60 %t.stripped | FileCheck %s --ignore-case --check-prefix=CHECK7 -DPATTERN="00 00 00 00"
|
|
|
|
# RUN: cp %t.stripped %t.in
|
|
# RUN: echo "with open('%/t.in', 'rb+') as input:" > %t.py
|
|
# RUN: echo " for offset in [" >> %t.py
|
|
# RUN: echo " 0x2000, 0x2008, 0x200C, 0x2018, 0x2104, 0x2300," >> %t.py
|
|
# RUN: echo " 0x3008, 0x3010, 0x3018, 0x3020, 0x3028, 0x302C, 0x3034, 0x303C," >> %t.py
|
|
# RUN: echo " 0x4000, 0x4008, 0x4010, 0x4014, 0x401C, 0x4024, 0x4034," >> %t.py
|
|
# RUN: echo " 0x5000, 0x5008, 0x5010, 0x501C, 0x5024, 0x502C, 0x5030, 0x5038]:" >> %t.py
|
|
# RUN: echo " input.seek(offset)" >> %t.py
|
|
# RUN: echo " input.write(bytearray.fromhex('DEADBEEF'))" >> %t.py
|
|
# RUN: %python %t.py
|
|
# RUN: llvm-objcopy %t.in %t.out
|
|
# RUN: od -t x1 -j 0x2000 -N 28 %t.out | FileCheck %s --ignore-case --check-prefix=CHECK1 -DPATTERN="de ad be ef"
|
|
# RUN: od -t x1 -j 0x2100 -N 12 %t.out | FileCheck %s --ignore-case --check-prefix=CHECK2 -DPATTERN="de ad be ef"
|
|
# RUN: od -t x1 -j 0x2200 -N 4 %t.out | FileCheck %s --ignore-case --check-prefix=CHECK3 -DPATTERN="de ad be ef"
|
|
# RUN: od -t x1 -j 0x2300 -N 12 %t.out | FileCheck %s --ignore-case --check-prefix=CHECK4 -DPATTERN="de ad be ef"
|
|
# RUN: od -t x1 -j 0x3000 -N 68 %t.out | FileCheck %s --ignore-case --check-prefix=CHECK5 -DPATTERN="de ad be ef"
|
|
# RUN: od -t x1 -j 0x4000 -N 60 %t.out | FileCheck %s --ignore-case --check-prefix=CHECK6 -DPATTERN="de ad be ef"
|
|
# RUN: od -t x1 -j 0x5000 -N 60 %t.out | FileCheck %s --ignore-case --check-prefix=CHECK7 -DPATTERN="de ad be ef"
|
|
|
|
# CHECK1: [[PATTERN]] 11 22 33 44 [[PATTERN]] [[PATTERN]]
|
|
# CHECK1-NEXT: 00 00 00 00 55 66 77 88 [[PATTERN]]
|
|
# CHECK2: 99 00 aa bb [[PATTERN]] cc dd ee ff
|
|
# CHECK3: fe fe fe fe
|
|
# CHECK4: [[PATTERN]] 00 00 00 00 00 00 00 00
|
|
# CHECK5: ff ff ee ee dd dd cc cc [[PATTERN]] bb bb aa aa
|
|
# CHECK5-NEXT: [[PATTERN]] 00 00 99 99 [[PATTERN]] 88 88 77 77
|
|
# CHECK5-NEXT: [[PATTERN]] 66 66 55 55 [[PATTERN]] [[PATTERN]]
|
|
# CHECK5-NEXT: 44 44 33 33 [[PATTERN]] 22 22 11 11 [[PATTERN]]
|
|
# CHECK5-NEXT: 00 11 22 33
|
|
# CHECK6: [[PATTERN]] 44 55 66 77 [[PATTERN]] 88 99 aa bb
|
|
# CHECK6-NEXT: [[PATTERN]] [[PATTERN]] cc dd ee ff [[PATTERN]]
|
|
# CHECK6-NEXT: ff ee dd cc [[PATTERN]] bb aa 99 88 77 66 55 44
|
|
# CHECK6-NEXT: 33 22 11 00 [[PATTERN]] 11 11 11 11
|
|
# CHECK7: [[PATTERN]] 12 34 56 78 [[PATTERN]] 90 ab cd ef
|
|
# CHECK7-NEXT: [[PATTERN]] fe dc ba 09 87 65 43 21 [[PATTERN]]
|
|
# CHECK7-NEXT: 22 22 22 22 [[PATTERN]] 33 33 33 33 [[PATTERN]]
|
|
# CHECK7-NEXT: [[PATTERN]] 44 44 44 44 [[PATTERN]]
|
|
|
|
--- !ELF
|
|
FileHeader:
|
|
Class: ELFCLASS64
|
|
Data: ELFDATA2LSB
|
|
Type: ET_EXEC
|
|
Machine: EM_X86_64
|
|
Sections:
|
|
- Name: blob1
|
|
Type: SHT_PROGBITS
|
|
Content: 'abbababa'
|
|
Address: 0x2000
|
|
AddressAlign: 0x2000
|
|
- Name: section1
|
|
Type: SHT_PROGBITS
|
|
Address: 0x2004
|
|
Content: '11223344'
|
|
- Name: blob2
|
|
Type: SHT_PROGBITS
|
|
Content: 'abbababa'
|
|
Address: 0x2008
|
|
- Name: section2
|
|
Type: SHT_NOBITS
|
|
Size: 4
|
|
Address: 0x200C
|
|
- Name: blob3
|
|
Type: SHT_PROGBITS
|
|
Content: 'abbababa'
|
|
Address: 0x2010
|
|
- Name: section3
|
|
Type: SHT_PROGBITS
|
|
Content: '55667788'
|
|
Address: 0x2014
|
|
- Name: blob4
|
|
Type: SHT_PROGBITS
|
|
Content: 'abbababa'
|
|
Address: 0x2018
|
|
- Name: section4
|
|
Type: SHT_PROGBITS
|
|
Content: '9900aabb'
|
|
Address: 0x2100
|
|
AddressAlign: 0x100
|
|
- Name: blob5
|
|
Type: SHT_PROGBITS
|
|
Content: 'abbababa'
|
|
Address: 0x2104
|
|
- Name: section5
|
|
Type: SHT_PROGBITS
|
|
Address: 0x2108
|
|
Content: 'ccddeeff'
|
|
- Name: section6
|
|
Type: SHT_PROGBITS
|
|
Content: 'fefefefe'
|
|
Address: 0x2200
|
|
AddressAlign: 0x100
|
|
- Name: blob6
|
|
Type: SHT_PROGBITS
|
|
Content: 'abbababa'
|
|
Address: 0x2300
|
|
AddressAlign: 0x100
|
|
- Name: sectionA
|
|
Type: SHT_PROGBITS
|
|
Content: 'ffffeeee'
|
|
Address: 0x3000
|
|
AddressAlign: 0x1000
|
|
- Name: sectionB
|
|
Type: SHT_PROGBITS
|
|
Content: 'ddddcccc'
|
|
Address: 0x3004
|
|
- Name: blobA
|
|
Type: SHT_PROGBITS
|
|
Content: 'abbababa'
|
|
Address: 0x3008
|
|
- Name: sectionC
|
|
Type: SHT_PROGBITS
|
|
Content: 'bbbbaaaa'
|
|
Address: 0x300C
|
|
- Name: blobB
|
|
Type: SHT_PROGBITS
|
|
Content: 'abbababa'
|
|
Address: 0x3010
|
|
- Name: sectionD
|
|
Type: SHT_PROGBITS
|
|
Content: '00009999'
|
|
Address: 0x3014
|
|
- Name: blobC
|
|
Type: SHT_PROGBITS
|
|
Content: 'abbababa'
|
|
Address: 0x3018
|
|
- Name: sectionE
|
|
Type: SHT_PROGBITS
|
|
Content: '88887777'
|
|
Address: 0x301C
|
|
- Name: blobD
|
|
Type: SHT_PROGBITS
|
|
Content: 'abbababa'
|
|
Address: 0x3020
|
|
- Name: sectionF
|
|
Type: SHT_PROGBITS
|
|
Content: '66665555'
|
|
Address: 0x3024
|
|
- Name: blobE
|
|
Type: SHT_PROGBITS
|
|
Content: 'abbababa'
|
|
Address: 0x3028
|
|
- Name: blobF
|
|
Type: SHT_PROGBITS
|
|
Content: 'abbababa'
|
|
Address: 0x302C
|
|
- Name: sectionG
|
|
Type: SHT_PROGBITS
|
|
Content: '44443333'
|
|
Address: 0x3030
|
|
- Name: blobG
|
|
Type: SHT_PROGBITS
|
|
Content: 'abbababa'
|
|
Address: 0x3034
|
|
- Name: sectionH
|
|
Type: SHT_PROGBITS
|
|
Content: '22221111'
|
|
Address: 0x3038
|
|
- Name: blobH
|
|
Type: SHT_PROGBITS
|
|
Content: 'abbababa'
|
|
Address: 0x303C
|
|
- Name: sectionI
|
|
Type: SHT_PROGBITS
|
|
Content: '00112233'
|
|
Address: 0x3040
|
|
- Name: blobz
|
|
Type: SHT_PROGBITS
|
|
Content: 'abbababa'
|
|
Address: 0x4000
|
|
AddressAlign: 0x1000
|
|
- Name: sectionz
|
|
Type: SHT_PROGBITS
|
|
Content: '44556677'
|
|
Address: 0x4004
|
|
- Name: bloby
|
|
Type: SHT_PROGBITS
|
|
Content: 'abbababa'
|
|
Address: 0x4008
|
|
- Name: sectiony
|
|
Type: SHT_PROGBITS
|
|
Content: '8899aabb'
|
|
Address: 0x400C
|
|
- Name: blobx
|
|
Type: SHT_PROGBITS
|
|
Content: 'abbababa'
|
|
Address: 0x4010
|
|
- Name: blobw
|
|
Type: SHT_PROGBITS
|
|
Content: 'abbababa'
|
|
Address: 0x4014
|
|
- Name: sectionx
|
|
Type: SHT_PROGBITS
|
|
Content: 'ccddeeff'
|
|
Address: 0x4018
|
|
- Name: blobv
|
|
Type: SHT_PROGBITS
|
|
Content: 'abbababa'
|
|
Address: 0x401C
|
|
- Name: sectionw
|
|
Type: SHT_PROGBITS
|
|
Content: 'ffeeddcc'
|
|
Address: 0x4020
|
|
- Name: blobu
|
|
Type: SHT_PROGBITS
|
|
Content: 'abbababa'
|
|
Address: 0x4024
|
|
- Name: sectionv
|
|
Type: SHT_PROGBITS
|
|
Content: 'bbaa9988'
|
|
Address: 0x4028
|
|
- Name: sectionu
|
|
Type: SHT_PROGBITS
|
|
Content: '77665544'
|
|
Address: 0x402C
|
|
- Name: sectiont
|
|
Type: SHT_PROGBITS
|
|
Content: '33221100'
|
|
Address: 0x4030
|
|
- Name: blobt
|
|
Type: SHT_PROGBITS
|
|
Content: 'abbababa'
|
|
Address: 0x4034
|
|
- Name: sections
|
|
Type: SHT_PROGBITS
|
|
Content: '11111111'
|
|
Address: 0x4038
|
|
- Name: bloba
|
|
Type: SHT_PROGBITS
|
|
Content: 'abbababa'
|
|
Address: 0x5000
|
|
AddressAlign: 0x1000
|
|
- Name: sectiona
|
|
Type: SHT_PROGBITS
|
|
Content: '12345678'
|
|
Address: 0x5004
|
|
- Name: blobb
|
|
Type: SHT_PROGBITS
|
|
Content: 'abbababa'
|
|
Address: 0x5008
|
|
- Name: sectionb
|
|
Type: SHT_PROGBITS
|
|
Content: '90abcdef'
|
|
Address: 0x500C
|
|
- Name: blobc
|
|
Type: SHT_PROGBITS
|
|
Content: 'abbababa'
|
|
Address: 0x5010
|
|
- Name: sectionc
|
|
Type: SHT_PROGBITS
|
|
Content: 'fedcba09'
|
|
Address: 0x5014
|
|
- Name: sectiond
|
|
Type: SHT_PROGBITS
|
|
Content: '87654321'
|
|
Address: 0x5018
|
|
- Name: blobd
|
|
Type: SHT_PROGBITS
|
|
Content: 'abbababa'
|
|
Address: 0x501C
|
|
- Name: sectione
|
|
Type: SHT_PROGBITS
|
|
Content: '22222222'
|
|
Address: 0x5020
|
|
- Name: blobe
|
|
Type: SHT_PROGBITS
|
|
Content: 'abbababa'
|
|
Address: 0x5024
|
|
- Name: sectionf
|
|
Type: SHT_PROGBITS
|
|
Content: '33333333'
|
|
Address: 0x5028
|
|
- Name: blobf
|
|
Type: SHT_PROGBITS
|
|
Content: 'abbababa'
|
|
Address: 0x502C
|
|
- Name: blobg
|
|
Type: SHT_PROGBITS
|
|
Content: 'abbababa'
|
|
Address: 0x5030
|
|
- Name: sectiong
|
|
Type: SHT_PROGBITS
|
|
Content: '44444444'
|
|
Address: 0x5034
|
|
- Name: blobh
|
|
Type: SHT_PROGBITS
|
|
Content: 'abbababa'
|
|
Address: 0x5038
|
|
ProgramHeaders:
|
|
# First segment has unlabelled space at start and end.
|
|
- Type: 0x6ABCDEF0 # Non-specific segment type.
|
|
VAddr: 0x2000
|
|
Align: 0x2000
|
|
FirstSec: blob1
|
|
LastSec: blob4
|
|
# Second segment has sections at start and end.
|
|
- Type: 0x6ABCDEF0
|
|
VAddr: 0x2100
|
|
Align: 0x100
|
|
FirstSec: section4
|
|
LastSec: section5
|
|
# Third segment is all covered by a section.
|
|
- Type: 0x6ABCDEF0
|
|
VAddr: 0x2200
|
|
Align: 0x100
|
|
FirstSec: section6
|
|
LastSec: section6
|
|
# Fourth segment has no sections (after removing blob headers).
|
|
- Type: 0x6ABCDEF0
|
|
VAddr: 0x2300
|
|
Align: 0x100
|
|
FirstSec: blob6
|
|
LastSec: blob6
|
|
# Fifth segment is empty.
|
|
- Type: 0x6ABCDEF0
|
|
VAddr: 0x2308
|
|
Offset: 0x2308
|
|
# The next few segments test behaviour of fully nested segments.
|
|
# Sixth segment is the "parent" segment.
|
|
- Type: 0x6ABCDEF0
|
|
VAddr: 0x3000
|
|
Align: 0x1000
|
|
FirstSec: sectionA
|
|
LastSec: sectionI
|
|
# Seventh segment is empty and nested.
|
|
- Type: 0x6ABCDEF0
|
|
VAddr: 0x3002
|
|
Offset: 0x3002
|
|
# Eighth segment contains only a section and is nested.
|
|
- Type: 0x6ABCDEF0
|
|
VAddr: 0x3004
|
|
FirstSec: sectionB
|
|
LastSec: sectionB
|
|
# Ninth segment contains only unlabelled space and is nested.
|
|
- Type: 0x6ABCDEF0
|
|
VAddr: 0x3008
|
|
FirstSec: blobA
|
|
LastSec: blobA
|
|
# Tenth segment contains two sections with space between and is nested.
|
|
- Type: 0x6ABCDEF0
|
|
VAddr: 0x300C
|
|
FirstSec: sectionC
|
|
LastSec: sectionD
|
|
# Eleventh segment contains two sections with space between and at ends and is nested.
|
|
- Type: 0x6ABCDEF0
|
|
VAddr: 0x3018
|
|
FirstSec: blobC
|
|
LastSec: blobE
|
|
# Twelfth segment contains one section with space at ends adjacent to space in parent segment.
|
|
- Type: 0x6ABCDEF0
|
|
VAddr: 0x302E
|
|
Offset: 0x302E
|
|
FileSize: 8
|
|
FirstSec: sectionG
|
|
LastSec: sectionG
|
|
# Thirteenth segment contains overlaps sections at either end in parent segment.
|
|
- Type: 0x6ABCDEF0
|
|
VAddr: 0x303A
|
|
Offset: 0x303A
|
|
FileSize: 0x8
|
|
FirstSec: blobH
|
|
LastSec: blobH
|
|
|
|
# The next batch of segments are segments that only partially overlap other segments.
|
|
|
|
# Segment14: |-unlabelled-|-Sec-|
|
|
# Segment15: |--|-Sec-|-unlabelled-|
|
|
- Type: 0x6ABCDEF0
|
|
VAddr: 0x4000
|
|
FirstSec: blobz
|
|
LastSec: sectionz
|
|
- Type: 0x6ABCDEF0
|
|
VAddr: 0x4002
|
|
Offset: 0x4002
|
|
FirstSec: sectionz
|
|
LastSec: bloby
|
|
|
|
# Segment16: |-Sec-|--|
|
|
# Segment17: |--|----unlabelled---|
|
|
- Type: 0x6ABCDEF0
|
|
VAddr: 0x400C
|
|
FileSize: 6
|
|
FirstSec: sectiony
|
|
LastSec: sectiony
|
|
- Type: 0x6ABCDEF0
|
|
VAddr: 0x400E
|
|
Offset: 0x400E
|
|
FirstSec: blobx
|
|
LastSec: blobx
|
|
|
|
# Segment18: |-unlabelled-|-Sec-|
|
|
# Segment19: |-Sec-|-unlabelled-|
|
|
- Type: 0x6ABCDEF0
|
|
VAddr: 0x4014
|
|
FirstSec: blobw
|
|
LastSec: sectionx
|
|
- Type: 0x6ABCDEF0
|
|
VAddr: 0x4018
|
|
FirstSec: sectionx
|
|
LastSec: blobv
|
|
|
|
# Segment20: |-Sec-|
|
|
# Segment21: |--|-unlabelled-|-Sec-|
|
|
- Type: 0x6ABCDEF0
|
|
VAddr: 0x4020
|
|
FirstSec: sectionw
|
|
LastSec: sectionw
|
|
|
|
- Type: 0x6ABCDEF0
|
|
VAddr: 0x4022
|
|
Offset: 0x4022
|
|
FirstSec: blobu
|
|
LastSec: sectionv
|
|
|
|
# Segment22: |-Sec-|
|
|
# Segment23: |--|-Sec-|
|
|
- Type: 0x6ABCDEF0
|
|
VAddr: 0x402C
|
|
FirstSec: sectionu
|
|
LastSec: sectionu
|
|
- Type: 0x6ABCDEF0
|
|
VAddr: 0x402E
|
|
Offset: 0x402E
|
|
FirstSec: sectiont
|
|
LastSec: sectiont
|
|
|
|
# Segment24: |-unlabelled-|--|
|
|
# Segment25: |--Sec--|
|
|
- Type: 0x6ABCDEF0
|
|
VAddr: 0x4034
|
|
FileSize: 6
|
|
FirstSec: blobt
|
|
LastSec: blobt
|
|
- Type: 0x6ABCDEF0
|
|
VAddr: 0x4038
|
|
FirstSec: sections
|
|
LastSec: sections
|
|
|
|
# The next batch of segments represent groups of three nested/overlapping segments,
|
|
# with one parent segment containing two overlapping segments.
|
|
|
|
# Segment26: |-unlabelled-|-Sec-|-unlabelled-|
|
|
# Segment27: |------------|--|
|
|
# Segment28: |-Sec-|------------|
|
|
- Type: 0x6ABCDEF0
|
|
VAddr: 0x5000
|
|
Align: 0x1000
|
|
FirstSec: bloba
|
|
LastSec: blobb
|
|
- Type: 0x6ABCDEF0
|
|
VAddr: 0x5000
|
|
FileSize: 6
|
|
FirstSec: bloba
|
|
LastSec: bloba
|
|
- Type: 0x6ABCDEF0
|
|
VAddr: 0x5004
|
|
FirstSec: sectiona
|
|
LastSec: blobb
|
|
|
|
# Segment29: |-Sec-|-unlabelled-|-Sec-|
|
|
# Segment30: |-Sec-|--------|
|
|
# Segment31: |---------|-Sec-|
|
|
- Type: 0x6ABCDEF0
|
|
VAddr: 0x500C
|
|
FirstSec: sectionb
|
|
LastSec: sectionc
|
|
- Type: 0x6ABCDEF0
|
|
VAddr: 0x500C
|
|
FileSize: 7
|
|
FirstSec: sectionb
|
|
LastSec: sectionb
|
|
- Type: 0x6ABCDEF0
|
|
VAddr: 0x5011
|
|
Offset: 0x5011
|
|
FirstSec: sectionc
|
|
LastSec: sectionc
|
|
|
|
# Segment32: |-Sec-|-unlabelled-|-Sec-|
|
|
# Segment33: |-Sec-|------------|
|
|
# Segment34: |------------|-Sec-|
|
|
- Type: 0x6ABCDEF0
|
|
VAddr: 0x5018
|
|
FirstSec: sectiond
|
|
LastSec: sectione
|
|
- Type: 0x6ABCDEF0
|
|
VAddr: 0x5018
|
|
FirstSec: sectiond
|
|
LastSec: blobd
|
|
- Type: 0x6ABCDEF0
|
|
VAddr: 0x501C
|
|
FirstSec: blobd
|
|
LastSec: sectione
|
|
|
|
# Segment35: |-unlabelled-|-Sec-|-unlabelled-|
|
|
# Segment36: |------------|-Sec-|
|
|
# Segment37: |-Sec-|------------|
|
|
- Type: 0x6ABCDEF0
|
|
VAddr: 0x5024
|
|
FirstSec: blobe
|
|
LastSec: blobf
|
|
- Type: 0x6ABCDEF0
|
|
VAddr: 0x5024
|
|
FirstSec: blobe
|
|
LastSec: sectionf
|
|
- Type: 0x6ABCDEF0
|
|
VAddr: 0x5028
|
|
FirstSec: sectionf
|
|
LastSec: blobf
|
|
|
|
# Segment38: |-unlabelled-|-Sec-|-unlabelled-|
|
|
# Segment39: |------------|---|
|
|
# Segment40: |---|------------|
|
|
- Type: 0x6ABCDEF0
|
|
VAddr: 0x5030
|
|
FirstSec: blobg
|
|
LastSec: blobh
|
|
- Type: 0x6ABCDEF0
|
|
VAddr: 0x5030
|
|
FileSize: 7
|
|
FirstSec: blobg
|
|
LastSec: blobg
|
|
- Type: 0x6ABCDEF0
|
|
VAddr: 0x5035
|
|
Offset: 0x5035
|
|
FirstSec: blobh
|
|
LastSec: blobh
|