## The computed LMA of a section in a PT_LOAD equals sh_offset-p_offset+p_paddr.
## The byte offset difference between two sections equals the difference between their LMAs.
## Corollary: if two sections are in the same PT_LOAD, the byte offset
## difference equals the difference between their sh_addr fields.
# RUN: yaml2obj --docnum=1 %s -o %t1
# RUN: llvm-objcopy -O binary %t1 %t1.out
# RUN: od -A x -t x2 %t1.out | FileCheck %s --check-prefix=CHECK1 --ignore-case
# RUN: wc -c %t1.out | FileCheck %s --check-prefix=SIZE1
# CHECK1: 000000 c3c3 c3c3 0000 0000 0000 0000 0000 0000
# CHECK1-NEXT: 000010 0000 0000 0000 0000 0000 0000 0000 0000
# CHECK1-NEXT: *
# CHECK1-NEXT: 001000 3232
# SIZE1: 4098
--- !ELF
FileHeader:
Class: ELFCLASS64
Data: ELFDATA2LSB
Type: ET_EXEC
Machine: EM_X86_64
Sections:
- Name: .text
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
Address: 0x1000
AddressAlign: 0x1000
Content: "c3c3c3c3"
- Name: .data
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC, SHF_WRITE ]
Address: 0x2000
AddressAlign: 0x1000
Content: "3232"
ProgramHeaders:
- Type: PT_LOAD
Flags: [ PF_R, PF_W ]
FirstSec: .text
LastSec: .data
## The computed LMA of a section not in a PT_LOAD equals its sh_addr.
# RUN: yaml2obj --docnum=2 %s -o %t2
# RUN: llvm-objcopy -O binary %t2 %t2.out
# RUN: od -A x -t x2 %t2.out | FileCheck %s --check-prefix=CHECK2 --ignore-case
# RUN: wc -c %t2.out | FileCheck %s --check-prefix=SIZE2
## The computed LMA of .data is 0x4000. The minimum LMA of all non-empty sections is 0x1000.
## The content of .data will be written at 0x4000-0x1000 = 0x3000.
# CHECK2: 000000 c3c3 c3c3 0000 0000 0000 0000 0000 0000
# CHECK2-NEXT: 000010 0000 0000 0000 0000 0000 0000 0000 0000
# CHECK2-NEXT: *
# CHECK2-NEXT: 003000 3232
# SIZE2: 12290
--- !ELF
FileHeader:
Class: ELFCLASS64
Data: ELFDATA2LSB
Type: ET_EXEC
Machine: EM_X86_64
Sections:
- Name: .text
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
## Not in a PT_LOAD. LMA = sh_addr = 0x1000.
Address: 0x1000
AddressAlign: 0x1000
Content: "c3c3c3c3"
- Name: .data
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC, SHF_WRITE ]
## LMA = sh_offset-p_offset+p_paddr = 0x2000-0x2000+0x4000 = 0x4000.
Address: 0x2000
AddressAlign: 0x1000
Content: "3232"
ProgramHeaders:
- Type: PT_LOAD
Flags: [ PF_R, PF_W ]
VAddr: 0x2000
## p_vaddr is increased from 0x2000 to 0x4000.
PAddr: 0x4000
FirstSec: .data
LastSec: .data
## Check that we use sh_offset instead of sh_addr to decide where to write section contents.
# RUN: yaml2obj --docnum=3 %s -o %t3
# RUN: llvm-objcopy -O binary %t3 %t3.out
# RUN: od -A x -t x2 %t3.out | FileCheck %s --check-prefix=CHECK3 --ignore-case
# RUN: wc -c %t3.out | FileCheck %s --check-prefix=SIZE3
## The minimum LMA of all non-empty sections is 0x1000.
## The content of .data will be written at 0x3000-0x1000 = 0x2000.
# CHECK3: 000000 c3c3 c3c3 0000 0000 0000 0000 0000 0000
# CHECK3-NEXT: 000010 0000 0000 0000 0000 0000 0000 0000 0000
# CHECK3-NEXT: *
# CHECK3-NEXT: 002000 3232
# SIZE3: 8194
--- !ELF
FileHeader:
Class: ELFCLASS64
Data: ELFDATA2LSB
Type: ET_EXEC
Machine: EM_X86_64
Sections:
- Name: .text
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
## Not in a PT_LOAD. LMA = sh_addr = 0x1000.
Address: 0x1000
AddressAlign: 0x1000
Content: "c3c3c3c3"
- Name: .data
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC, SHF_WRITE ]
## sh_addr is increased from 0x2000 to 0x3000, but it is ignored.
## LMA = sh_offset-p_offset+p_paddr = 0x2000-0x2000+0x3000 = 0x3000.
Address: 0x3000
AddressAlign: 0x1000
Content: "3232"
ProgramHeaders:
- Type: PT_LOAD
Flags: [ PF_R, PF_W ]
VAddr: 0x3000
FirstSec: .data
LastSec: .data
## The first section (.text) is empty. Test that we skip its LMA until the first
## non-empty section, otherwise we would leave a large number of leading zeroes.
# RUN: yaml2obj --docnum=4 %s -o %t4
# RUN: llvm-objcopy -O binary %t4 %t4.out
# RUN: od -A x -t x2 %t4.out | FileCheck %s --check-prefix=SKIPEMPTY
# SKIPEMPTY: 000000 3232
# SKIPEMPTY-NEXT: 000002
--- !ELF
FileHeader:
Class: ELFCLASS64
Data: ELFDATA2LSB
Type: ET_EXEC
Machine: EM_X86_64
Sections:
- Name: .text
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
Address: 0x1000
AddressAlign: 0x1000
- Name: gap
Type: Fill
Size: 0x1000
- Name: .data
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC, SHF_WRITE ]
Content: "3232"
## The last section (.data) is empty. Test that we stop dumping after the last
## non-empty section, otherwise we would leave a large number of trailing zeroes.
# RUN: yaml2obj --docnum=5 %s -o %t5
# RUN: llvm-objcopy -O binary %t5 %t5.out
# RUN: od -A x -t x2 %t5.out | FileCheck %s --check-prefix=SKIPEMPTY
--- !ELF
FileHeader:
Class: ELFCLASS64
Data: ELFDATA2LSB
Type: ET_EXEC
Machine: EM_X86_64
Sections:
- Name: .text
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
Address: 0x1000
AddressAlign: 0x1000
Content: "3232"
- Name: gap
Type: Fill
Size: 0xffd
- Name: .data
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC, SHF_WRITE ]
## NOBITS sections should not appear in output.
# RUN: yaml2obj --docnum=6 %s -o %t6
# RUN: llvm-objcopy -O binary %t6 %t6.out
# RUN: od -A x -t x2 %t6.out | FileCheck %s --check-prefix=SKIPNOBITS --ignore-case
# SKIPNOBITS: 000000 c3c3 c3c3
# SKIPNOBITS-NEXT: 000004
--- !ELF
FileHeader:
Class: ELFCLASS64
Data: ELFDATA2LSB
Type: ET_EXEC
Machine: EM_X86_64
Sections:
- Name: .bss
Type: SHT_NOBITS
Flags: [ SHF_ALLOC ]
Address: 0x1000
AddressAlign: 0x1000
Size: 0x123
- Name: gap
Type: Fill
Size: 0xffd
- Name: .text
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
Address: 0x4000
AddressAlign: 0x1000
Content: "c3c3c3c3"
## If .bss is converted to non-SHT_NOBITS, align its new offset. This may affect
## the output size.
# RUN: yaml2obj --docnum=7 %s -o %t7
# RUN: llvm-objcopy -O binary --set-section-flags .bss=alloc,contents %t7 %t7.out
# RUN: od -A x -t x2 %t7.out | FileCheck %s --check-prefix=FILLNOBITS --ignore-case
# FILLNOBITS: 000000 c3c3 0000 0000 0000 0000 0000 0000 0000
# FILLNOBITS-NEXT: 000010 0000 00
# FILLNOBITS-NEXT: 000013
--- !ELF
FileHeader:
Class: ELFCLASS64
Data: ELFDATA2LSB
Type: ET_EXEC
Machine: EM_X86_64
Sections:
- Name: .text
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
Address: 0x1000
AddressAlign: 0x1000
Content: "c3c3"
- Name: .bss
Type: SHT_NOBITS
Flags: [ SHF_ALLOC ]
## sh_offset is not aligned.
ShOffset: 0x1002
Size: 0x3
AddressAlign: 0x10
ProgramHeaders:
- Type: PT_LOAD
Flags: [ PF_R, PF_W, PF_X ]
Offset: 0x1000
VAddr: 0x1000
PAddr: 0x1000
FileSize: 0x2
MemSize: 0x13
Align: 0x1000
## Test that sections do not move relative to their physical addresses if
## the physical address is not aligned. This behavior matches GNU objcopy
## and is important for embedded images where the physical address is
## used to store the initial data image. Without converting the type of a
## NOBITS section, don't align the offset. This matches GNU objcopy when
## the physical address of a section is not aligned.
# RUN: yaml2obj --docnum=8 %s -o %t8
# RUN: llvm-objcopy -O binary --only-section=.text --only-section=.data %t8 %t8.out
# RUN: od -A x -t x1 %t8.out | FileCheck %s --check-prefix=PHYSUNALIGNED --ignore-case
# PHYSUNALIGNED: 000000 11 22 33 44 55 66 77 88 99 aa bb cc dd ee ff 00
# PHYSUNALIGNED-NEXT: 000010 11 22 33 44 bd ac cd ab
--- !ELF
FileHeader:
Class: ELFCLASS64
Data: ELFDATA2LSB
Type: ET_EXEC
Machine: EM_X86_64
ProgramHeaders:
- Type: PT_LOAD
Flags: [ PF_X, PF_R ]
FirstSec: .text
LastSec: .text
VAddr: 0x200000
PAddr: 0x200000
Align: 0x1000
- Type: PT_LOAD
Flags: [ PF_W, PF_R ]
FirstSec: .data
LastSec: .data
VAddr: 0x400000
PAddr: 0x200014
## PAddr is not aligned by sh_addralign(.data)
Align: 0x1000
Sections:
- Name: .text
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
Address: 0x200000
AddressAlign: 0x1
Offset: 0x1000
Content: 112233445566778899aabbccddeeff0011223344
- Name: .data
Type: SHT_PROGBITS
Flags: [ SHF_WRITE, SHF_ALLOC ]
Address: 0x400000
AddressAlign: 0x8
Offset: 0x2000
Content: BDACCDAB