As for now, llvm-objcopy sorts section headers according to the offsets of the sections in the input file. That can corrupt section references in the dynamic symbol table because it is a loadable section and as such is not updated by the tool. Even though the section references are not required for loading the binary correctly, they are still handy for a user who analyzes the file. While the patch removes global reordering of section headers, it layouts the sections in the same way as before, i.e. according to their original offsets. All that helps the output file to resemble the input better. Note that the patch removes sorting SHT_GROUP sections to the start of the list, which was introduced in D62620 in order to ensure that they come before the group members, along with the corresponding test. The original issue was caused by the sorting of section headers, so dropping the sorting also resolves the issue. Differential Revision: https://reviews.llvm.org/D107653
210 lines
7.7 KiB
Plaintext
210 lines
7.7 KiB
Plaintext
## Check section headers when converting from hex to ELF.
|
|
# RUN: yaml2obj %p/Inputs/ihex-elf-sections.yaml -o %t
|
|
# RUN: llvm-objcopy -O ihex %t %t.hex
|
|
# RUN: llvm-objcopy -I ihex -O elf32-i386 %t.hex %t2
|
|
# RUN: llvm-readobj --section-headers %t2 | FileCheck %s
|
|
|
|
# CHECK: Name: .sec1
|
|
# CHECK-NEXT: Type: SHT_PROGBITS (0x1)
|
|
# CHECK-NEXT: Flags [ (0x3)
|
|
# CHECK-NEXT: SHF_ALLOC (0x2)
|
|
# CHECK-NEXT: SHF_WRITE (0x1)
|
|
# CHECK-NEXT: ]
|
|
# CHECK-NEXT: Address: 0x0
|
|
# CHECK-NEXT: Offset:
|
|
# CHECK-NEXT: Size: 21
|
|
# CHECK-NEXT: Link: 0
|
|
# CHECK-NEXT: Info: 0
|
|
# CHECK-NEXT: AddressAlignment: 1
|
|
# CHECK-NEXT: EntrySize: 0
|
|
|
|
# CHECK: Name: .sec2
|
|
# CHECK-NEXT: Type: SHT_PROGBITS (0x1)
|
|
# CHECK-NEXT: Flags [ (0x3)
|
|
# CHECK-NEXT: SHF_ALLOC (0x2)
|
|
# CHECK-NEXT: SHF_WRITE (0x1)
|
|
# CHECK-NEXT: ]
|
|
# CHECK-NEXT: Address: 0xFFF8
|
|
# CHECK-NEXT: Offset:
|
|
# CHECK-NEXT: Size: 11
|
|
# CHECK-NEXT: Link: 0
|
|
# CHECK-NEXT: Info: 0
|
|
# CHECK-NEXT: AddressAlignment: 1
|
|
# CHECK-NEXT: EntrySize: 0
|
|
|
|
# CHECK: Name: .sec3
|
|
# CHECK-NEXT: Type: SHT_PROGBITS (0x1)
|
|
# CHECK-NEXT: Flags [ (0x3)
|
|
# CHECK-NEXT: SHF_ALLOC (0x2)
|
|
# CHECK-NEXT: SHF_WRITE (0x1)
|
|
# CHECK-NEXT: ]
|
|
# CHECK-NEXT: Address: 0x10100
|
|
# CHECK-NEXT: Offset:
|
|
# CHECK-NEXT: Size: 4
|
|
# CHECK-NEXT: Link: 0
|
|
# CHECK-NEXT: Info: 0
|
|
# CHECK-NEXT: AddressAlignment: 1
|
|
# CHECK-NEXT: EntrySize: 0
|
|
|
|
# CHECK: Name: .sec4
|
|
# CHECK-NEXT: Type: SHT_PROGBITS (0x1)
|
|
# CHECK-NEXT: Flags [ (0x3)
|
|
# CHECK-NEXT: SHF_ALLOC (0x2)
|
|
# CHECK-NEXT: SHF_WRITE (0x1)
|
|
# CHECK-NEXT: ]
|
|
# CHECK-NEXT: Address: 0x10FFF8
|
|
# CHECK-NEXT: Offset:
|
|
# CHECK-NEXT: Size: 11
|
|
# CHECK-NEXT: Link: 0
|
|
# CHECK-NEXT: Info: 0
|
|
# CHECK-NEXT: AddressAlignment: 1
|
|
# CHECK-NEXT: EntrySize: 0
|
|
|
|
## Check section contents.
|
|
# RUN: llvm-objcopy -O binary --only-section=.text %t %t.text
|
|
# RUN: llvm-objcopy -O binary --only-section=.sec1 %t2 %t2.sec1
|
|
# RUN: cmp %t.text %t2.sec1
|
|
# RUN: llvm-objcopy -O binary --only-section=.data %t %t.data
|
|
# RUN: llvm-objcopy -O binary --only-section=.sec2 %t2 %t2.sec2
|
|
# RUN: cmp %t.data %t2.sec2
|
|
# RUN: llvm-objcopy -O binary --only-section=.data2 %t %t.data2
|
|
# RUN: llvm-objcopy -O binary --only-section=.sec3 %t2 %t2.sec3
|
|
# RUN: cmp %t.data2 %t2.sec3
|
|
# RUN: llvm-objcopy -O binary --only-section=.data3 %t %t.data3
|
|
# RUN: llvm-objcopy -O binary --only-section=.sec4 %t2 %t2.sec4
|
|
# RUN: cmp %t.data3 %t2.sec4
|
|
|
|
## Check loading from raw hex file.
|
|
# RUN: llvm-objcopy -I ihex -O elf32-i386 %p/Inputs/sections.hex %t-raw
|
|
# RUN: llvm-readobj --section-headers %t-raw | FileCheck %s --check-prefix=RAW
|
|
|
|
# RAW: Name: .sec1
|
|
# RAW-NEXT: Type: SHT_PROGBITS (0x1)
|
|
# RAW-NEXT: Flags [ (0x3)
|
|
# RAW-NEXT: SHF_ALLOC (0x2)
|
|
# RAW-NEXT: SHF_WRITE (0x1)
|
|
# RAW-NEXT: ]
|
|
# RAW-NEXT: Address: 0x1FFF8
|
|
# RAW-NEXT: Offset:
|
|
# RAW-NEXT: Size: 11
|
|
|
|
# RAW: Name: .sec2
|
|
# RAW-NEXT: Type: SHT_PROGBITS (0x1)
|
|
# RAW-NEXT: Flags [ (0x3)
|
|
# RAW-NEXT: SHF_ALLOC (0x2)
|
|
# RAW-NEXT: SHF_WRITE (0x1)
|
|
# RAW-NEXT: ]
|
|
# RAW-NEXT: Address: 0xFFFF8
|
|
# RAW-NEXT: Offset:
|
|
# RAW-NEXT: Size: 11
|
|
|
|
# RAW: Name: .sec3
|
|
# RAW-NEXT: Type: SHT_PROGBITS (0x1)
|
|
# RAW-NEXT: Flags [ (0x3)
|
|
# RAW-NEXT: SHF_ALLOC (0x2)
|
|
# RAW-NEXT: SHF_WRITE (0x1)
|
|
# RAW-NEXT: ]
|
|
# RAW-NEXT: Address: 0x1FFFF8
|
|
# RAW-NEXT: Offset:
|
|
# RAW-NEXT: Size: 11
|
|
|
|
## Check section contents.
|
|
# RUN: llvm-objcopy -O ihex --only-section=.sec1 %t-raw - | FileCheck %s --check-prefix=RAW-SEC1
|
|
|
|
# RAW-SEC1: :020000021000EC
|
|
# RAW-SEC1-NEXT: :08FFF8000001020304050607E5
|
|
# RAW-SEC1-NEXT: :020000022000DC
|
|
# RAW-SEC1-NEXT: :0300000008090AE2
|
|
|
|
# RUN: llvm-objcopy -O ihex --only-section=.sec2 %t-raw - | FileCheck %s --check-prefix=RAW-SEC2
|
|
|
|
# RAW-SEC2: :02000002F0000C
|
|
# RAW-SEC2-NEXT: :08FFF800303132333435363765
|
|
# RAW-SEC2-NEXT: :020000020000FC
|
|
# RAW-SEC2-NEXT: :020000040010EA
|
|
# RAW-SEC2-NEXT: :030000003839404C
|
|
|
|
# RUN: llvm-objcopy -O ihex --only-section=.sec3 %t-raw - | FileCheck %s --check-prefix=RAW-SEC3
|
|
|
|
# RAW-SEC3: :02000004001FDB
|
|
# RAW-SEC3-NEXT: :08FFF8004041424344454647E5
|
|
# RAW-SEC3-NEXT: :020000040020DA
|
|
# RAW-SEC3-NEXT: :030000004849501C
|
|
|
|
## Check that line is trimmed from whitespace.
|
|
# RUN: echo " :0100000001FE " | llvm-objcopy -I ihex -O elf64-x86-64 - - \
|
|
# RUN: | llvm-objcopy -O ihex - - | FileCheck %s --check-prefix=SPACES
|
|
|
|
# SPACES: :0100000001FE
|
|
# SPACES-NEXT: :00000001FF
|
|
|
|
## Check for various parsing errors.
|
|
## 1. String too short.
|
|
# RUN: echo "01000000FF" | not llvm-objcopy -I ihex -O elf32-i386 - - 2>&1 | FileCheck %s --check-prefix=BAD_LENGTH
|
|
|
|
# BAD_LENGTH: error: '{{.*}}': line 1: line is too short: 10 chars
|
|
|
|
## 2. Missing ':'.
|
|
# RUN: echo "0100000000FF" | not llvm-objcopy -I ihex -O elf32-i386 - - 2>&1 | FileCheck %s --check-prefix=MISSING_COLON
|
|
|
|
# MISSING_COLON: error: '{{.*}}': line 1: missing ':' in the beginning of line
|
|
|
|
## 3. Invalid charatcer.
|
|
# RUN: echo ":01000000xF" | not llvm-objcopy -I ihex -O elf32-i386 - - 2>&1 | FileCheck %s --check-prefix=BAD_CHAR
|
|
|
|
# BAD_CHAR: error: '{{.*}}': line 1: invalid character at position 10
|
|
|
|
## 4. Incorrect string length.
|
|
# RUN: echo ":010000000000000F" | not llvm-objcopy -I ihex -O elf32-i386 - - 2>&1 | FileCheck %s --check-prefix=BAD_LENGTH2
|
|
|
|
# BAD_LENGTH2: error: '{{.*}}': line 1: invalid line length 17 (should be 13)
|
|
|
|
## 5. Invalid type (06).
|
|
# RUN: echo ":00000006FA" | not llvm-objcopy -I ihex -O elf32-i386 - - 2>&1 | FileCheck %s --check-prefix=BAD_TYPE
|
|
|
|
# BAD_TYPE: error: '{{.*}}': line 1: unknown record type: 6
|
|
|
|
## 6. Invalid checksum.
|
|
# RUN: echo ":00000001FA" | not llvm-objcopy -I ihex -O elf32-i386 - - 2>&1 | FileCheck %s --check-prefix=BAD_CKSUM
|
|
|
|
# BAD_CKSUM: error: '{{.*}}': line 1: incorrect checksum
|
|
|
|
## 7. Zero data length.
|
|
# RUN: echo ":00010000FF" | not llvm-objcopy -I ihex - - 2>&1 | FileCheck %s --check-prefix=ZERO_DATA_LEN
|
|
|
|
# ZERO_DATA_LEN: error: '{{.*}}': line 1: zero data length is not allowed for data records
|
|
|
|
## 8. Bad data length for '02' (SegmentAddr) record.
|
|
# RUN: echo ":03000002000000FB" | not llvm-objcopy -I ihex -O elf32-i386 - - 2>&1 | FileCheck %s --check-prefix=BAD_SEGADDR_LEN
|
|
|
|
# BAD_SEGADDR_LEN: error: '{{.*}}': line 1: segment address data should be 2 bytes in size
|
|
|
|
## 9. Bad data length for '03' (StartAddr80x86) record.
|
|
# RUN: echo ":03000003000000FA" | not llvm-objcopy -I ihex -O elf32-i386 - - 2>&1 | FileCheck %s --check-prefix=BAD_STARTADDR_LEN
|
|
|
|
## 10. Bad data length for '05' (StartAddr) record.
|
|
# RUN: echo ":03000005000000F8" | not llvm-objcopy -I ihex -O elf32-i386 - - 2>&1 | FileCheck %s --check-prefix=BAD_STARTADDR_LEN
|
|
|
|
# BAD_STARTADDR_LEN: error: '{{.*}}': line 1: start address data should be 4 bytes in size
|
|
|
|
## 11. Address value for 'StartAddr80x86' is greater then 0xFFFFFU.
|
|
# RUN: echo ":04000003FFFFFFFFFD" | not llvm-objcopy -I ihex -O elf32-i386 - - 2>&1 | FileCheck %s --check-prefix=BAD_STARTADDR
|
|
|
|
# BAD_STARTADDR: error: '{{.*}}': line 1: start address exceeds 20 bit for 80x86
|
|
|
|
## 12. Invalid extended address data size.
|
|
# RUN: echo ":04000004FFFFFFFFFC" | not llvm-objcopy -I ihex -O elf32-i386 - - 2>&1 | FileCheck %s --check-prefix=BAD_EXTADDR_LEN
|
|
|
|
# BAD_EXTADDR_LEN: error: '{{.*}}': line 1: extended address data should be 2 bytes in size
|
|
|
|
## 13. No sections in the hex file.
|
|
## a) try empty file:
|
|
# RUN: echo "" | not llvm-objcopy -I ihex -O elf32-i386 - - 2>&1 | FileCheck %s --check-prefix=NO_SECTIONS
|
|
## b) EOF record should cancel processing further records. Not having any section data
|
|
## before EOF should trigger an error.
|
|
# RUN: echo ":00000001FF" > %t-bad14.hex
|
|
# RUN: echo ":0100000001FE" >> %t-bad14.hex
|
|
# RUN: not llvm-objcopy -I ihex %t-bad14.hex %t-none 2>&1 | FileCheck %s --check-prefix=NO_SECTIONS
|
|
|
|
# NO_SECTIONS: error: '{{.*}}': no sections
|