PHDRS { rodata PT_LOAD FILEHDR PHDRS FLAGS (4); text PT_LOAD; data PT_LOAD; random PT_OPENBSD_RANDOMIZE; relro PT_GNU_RELRO; dynamic PT_DYNAMIC; note PT_NOTE; } SECTIONS { /* RODATA */ . = 0 + SIZEOF_HEADERS; .dynsym : { *(.dynsym) } :rodata .gnu.hash : { *(.gnu.hash) } :rodata .dynstr : { *(.dynstr) } :rodata .rodata : { *(.rodata .rodata.*) } :rodata .eh_frame : { *(.eh_frame) } :rodata /* TEXT */ . = ALIGN(0x10000); .text : { *(.text .text.*) } :text . = ALIGN(0x1000); .boot.text : { boot_text_start = .; *(.boot.text) boot_text_end = .; } :text /* RELRO DATA */ . = DATA_SEGMENT_ALIGN (0x10000, 0x1000); .openbsd.randomdata : { *(.openbsd.randomdata .openbsd.randomdata.*) } :data :relro :random .data.rel.ro : { *(.data.rel.ro.local*) *(.data.rel.ro*) } :data :relro .dynamic : { *(.dynamic) } :data :relro :dynamic .got : { *(.got.plt) *(.got) } :data :relro . = DATA_SEGMENT_RELRO_END (0, .); /* BOOTDATA */ . = ALIGN(0x1000); boot_data_start = .; .rela.dyn : { *(.rela.text .rela.text.*) *(.rela.rodata .rela.rodata.*) *(.rela.data .rela.data.*) *(.rela.got) *(.rela.bss .rela.bss.*) } :data /* XXX .rela.plt is unused but cannot delete: ld.bfd zeros DT_RELASZ then! */ .rela.plt : { *(.rela.plt) } :data .hash : { *(.hash) } :data .note : { *(.note.openbsd.*) } :data :note .boot.data : { *(.boot.data .boot.data.*) } :data boot_data_end = .; /* DATA */ . = ALIGN(0x1000); .data : { *(.data .data.*) } :data .bss : { *(.dynbss) *(.bss .bss.*) *(COMMON) } :data . = DATA_SEGMENT_END (.); /DISCARD/ : { *(.note.GNU-stack) } }