186 lines
5.8 KiB
Plaintext
186 lines
5.8 KiB
Plaintext
|
## 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 ]
|