## Check for basic functionality using an input file with
## various section types, adresses, data, and no segments.
# RUN: yaml2obj %s --docnum=1 -o %t
# RUN: llvm-objcopy -O srec %t - | \
# RUN: FileCheck --match-full-lines --strict-whitespace %s --check-prefix=SREC
## The record type for the header should be S0 with a 2 byte address
## of 0. For an output file named "-" the header data field should contain "2D".
## The byte count field should therefore have a value of 4: 2 bytes for address,
## 1 byte for output file and 1 byte for checksum.
# SREC:S00400002DCE
# SREC-NEXT:S31500001000000102030405060708090A0B0C0D0E0F62
# SREC-NEXT:S30A0000101010111213147B
# SREC-NEXT:S30F00EFFFFF1111111111111111111159
# SREC-NEXT:S31000FFFFF83031323334353637383940AC
# SREC-NEXT:S30A8000100000010203045B
# SREC-NEXT:S70500000000FA
## Terminator should contain the entry point.
# RUN: llvm-objcopy -O srec --set-start=0xF0000000 %t --only-section=.dummy - 2>&1 | \
# RUN: FileCheck --match-full-lines --strict-whitespace %s --check-prefix=ENTRY
## Sign-extended entry point is OK.
# RUN: llvm-objcopy -O srec --set-start=0xFFFFFFFFF0000000 %t --only-section=.dummy - 2>&1 | \
# RUN: FileCheck --match-full-lines --strict-whitespace %s --check-prefix=ENTRY
# ENTRY:S00400002DCE
# ENTRY-NEXT:S705F00000000A
## Start address which exceeds 32 bit range triggers an error.
# RUN: not llvm-objcopy -O srec --set-start=0xF00000000 %t - 2>&1 | \
# RUN: FileCheck %s --check-prefix=BAD_START
# BAD_START: entry point address 0xf00000000 overflows 32 bits
## Sign-extended start address which exceeds 32 bit range triggers an error.
# RUN: not llvm-objcopy -O srec --set-start=0xFFFFFFFF0F000000 %t - 2>&1 | \
# RUN: FileCheck %s --check-prefix=BAD_EXTENDED_START
# BAD_EXTENDED_START: entry point address 0xffffffff0f000000 overflows 32 bits
--- !ELF
FileHeader:
Class: ELFCLASS64
Data: ELFDATA2LSB
Type: ET_EXEC
Machine: EM_X86_64
Sections:
- Name: .data1
## Records for this section should come last.
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC ]
Content: "11111111111111111111"
Address: 0xEFFFFF
- Name: .data2
## This section overlaps 24-bit address boundary, so we expect
## its record type to be S3.
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC ]
Content: "3031323334353637383940"
Address: 0xFFFFF8
## Sign-extended addresses are OK.
- Name: .data3
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC ]
Address: 0xFFFFFFFF80001000
Content: "0001020304"
- Name: .text
## This section's contents exceed default line length of 16 bytes
## so we expect two lines created for it. Records for this section
## should appear before records for the previous section.
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC ]
Address: 0x1000
Content: "000102030405060708090A0B0C0D0E0F1011121314"
- Name: .bss
## NOBITS sections are not written.
Type: SHT_NOBITS
Flags: [ SHF_ALLOC ]
Address: 0x10100
Size: 0x1000
- Name: .dummy
## Non-allocatable sections are not written.
Type: SHT_PROGBITS
Flags: [ ]
Address: 0x20FFF8
Size: 65536
## Check for various error cases.
## Check that section address range overlapping 32 bit range
## triggers an error.
# RUN: yaml2obj %s --docnum=2 -o %t.err
# RUN: not llvm-objcopy -O srec --only-section=.text1 %t.err - 2>&1 | \
# RUN: FileCheck %s --check-prefix=BAD-ADDR
# RUN: not llvm-objcopy -O srec --only-section=.text2 %t.err - 2>&1 | \
# RUN: FileCheck %s --check-prefix=BAD-ADDR2
# BAD-ADDR: section '.text1' address range [0xfffffff8, 0x100000000] is not 32 bit
# BAD-ADDR2: section '.text2' address range [0xffffffff0, 0xffffffff4] is not 32 bit
## Check that zero length section is not written.
# RUN: llvm-objcopy -O srec --only-section=.text %t.err - | \
# RUN: FileCheck --match-full-lines --strict-whitespace --implicit-check-not={{.}} %s --check-prefix=ZERO_SIZE_SEC
## There should be no records besides header and terminator.
# ZERO_SIZE_SEC:S00400002DCE
# ZERO_SIZE_SEC-NEXT:S9030000FC
--- !ELF
FileHeader:
Class: ELFCLASS64
Data: ELFDATA2LSB
Type: ET_EXEC
Machine: EM_X86_64
Sections:
- Name: .text1
## Part of section data is in 32-bit address range and part isn't.
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC]
Address: 0xFFFFFFF8
Content: "000102030405060708"
- Name: .text2
## Entire secion is outside of 32-bit range.
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC ]
Address: 0xFFFFFFFF0
Content: "0001020304"
## This tests an input file with segments and expects
## physical addresses instead of virtual addresses.
# RUN: yaml2obj %s --docnum=3 -o %t.seg
# RUN: llvm-objcopy -O srec %t.seg - | \
# RUN: FileCheck --match-full-lines --strict-whitespace %s --check-prefix=PADDR
# PADDR:S00400002DCE
# PADDR-NEXT:S214100000000102030405060708090A0B0C0D0E0F63
# PADDR-NEXT:S20910001010111213147C
# PADDR-NEXT:S20F10001530313233343536373839407E
# PADDR-NEXT:S20810002040414243C1
# PADDR-NEXT:S20F10002450515253545556575859600F
# PADDR-NEXT:S20720FFF8000000E1
# PADDR-NEXT:S804100000EB
--- !ELF
## This file has a non-contiguous section layout with large gaps.
## These sections are all tightly packed into one PT_LOAD segment
## starting at physical address 0x100000. Records should use physical addresses.
FileHeader:
Class: ELFCLASS64
Data: ELFDATA2LSB
Type: ET_EXEC
Machine: EM_X86_64
Entry: 0x100000
Sections:
- Name: .text
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC ]
Address: 0x0
Content: "000102030405060708090A0B0C0D0E0F1011121314"
- Name: .data1
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC ]
Content: "3031323334353637383940"
Address: 0xFFF8
- Name: .data2
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC ]
Content: "40414243"
Address: 0x10100
- Name: .data3
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC ]
Content: "5051525354555657585960"
Address: 0x10FFF8
- Name: .bss
Type: SHT_NOBITS
Flags: [ SHF_ALLOC ]
Address: 0x10100
Size: 0x1000
- Name: .dummy
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC ]
Address: 0x20FFF8
Size: 3
- Name: .nonalloc
Type: SHT_PROGBITS
Flags: [ ]
Address: 0x300000
Size: 1
ProgramHeaders:
- Type: PT_LOAD
Flags: [ PF_X, PF_R ]
VAddr: 0xF00000000
PAddr: 0x100000
FirstSec: .text
LastSec: .bss