/* 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) } }