MEMORY {
    ram (rwx)   : org = 0x00000000, len = 15k
    buffer (rw) : org = 0x00003C00, len = 1k
    rom (rx)    : org = 0x10010000, len = 26k
}

ENTRY(reset_handler)

SECTIONS {
    .text.reset_handler : {
        *(.text.reset_handler)
    } > rom

    .text : {
        _sitext = LOADADDR(.text);
        . = ALIGN(4);
        _stext = .;
        *(.text .text.* .gnu.linkonce.t.*)
        *(.rodata .rodata.* .gnu.linkonce.r.*)
        . = ALIGN(4);
        _etext = .;
    } > ram AT > rom

    .data : {
        _sidata = LOADADDR(.data);
        . = ALIGN(4);
        _sdata = .;
        *(.data .data.* .gnu.linkonce.d.*)
        . = ALIGN(4);
        _ssdata = .;
        *(.srodata.cst16) *(.srodata.cst8) *(.srodata.cst4) *(.srodata.cst2) *(.srodata .srodata.*)
        *(.sdata .sdata.* .gnu.linkonce.s.*)
        . = ALIGN(4);
        _edata = .;
    } > ram AT > rom

    .bss : {
        . = ALIGN(4);
        _sbss = .;
        *(.sbss .sbss.* .gnu.linkonce.sb.*)
        *(.scommon .scommon.*)
        *(.bss .bss.* .gnu.linkonce.b.*)
        *(COMMON)
        . = ALIGN(4);
        _ebss = .;
    } > ram

    .buffer : {
        *(.buffer)
    } > buffer

    __global_pointer$ = MIN(_ssdata + 0x800, MAX(_sdata + 0x800, _ebss - 0x800));
    __stack_pointer$ = ORIGIN(ram) + LENGTH(ram);
}