stm32f4.ld
216 lines
| 6.5 KiB
| text/plain
|
TextLexer
r79 | /*------------------------------------------------------------------------------ | |||
-- This file is a part of the libuc, microcontroler library | ||||
-- Copyright (C) 2013, Alexis Jeandet | ||||
-- | ||||
-- This program is free software; you can redistribute it and/or modify | ||||
-- it under the terms of the GNU General Public License as published by | ||||
-- the Free Software Foundation; either version 3 of the License, or | ||||
-- (at your option) any later version. | ||||
-- | ||||
-- This program is distributed in the hope that it will be useful, | ||||
-- but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||||
-- GNU General Public License for more details. | ||||
-- | ||||
-- You should have received a copy of the GNU General Public License | ||||
-- along with this program; if not, write to the Free Software | ||||
-- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||||
------------------------------------------------------------------------------- | ||||
-- Author : Alexis Jeandet | ||||
-- Mail : alexis.jeandet@member.fsf.org | ||||
-------------------------------------------------------------------------------*/ | ||||
/* Linker script to configure memory regions. | ||||
* Need modifying for a specific board. | ||||
* FLASH.ORIGIN: starting address of flash | ||||
* FLASH.LENGTH: length of flash | ||||
* RAM.ORIGIN: starting address of RAM bank 0 | ||||
* RAM.LENGTH: length of RAM bank 0 | ||||
*/ | ||||
MEMORY | ||||
{ | ||||
FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 1024k | ||||
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 112k | ||||
CCMRAM (xrw) : ORIGIN = 0x10000000, LENGTH = 64k | ||||
MEMORY_B1 (rx) : ORIGIN = 0x60000000, LENGTH = 0 | ||||
BANK1_SRAM2 (!ixrw): ORIGIN = 0x64000000, LENGTH = 64M | ||||
} | ||||
/* Linker script to place sections and symbol values. Should be used together | ||||
* with other linker script that defines memory regions FLASH and RAM. | ||||
* It references following symbols, which must be defined in code: | ||||
* Reset_Handler : Entry of reset handler | ||||
* | ||||
* It defines following symbols, which code can use without definition: | ||||
* __exidx_start | ||||
* __exidx_end | ||||
* __copy_table_start__ | ||||
* __copy_table_end__ | ||||
* __zero_table_start__ | ||||
* __zero_table_end__ | ||||
* __etext | ||||
* __data_start__ | ||||
* __preinit_array_start | ||||
* __preinit_array_end | ||||
* __init_array_start | ||||
* __init_array_end | ||||
* __fini_array_start | ||||
* __fini_array_end | ||||
* __data_end__ | ||||
* __bss_start__ | ||||
* __bss_end__ | ||||
* __end__ | ||||
* end | ||||
* __HeapLimit | ||||
* __StackLimit | ||||
* __StackTop | ||||
* __stack | ||||
*/ | ||||
ENTRY(Reset_Handler) | ||||
SECTIONS | ||||
{ | ||||
.text : | ||||
{ | ||||
KEEP(*(.isr_vector)) | ||||
*(.text*) | ||||
*(.init) | ||||
*(.fini) | ||||
/* .ctors */ | ||||
*crtbegin.o(.ctors) | ||||
*crtbegin?.o(.ctors) | ||||
*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors) | ||||
*(SORT(.ctors.*)) | ||||
*(.ctors) | ||||
/* .dtors */ | ||||
*crtbegin.o(.dtors) | ||||
*crtbegin?.o(.dtors) | ||||
*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors) | ||||
*(SORT(.dtors.*)) | ||||
*(.dtors) | ||||
*(.rodata*) | ||||
*(.eh_frame*) | ||||
} > FLASH | ||||
.ARM.extab : | ||||
{ | ||||
*(.ARM.extab* .gnu.linkonce.armextab.*) | ||||
} > FLASH | ||||
__exidx_start = .; | ||||
.ARM.exidx : | ||||
{ | ||||
*(.ARM.exidx* .gnu.linkonce.armexidx.*) | ||||
} > FLASH | ||||
__exidx_end = .; | ||||
/* To copy multiple ROM to RAM sections, | ||||
* uncomment .copy.table section and, | ||||
* define __STARTUP_COPY_MULTIPLE in startup_ARMCMx.S */ | ||||
/* | ||||
.copy.table : | ||||
{ | ||||
. = ALIGN(4); | ||||
__copy_table_start__ = .; | ||||
LONG (__etext) | ||||
LONG (__data_start__) | ||||
LONG (__data_end__ - __data_start__) | ||||
LONG (__etext2) | ||||
LONG (__data2_start__) | ||||
LONG (__data2_end__ - __data2_start__) | ||||
__copy_table_end__ = .; | ||||
} > FLASH | ||||
*/ | ||||
/* To clear multiple BSS sections, | ||||
* uncomment .zero.table section and, | ||||
* define __STARTUP_CLEAR_BSS_MULTIPLE in startup_ARMCMx.S */ | ||||
/* | ||||
.zero.table : | ||||
{ | ||||
. = ALIGN(4); | ||||
__zero_table_start__ = .; | ||||
LONG (__bss_start__) | ||||
LONG (__bss_end__ - __bss_start__) | ||||
LONG (__bss2_start__) | ||||
LONG (__bss2_end__ - __bss2_start__) | ||||
__zero_table_end__ = .; | ||||
} > FLASH | ||||
*/ | ||||
__etext = .; | ||||
.data : AT (__etext) | ||||
{ | ||||
__data_start__ = .; | ||||
*(vtable) | ||||
*(.data*) | ||||
. = ALIGN(4); | ||||
/* preinit data */ | ||||
PROVIDE_HIDDEN (__preinit_array_start = .); | ||||
*(.preinit_array) | ||||
PROVIDE_HIDDEN (__preinit_array_end = .); | ||||
. = ALIGN(4); | ||||
/* init data */ | ||||
PROVIDE_HIDDEN (__init_array_start = .); | ||||
*(SORT(.init_array.*)) | ||||
*(.init_array) | ||||
PROVIDE_HIDDEN (__init_array_end = .); | ||||
. = ALIGN(4); | ||||
/* finit data */ | ||||
PROVIDE_HIDDEN (__fini_array_start = .); | ||||
*(SORT(.fini_array.*)) | ||||
*(.fini_array) | ||||
PROVIDE_HIDDEN (__fini_array_end = .); | ||||
*(.jcr) | ||||
. = ALIGN(4); | ||||
/* All data end */ | ||||
__data_end__ = .; | ||||
} > RAM | ||||
.bss : | ||||
{ | ||||
. = ALIGN(4); | ||||
__bss_start__ = .; | ||||
*(.bss*) | ||||
*(COMMON) | ||||
. = ALIGN(4); | ||||
__bss_end__ = .; | ||||
} > RAM | ||||
.heap (COPY): | ||||
{ | ||||
__end__ = .; | ||||
PROVIDE(end = .); | ||||
*(.heap*) | ||||
__HeapLimit = .; | ||||
} > RAM | ||||
/* .stack_dummy section doesn't contains any symbols. It is only | ||||
* used for linker to calculate size of stack sections, and assign | ||||
* values to stack symbols later */ | ||||
.stack_dummy (COPY): | ||||
{ | ||||
*(.stack*) | ||||
} > RAM | ||||
/* Set stack top to end of RAM, and stack limit move down by | ||||
* size of stack_dummy section */ | ||||
__StackTop = ORIGIN(RAM) + LENGTH(RAM); | ||||
__StackLimit = __StackTop - SIZEOF(.stack_dummy); | ||||
PROVIDE(__stack = __StackTop); | ||||
/* Check if data + heap + stack exceeds RAM limit */ | ||||
ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack") | ||||
} | ||||