Files
clang-p2996/llvm/test/tools/llvm-objcopy/ELF/ihex-reader.test
Igor Kudrin 68616584c3 [llvm-objcopy][ELF] Avoid reordering section headers
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
2021-08-12 17:12:09 +07:00

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