## 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 ]