# 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