| ## Check that BOLT places new PT_LOAD segments right after existing PT_LOAD |
| ## segments, maintaining ascending p_vaddr order. |
| |
| # RUN: split-file %s %t |
| # RUN: yaml2obj %t/yaml -o %t.exe --max-size=0 |
| # RUN: llvm-bolt %t.exe -o %t.bolt --allow-stripped |
| # RUN: llvm-readelf -lW %t.bolt | FileCheck %s |
| |
| # All PT_LOAD segments must be contiguous and in ascending p_vaddr order. |
| # The new BOLT segment must follow the original PT_LOAD segments, not appear |
| # at the end of the program header table after non-LOAD segments. |
| |
| # CHECK: Program Headers: |
| # CHECK-NEXT: Type {{.*}} |
| # CHECK-NEXT: LOAD |
| # CHECK-NEXT: LOAD |
| # CHECK-NEXT: LOAD |
| # CHECK-NEXT: LOAD |
| # CHECK-NOT: LOAD |
| |
| #--- yaml |
| --- !ELF |
| FileHeader: |
| Class: ELFCLASS64 |
| Data: ELFDATA2LSB |
| Type: ET_EXEC |
| Machine: EM_X86_64 |
| Entry: 0x400000 |
| ProgramHeaders: |
| - Type: PT_LOAD |
| Flags: [ PF_R, PF_X ] |
| FirstSec: .text |
| LastSec: .text |
| VAddr: 0x400000 |
| Align: 0x1000 |
| - Type: PT_LOAD |
| Flags: [ PF_R, PF_W ] |
| FirstSec: .data |
| LastSec: .data |
| VAddr: 0x500000 |
| Align: 0x1000 |
| - Type: PT_LOAD |
| Flags: [ PF_R ] |
| FirstSec: .rodata |
| LastSec: .rodata |
| VAddr: 0x600000 |
| Align: 0x1000 |
| - Type: PT_GNU_STACK |
| Flags: [ PF_R, PF_W ] |
| Sections: |
| - Name: .text |
| Type: SHT_PROGBITS |
| Flags: [ SHF_ALLOC, SHF_EXECINSTR ] |
| Content: C3 |
| AddressAlign: 0x1 |
| Address: 0x400000 |
| - Name: .data |
| Type: SHT_PROGBITS |
| Flags: [ SHF_ALLOC, SHF_WRITE ] |
| Content: '00000000' |
| AddressAlign: 0x1 |
| Address: 0x500000 |
| - Name: .rodata |
| Type: SHT_PROGBITS |
| Flags: [ SHF_ALLOC ] |
| Content: '00000000' |
| AddressAlign: 0x1 |
| Address: 0x600000 |
| ... |