## Full example

    /* Source: https://github.com/stivale/stivale2-barebones/blob/master/kernel/linker.ld */

    /* We want the symbol _start to be our entry point */
    ENTRY(_start)

    /* Define the program headers we want so the bootloader gives us the right */
    /* MMU permissions */
    PHDRS
    {
        null    PT_NULL    FLAGS(0) ;                   /* Null segment */
        text    PT_LOAD    FLAGS((1 << 0) | (1 << 2)) ; /* Execute + Read */
        rodata  PT_LOAD    FLAGS((1 << 2)) ;            /* Read only */
        data    PT_LOAD    FLAGS((1 << 1) | (1 << 2)) ; /* Write + Read */
    }

    SECTIONS
    {
        /* We wanna be placed in the topmost 2GiB of the address space, for optimisations */
        /* and because that is what the stivale2 spec mandates. */
        /* Any address in this region will do, but often 0xffffffff80000000 is chosen as */
        /* that is the beginning of the region. */
        . = 0xffffffff80000000;

        .text : {
            *(.text .text.*)
        } :text

        /* Move to the next memory page for .rodata */
        . += CONSTANT(MAXPAGESIZE);

        /* We place the .stivale2hdr section containing the header in its own section, */
        /* and we use the KEEP directive on it to make sure it doesn't get discarded. */
        .stivale2hdr : {
            KEEP(*(.stivale2hdr))
        } :rodata

        .rodata : {
            *(.rodata .rodata.*)
        } :rodata

        /* Move to the next memory page for .data */
        . += CONSTANT(MAXPAGESIZE);

        .data : {
            *(.data .data.*)
        } :data

        .bss : {
            *(COMMON)
            *(.bss .bss.*)
        } :data
    }