## When the offset of a non-PT_LOAD segment (e.g. PT_INTERP) equals the offset
## of a PT_LOAD segment, set the parent of the segment with a smaller alignment
## to the segment with a larger alignment, ensuring that the offset is correctly
## aligned.
# RUN: yaml2obj %s -o %t
# RUN: llvm-objcopy %t %t2
# RUN: llvm-readelf -Sl %t2 | FileCheck %s
# CHECK: [Nr] Name Type Address Off Size ES Flg Lk Inf Al
# CHECK-NEXT: [ 0] NULL 0000000000000000 000000 000000 00 0 0 0
# CHECK-NEXT: [ 1] .text PROGBITS 0000000000201000 001000 000001 00 0 0 4
# CHECK-NEXT: [ 2] .interp PROGBITS 0000000000202000 002000 00001c 00 0 0 1
# CHECK-NEXT: [ 3] .rodata PROGBITS 0000000000202020 002020 000001 00 0 0 1
# CHECK-NEXT: [ 4] .tdata PROGBITS 0000000000203000 003000 000001 00 0 0 4096
# CHECK-NEXT: [ 5] .relro_padding NOBITS 0000000000203001 003001 000fff 00 0 0 1
# CHECK-NEXT: [ 6] .strtab STRTAB 0000000000000000 003001 000001 00 0 0 1
# CHECK-NEXT: [ 7] .shstrtab STRTAB 0000000000000000 003002 00003f 00 0 0 1
# CHECK: Program Headers:
# CHECK-NEXT: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
# CHECK-NEXT: PHDR 0x000040 0x0000000000200040 0x0000000000200040 0x0001c0 0x0001c0 0x8
# CHECK-NEXT: INTERP 0x002000 0x0000000000202000 0x0000000000202000 0x00001c 0x00001c 0x1
# CHECK-NEXT: [Requesting program interpreter: ]
# CHECK-NEXT: LOAD 0x000000 0x0000000000200000 0x0000000000200000 0x000200 0x000200 0x1000
# CHECK-NEXT: LOAD 0x001000 0x0000000000201000 0x0000000000201000 0x000001 0x000001 0x1000
# CHECK-NEXT: LOAD 0x002000 0x0000000000202000 0x0000000000202000 0x000021 0x000021 0x1000
# CHECK-NEXT: TLS 0x003000 0x0000000000203000 0x0000000000203000 0x000001 0x001000 0x1000
# CHECK-NEXT: GNU_RELRO 0x003000 0x0000000000203000 0x0000000000203000 0x000001 0x001000 0x1000
# CHECK-NEXT: LOAD 0x003000 0x0000000000203000 0x0000000000203000 0x000001 0x001000 0x1000
--- !ELF
FileHeader:
Class: ELFCLASS64
Data: ELFDATA2LSB
Type: ET_EXEC
Machine: EM_X86_64
ProgramHeaders:
- Type: PT_PHDR
VAddr: 0x200040
Align: 0x8
Offset: 0x40
FileSize: 0x1c0
MemSize: 0x1c0
- Type: PT_INTERP
FirstSec: .interp
LastSec: .interp
## The address equals the address of its containing PT_LOAD.
VAddr: 0x202000
Offset: 0x2000
- Type: PT_LOAD
VAddr: 0x200000
Align: 0x1000
Offset: 0x0
FileSize: 0x200
MemSize: 0x200
- Type: PT_LOAD
FirstSec: .text
LastSec: .text
VAddr: 0x201000
Align: 0x1000
Offset: 0x1000
- Type: PT_LOAD
FirstSec: .interp
LastSec: .rodata
VAddr: 0x202000
Align: 0x1000
Offset: 0x2000
## Intentionally place PT_TLS/PT_GNU_RELRO before PT_LOAD to test that we
## correctly set parent segments.
- Type: PT_TLS
FirstSec: .tdata
LastSec: .relro_padding
VAddr: 0x203000
Align: 0x1000
Offset: 0x3000
- Type: PT_GNU_RELRO
FirstSec: .tdata
LastSec: .relro_padding
VAddr: 0x203000
Align: 0x1000
Offset: 0x3000
- Type: PT_LOAD
FirstSec: .tdata
LastSec: .relro_padding
VAddr: 0x203000
Align: 0x1000
Offset: 0x3000
Sections:
- Name: .text
Type: SHT_PROGBITS
Address: 0x201000
AddressAlign: 0x4
Offset: 0x1000
Content: C3
- Name: .interp
Type: SHT_PROGBITS
Address: 0x202000
AddressAlign: 0x1
Offset: 0x2000
Size: 0x1C
- Name: .rodata
Type: SHT_PROGBITS
Address: 0x202020
AddressAlign: 0x1
Offset: 0x2020
Size: 1
- Name: .tdata
Type: SHT_PROGBITS
Address: 0x203000
AddressAlign: 0x1000
Offset: 0x3000
Size: 1
- Name: .relro_padding
Type: SHT_NOBITS
Address: 0x203001
AddressAlign: 0x1
Size: 0xFFF