ENTRY(Reset_Handler)

MEMORY
{
    SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x5000
}

SECTIONS
{
    . = ORIGIN(SRAM);

    .text : ALIGN(4)
    {
        KEEP(*(.startup))
        KEEP(*(.text.BlankCheck))
        KEEP(*(.text.Verification))
        *(.text*)
        *(.rodata*)
    } > SRAM

    .ARM.exidx : ALIGN(4)
    {
        *(.ARM.exidx*)
        *(.gnu.linkonce.armexidx.*)
    } > SRAM

    .loader_state 0x20000cd8 (NOLOAD) : ALIGN(4)
    {
        KEEP(*(.loader_state))
    } > SRAM

    .flash_info 0x20000ce4 (NOLOAD) : ALIGN(4)
    {
        KEEP(*(.flash_info))
    } > SRAM

    .svs_stack 0x20002d20 (NOLOAD) : ALIGN(8)
    {
        KEEP(*(.svs_stack))
    } > SRAM

    .libspace 0x20002f20 (NOLOAD) : ALIGN(8)
    {
        KEEP(*(.libspace))
    } > SRAM

    .heap 0x20002f80 (NOLOAD) : ALIGN(8)
    {
        KEEP(*(.heap))
    } > SRAM

    .stack 0x20003180 (NOLOAD) : ALIGN(8)
    {
        KEEP(*(.stack))
    } > SRAM

    __svs_stack_top = 0x20002f20;

    ASSERT(ADDR(.loader_state) >= ADDR(.text) + SIZEOF(.text) + SIZEOF(.ARM.exidx),
           "text overlaps fixed loader state at 0x20000cd8")
    ASSERT(SIZEOF(.loader_state) <= 0x0c,
           "loader state must fit 0x20000cd8..0x20000ce3")
    ASSERT(ADDR(.flash_info) == 0x20000ce4, "Flash_Info address changed")
    ASSERT(SIZEOF(.flash_info) <= 0x203c, "Flash_Info size changed")

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