0,0 → 1,167 |
/* |
* GCC linker script for STM32 microcontrollers (ARM Cortex-M). |
* |
* It exports the symbols needed for the CMSIS assembler startup script for GCC |
* ARM toolchains (_sidata, _sdata, _edata, _sbss, _ebss) and sets the entry |
* point to Reset_Handler. |
* |
* Adapt FLASH/RAM size for your particular device below. |
* |
* @author Bjørn Forsman |
*/ |
|
MEMORY |
{ |
flash (rx) : ORIGIN = 0x08000000, LENGTH = 256K |
ram (rwx) : ORIGIN = 0x20000000, LENGTH = 64K |
} |
|
ENTRY(Reset_Handler) |
|
/* |
* Reserve memory for heap and stack. The linker will issue an error if there |
* is not enough memory. |
* |
* NOTE: The reserved heap and stack will be added to the bss column of the |
* binutils size command. |
*/ |
_heap_size = 0; /* required amount of heap */ |
_stack_size = 0; /* required amount of stack */ |
|
/* |
* The stack starts at the end of RAM and grows downwards. Full-descending |
* stack; decrement first, then store. |
*/ |
_estack = ORIGIN(ram) + LENGTH(ram); |
|
SECTIONS |
{ |
/* Reset and ISR vectors */ |
.isr_vector : |
{ |
__isr_vector_start__ = .; |
KEEP(*(.isr_vector)) /* without 'KEEP' the garbage collector discards this section */ |
ASSERT(. != __isr_vector_start__, "The .isr_vector section is empty"); |
} >flash |
|
|
/* Text section (code and read-only data) */ |
.text : |
{ |
. = ALIGN(4); |
_stext = .; |
*(.text*) /* code */ |
*(.rodata*) /* read only data */ |
|
/* |
* NOTE: .glue_7 and .glue_7t sections are not needed because Cortex-M |
* only supports Thumb instructions, no ARM/Thumb interworking. |
*/ |
|
/* Static constructors and destructors */ |
KEEP(*(.init)) |
KEEP(*(.fini)) |
|
. = ALIGN(4); |
_etext = .; |
} >flash |
|
|
/* |
* Stack unwinding and exception handling sections. |
* |
* ARM compilers emit object files with .ARM.extab and .ARM.exidx sections |
* when using C++ exceptions. Also, at least GCC emits those sections when |
* dividing large numbers (64-bit) in C. So we have to handle them. |
* |
* (ARM uses .ARM.extab and .ARM.exidx instead of the .eh_frame section |
* used on x86.) |
*/ |
.ARM.extab : /* exception unwinding information */ |
{ |
*(.ARM.extab*) |
} >flash |
.ARM.exidx : /* index entries for section unwinding */ |
{ |
*(.ARM.exidx*) |
} >flash |
|
|
/* |
* Newlib and Eglibc (at least) need these for C++ support. |
* |
* (Copied from Sourcery CodeBench Lite: arm-none-eabi-gcc -V) |
*/ |
.preinit_array : |
{ |
PROVIDE_HIDDEN(__preinit_array_start = .); |
KEEP(*(.preinit_array*)) |
PROVIDE_HIDDEN(__preinit_array_end = .); |
} >flash |
.init_array : |
{ |
PROVIDE_HIDDEN(__init_array_start = .); |
KEEP(*(SORT(.init_array.*))) |
KEEP(*(.init_array*)) |
PROVIDE_HIDDEN(__init_array_end = .); |
} >flash |
.fini_array : |
{ |
PROVIDE_HIDDEN(__fini_array_start = .); |
KEEP(*(SORT(.fini_array.*))) |
KEEP(*(.fini_array*)) |
PROVIDE_HIDDEN(__fini_array_end = .); |
} >flash |
|
|
/* |
* Initialized data section. This section is programmed into FLASH (LMA |
* address) and copied to RAM (VMA address) in startup code. |
*/ |
_sidata = .; |
.data : AT(_sidata) /* LMA address is _sidata (in FLASH) */ |
{ |
. = ALIGN(4); |
_sdata = .; /* data section VMA address */ |
*(.data*) |
. = ALIGN(4); |
_edata = .; |
} >ram |
|
|
/* Uninitialized data section (zeroed out by startup code) */ |
.bss : |
{ |
. = ALIGN(4); |
_sbss = .; |
*(.bss*) |
*(COMMON) |
. = ALIGN(4); |
_ebss = .; |
} >ram |
|
|
/* |
* Reserve memory for heap and stack. The linker will issue an error if |
* there is not enough memory. |
*/ |
._heap : |
{ |
end = .; |
. = ALIGN(4); |
. = . + _heap_size; |
. = ALIGN(4); |
} >ram |
._stack : |
{ |
. = ALIGN(4); |
. = . + _stack_size; |
. = ALIGN(4); |
} >ram |
} |
|
/* Nice to have */ |
__isr_vector_size__ = SIZEOF(.isr_vector); |
__text_size__ = SIZEOF(.text); |
__data_size__ = SIZEOF(.data); |
__bss_size__ = SIZEOF(.bss); |