binary-paddr.test 5.79 KB
## 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 ]
    Sections:
      - Section: .text
      - Section: .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
    Sections:
      - Section: .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
    Sections:
      - Section: .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 ]