/* Shared link layout for every user binary (init, servers, drivers).
 *
 * Linked at a fixed user-space virtual base (set by `image_base` in build.zig,
 * inside the kernel's user region). Same discipline as the kernel's script:
 * one PT_LOAD per permission set, every section page-aligned, so the kernel's
 * user-ELF loader can map each segment with exact W^X permissions. Note the
 * linker also emits a read-only PT_LOAD covering the ELF headers at the image
 * base, so the entry point comes from e_entry, not the base address.
 */

ENTRY(_start)

/* FLAGS bits: 1=X, 2=W, 4=R. */
PHDRS {
    text   PT_LOAD FLAGS(5); /* R + X */
    rodata PT_LOAD FLAGS(4); /* R     */
    data   PT_LOAD FLAGS(6); /* R + W */
}

SECTIONS {
    /* The `.large` code model (needed for the >4 GiB image base) emits code and
     * data into .ltext/.lrodata/.ldata/.lbss; fold those into the matching
     * permission segment alongside the normal names. */
    .text ALIGN(4K) : {
        *(.text .text.*)
        *(.ltext .ltext.*)
    } :text

    .rodata ALIGN(4K) : {
        *(.rodata .rodata.*)
        *(.lrodata .lrodata.*)
    } :rodata

    .data ALIGN(4K) : {
        *(.data .data.*)
        *(.ldata .ldata.*)
    } :data

    /* .bss occupies memory but not file space; the loader zeroes the
     * filesz..memsz gap. */
    .bss ALIGN(4K) : {
        *(.bss .bss.*)
        *(.lbss .lbss.*)
        *(COMMON)
    } :data

    /DISCARD/ : {
        *(.comment)
        *(.note .note.*)
        *(.eh_frame .eh_frame_hdr)
    }
}
