/* (C) 2020 Philip Endecott. Distributed under the Boost Software License, Version 1.0. See accompanying file LICENCE.txt or copy at https://www.boost.org/LICENSE_1_0.txt */ OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm"); OUTPUT_ARCH(arm); /* SEARCH_DIR("/usr/local/arm-elf/lib"); */ MEMORY { flash (RX) : ORIGIN = 0x00000000, LENGTH = 120K ram (WX) : ORIGIN = 0x40000000, LENGTH = 16K /* Note some RAM is used by the bootloader so will not persist over reboot, but we're not relying on that anyway; other areas are used by IAP flash programming and RealMonitor. */ } /* INPUT(copy_data_section.o); */ SECTIONS { .vectors 0x00000000 : { *(.vectors) } >flash .ctors : { KEEP (*crtbegin*.o(.ctors)) KEEP (*(EXCLUDE_FILE (*crtend*.o ) .ctors)) KEEP (*(SORT(.ctors.*))) KEEP (*(.ctors)) } >flash .dtors : { KEEP (*crtbegin*.o(.dtors)) KEEP (*(EXCLUDE_FILE (*crtend*.o ) .dtors)) KEEP (*(SORT(.dtors.*))) KEEP (*(.dtors)) } >flash .init : { KEEP (*(.init)) } >flash =0 .jcr : { KEEP (*(.init)) } >flash =0 .rodata : { *(.rodata) } >flash .text : { *(.text) *(.text.*) *(.glue_7t) *(.glue_7) *(.gcc*) } >flash .init_array : { __init_array_start = .; *(.init_array) __init_array_end = .; } >flash .fini : { KEEP (*(.fini)) } >flash =0 .ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >flash .ARM.exidx : { __exidx_start = .; *(.ARM.exidx* .gnu.linkonce.armexidx.*) __exidx_end = .; } >ram AT>flash .eh_frame : ONLY_IF_RO { *(.eh_frame) } >flash .mdata : { *(.data) } >ram AT>flash .bss (NOLOAD) : { __bss_start__ = ALIGN(0x4); _bss_start = . ; *(.bss) __bss_end__ = ALIGN(0x4); _bss_end = . ; } >ram __end__ = . ; _end = . ; PROVIDE (end = .); /DISCARD/ : { *(*debug*) *(.comment) } } _mdata_start = ADDR ( .fini ) + SIZEOF ( .fini ) ; _mdata_end = _mdata_start + SIZEOF ( .mdata ) ; _data_start = ADDR ( .mdata ) ; irq_stacktop = ORIGIN(ram) + LENGTH(ram) - 4; irq_stacksize = 256; stacktop = irq_stacktop - irq_stacksize; /* We need to add some stuff to make exception handling work; here's a good reference: https://electronics.stackexchange.com/questions/224618/minimal-code-required-to-startup-a-stm32f4 */ uart0 = 0xE000C000; uart1 = 0xE0010000;