xref: /llvm-project/llvm/test/tools/llvm-objcopy/ELF/ihex-reader.test (revision 68616584c3a5ce9352b37d24e408b171928f6840)
1## Check section headers when converting from hex to ELF.
2# RUN: yaml2obj %p/Inputs/ihex-elf-sections.yaml -o %t
3# RUN: llvm-objcopy -O ihex %t %t.hex
4# RUN: llvm-objcopy -I ihex -O elf32-i386 %t.hex %t2
5# RUN: llvm-readobj --section-headers %t2 | FileCheck %s
6
7# CHECK:         Name: .sec1
8# CHECK-NEXT:    Type: SHT_PROGBITS (0x1)
9# CHECK-NEXT:    Flags [ (0x3)
10# CHECK-NEXT:      SHF_ALLOC (0x2)
11# CHECK-NEXT:      SHF_WRITE (0x1)
12# CHECK-NEXT:    ]
13# CHECK-NEXT:    Address: 0x0
14# CHECK-NEXT:    Offset:
15# CHECK-NEXT:    Size: 21
16# CHECK-NEXT:    Link: 0
17# CHECK-NEXT:    Info: 0
18# CHECK-NEXT:    AddressAlignment: 1
19# CHECK-NEXT:    EntrySize: 0
20
21# CHECK:         Name: .sec2
22# CHECK-NEXT:    Type: SHT_PROGBITS (0x1)
23# CHECK-NEXT:    Flags [ (0x3)
24# CHECK-NEXT:      SHF_ALLOC (0x2)
25# CHECK-NEXT:      SHF_WRITE (0x1)
26# CHECK-NEXT:    ]
27# CHECK-NEXT:    Address: 0xFFF8
28# CHECK-NEXT:    Offset:
29# CHECK-NEXT:    Size: 11
30# CHECK-NEXT:    Link: 0
31# CHECK-NEXT:    Info: 0
32# CHECK-NEXT:    AddressAlignment: 1
33# CHECK-NEXT:    EntrySize: 0
34
35# CHECK:         Name: .sec3
36# CHECK-NEXT:    Type: SHT_PROGBITS (0x1)
37# CHECK-NEXT:    Flags [ (0x3)
38# CHECK-NEXT:      SHF_ALLOC (0x2)
39# CHECK-NEXT:      SHF_WRITE (0x1)
40# CHECK-NEXT:    ]
41# CHECK-NEXT:    Address: 0x10100
42# CHECK-NEXT:    Offset:
43# CHECK-NEXT:    Size: 4
44# CHECK-NEXT:    Link: 0
45# CHECK-NEXT:    Info: 0
46# CHECK-NEXT:    AddressAlignment: 1
47# CHECK-NEXT:    EntrySize: 0
48
49# CHECK:         Name: .sec4
50# CHECK-NEXT:    Type: SHT_PROGBITS (0x1)
51# CHECK-NEXT:    Flags [ (0x3)
52# CHECK-NEXT:      SHF_ALLOC (0x2)
53# CHECK-NEXT:      SHF_WRITE (0x1)
54# CHECK-NEXT:    ]
55# CHECK-NEXT:    Address: 0x10FFF8
56# CHECK-NEXT:    Offset:
57# CHECK-NEXT:    Size: 11
58# CHECK-NEXT:    Link: 0
59# CHECK-NEXT:    Info: 0
60# CHECK-NEXT:    AddressAlignment: 1
61# CHECK-NEXT:    EntrySize: 0
62
63## Check section contents.
64# RUN: llvm-objcopy -O binary --only-section=.text %t %t.text
65# RUN: llvm-objcopy -O binary --only-section=.sec1 %t2 %t2.sec1
66# RUN: cmp %t.text %t2.sec1
67# RUN: llvm-objcopy -O binary --only-section=.data %t %t.data
68# RUN: llvm-objcopy -O binary --only-section=.sec2 %t2 %t2.sec2
69# RUN: cmp %t.data %t2.sec2
70# RUN: llvm-objcopy -O binary --only-section=.data2 %t %t.data2
71# RUN: llvm-objcopy -O binary --only-section=.sec3 %t2 %t2.sec3
72# RUN: cmp %t.data2 %t2.sec3
73# RUN: llvm-objcopy -O binary --only-section=.data3 %t %t.data3
74# RUN: llvm-objcopy -O binary --only-section=.sec4 %t2 %t2.sec4
75# RUN: cmp %t.data3 %t2.sec4
76
77## Check loading from raw hex file.
78# RUN: llvm-objcopy -I ihex -O elf32-i386 %p/Inputs/sections.hex %t-raw
79# RUN: llvm-readobj --section-headers %t-raw | FileCheck %s --check-prefix=RAW
80
81# RAW:          Name: .sec1
82# RAW-NEXT:     Type: SHT_PROGBITS (0x1)
83# RAW-NEXT:     Flags [ (0x3)
84# RAW-NEXT:       SHF_ALLOC (0x2)
85# RAW-NEXT:       SHF_WRITE (0x1)
86# RAW-NEXT:     ]
87# RAW-NEXT:     Address: 0x1FFF8
88# RAW-NEXT:     Offset:
89# RAW-NEXT:     Size: 11
90
91# RAW:          Name: .sec2
92# RAW-NEXT:     Type: SHT_PROGBITS (0x1)
93# RAW-NEXT:     Flags [ (0x3)
94# RAW-NEXT:       SHF_ALLOC (0x2)
95# RAW-NEXT:       SHF_WRITE (0x1)
96# RAW-NEXT:     ]
97# RAW-NEXT:     Address: 0xFFFF8
98# RAW-NEXT:     Offset:
99# RAW-NEXT:     Size: 11
100
101# RAW:          Name: .sec3
102# RAW-NEXT:     Type: SHT_PROGBITS (0x1)
103# RAW-NEXT:     Flags [ (0x3)
104# RAW-NEXT:       SHF_ALLOC (0x2)
105# RAW-NEXT:       SHF_WRITE (0x1)
106# RAW-NEXT:     ]
107# RAW-NEXT:     Address: 0x1FFFF8
108# RAW-NEXT:     Offset:
109# RAW-NEXT:     Size: 11
110
111## Check section contents.
112# RUN: llvm-objcopy -O ihex --only-section=.sec1 %t-raw - | FileCheck %s --check-prefix=RAW-SEC1
113
114# RAW-SEC1:         :020000021000EC
115# RAW-SEC1-NEXT:    :08FFF8000001020304050607E5
116# RAW-SEC1-NEXT:    :020000022000DC
117# RAW-SEC1-NEXT:    :0300000008090AE2
118
119# RUN: llvm-objcopy -O ihex --only-section=.sec2 %t-raw - | FileCheck %s --check-prefix=RAW-SEC2
120
121# RAW-SEC2:         :02000002F0000C
122# RAW-SEC2-NEXT:    :08FFF800303132333435363765
123# RAW-SEC2-NEXT:    :020000020000FC
124# RAW-SEC2-NEXT:    :020000040010EA
125# RAW-SEC2-NEXT:    :030000003839404C
126
127# RUN: llvm-objcopy -O ihex --only-section=.sec3 %t-raw - | FileCheck %s --check-prefix=RAW-SEC3
128
129# RAW-SEC3:         :02000004001FDB
130# RAW-SEC3-NEXT:    :08FFF8004041424344454647E5
131# RAW-SEC3-NEXT:    :020000040020DA
132# RAW-SEC3-NEXT:    :030000004849501C
133
134## Check that line is trimmed from whitespace.
135# RUN: echo "   :0100000001FE   " | llvm-objcopy -I ihex -O elf64-x86-64 - - \
136# RUN: | llvm-objcopy -O ihex - - | FileCheck %s --check-prefix=SPACES
137
138# SPACES:       :0100000001FE
139# SPACES-NEXT:  :00000001FF
140
141## Check for various parsing errors.
142## 1. String too short.
143# RUN: echo "01000000FF" | not llvm-objcopy -I ihex -O elf32-i386  - - 2>&1 | FileCheck %s --check-prefix=BAD_LENGTH
144
145# BAD_LENGTH: error: '{{.*}}': line 1: line is too short: 10 chars
146
147## 2. Missing ':'.
148# RUN: echo "0100000000FF" | not llvm-objcopy -I ihex -O elf32-i386  - - 2>&1 | FileCheck %s --check-prefix=MISSING_COLON
149
150# MISSING_COLON: error: '{{.*}}': line 1: missing ':' in the beginning of line
151
152## 3. Invalid charatcer.
153# RUN: echo ":01000000xF" |  not llvm-objcopy -I ihex -O elf32-i386 - - 2>&1 | FileCheck %s --check-prefix=BAD_CHAR
154
155# BAD_CHAR: error: '{{.*}}': line 1: invalid character at position 10
156
157## 4. Incorrect string length.
158# RUN: echo ":010000000000000F" | not llvm-objcopy -I ihex -O elf32-i386  - - 2>&1 | FileCheck %s --check-prefix=BAD_LENGTH2
159
160# BAD_LENGTH2: error: '{{.*}}': line 1: invalid line length 17 (should be 13)
161
162## 5. Invalid type (06).
163# RUN: echo ":00000006FA" | not llvm-objcopy -I ihex -O elf32-i386 - - 2>&1 | FileCheck %s --check-prefix=BAD_TYPE
164
165# BAD_TYPE: error: '{{.*}}': line 1: unknown record type: 6
166
167## 6. Invalid checksum.
168# RUN: echo ":00000001FA" | not llvm-objcopy -I ihex -O elf32-i386 - - 2>&1 | FileCheck %s --check-prefix=BAD_CKSUM
169
170# BAD_CKSUM: error: '{{.*}}': line 1: incorrect checksum
171
172## 7. Zero data length.
173# RUN: echo ":00010000FF" | not llvm-objcopy -I ihex - - 2>&1 | FileCheck %s --check-prefix=ZERO_DATA_LEN
174
175# ZERO_DATA_LEN: error: '{{.*}}': line 1: zero data length is not allowed for data records
176
177## 8. Bad data length for '02' (SegmentAddr) record.
178# RUN: echo ":03000002000000FB" | not llvm-objcopy -I ihex -O elf32-i386 - - 2>&1 | FileCheck %s --check-prefix=BAD_SEGADDR_LEN
179
180# BAD_SEGADDR_LEN: error: '{{.*}}': line 1: segment address data should be 2 bytes in size
181
182## 9. Bad data length for '03' (StartAddr80x86) record.
183# RUN: echo ":03000003000000FA" | not llvm-objcopy -I ihex -O elf32-i386 - - 2>&1 | FileCheck %s --check-prefix=BAD_STARTADDR_LEN
184
185## 10. Bad data length for '05' (StartAddr) record.
186# RUN: echo ":03000005000000F8" | not llvm-objcopy -I ihex -O elf32-i386 - - 2>&1 | FileCheck %s --check-prefix=BAD_STARTADDR_LEN
187
188# BAD_STARTADDR_LEN: error: '{{.*}}': line 1: start address data should be 4 bytes in size
189
190## 11. Address value for 'StartAddr80x86' is greater then 0xFFFFFU.
191# RUN: echo ":04000003FFFFFFFFFD" | not llvm-objcopy -I ihex -O elf32-i386 - - 2>&1 | FileCheck %s --check-prefix=BAD_STARTADDR
192
193# BAD_STARTADDR:  error: '{{.*}}': line 1: start address exceeds 20 bit for 80x86
194
195## 12. Invalid extended address data size.
196# RUN: echo ":04000004FFFFFFFFFC" | not llvm-objcopy -I ihex -O elf32-i386 - - 2>&1 | FileCheck %s --check-prefix=BAD_EXTADDR_LEN
197
198# BAD_EXTADDR_LEN: error: '{{.*}}': line 1: extended address data should be 2 bytes in size
199
200## 13. No sections in the hex file.
201## a) try empty file:
202# RUN: echo "" | not llvm-objcopy -I ihex -O elf32-i386 - - 2>&1 | FileCheck %s --check-prefix=NO_SECTIONS
203## b) EOF record should cancel processing further records. Not having any section data
204##    before EOF should trigger an error.
205# RUN: echo ":00000001FF" > %t-bad14.hex
206# RUN: echo ":0100000001FE" >> %t-bad14.hex
207# RUN: not llvm-objcopy -I ihex %t-bad14.hex %t-none 2>&1 | FileCheck %s --check-prefix=NO_SECTIONS
208
209# NO_SECTIONS: error: '{{.*}}': no sections
210