You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
432 lines
18 KiB
432 lines
18 KiB
/******************************************************************************
|
|
Filename : sections.ld
|
|
Author : eclipse-arm-gcc team, pry(modified)
|
|
Date : 27/02/2017
|
|
Description : Default linker script for Cortex-M (it includes specifics for STM32F[34]xx).
|
|
To make use of the multi-region initialisations, define
|
|
OS_INCLUDE_STARTUP_INIT_MULTIPLE_RAM_SECTIONS for the _startup.c file.
|
|
******************************************************************************/
|
|
|
|
/* Memory Definitions *********************************************************
|
|
Description : This section will define the memory layout of the sytem. This section
|
|
requires modifying for a specific board. Typical settings for different
|
|
chips are listed below:
|
|
DTCM 64K, SRAM1 240K, SRAM2 16K, Flash 512k (R320/F512) - STM32F746
|
|
DTCM 128K, SRAM1 368K, SRAM2 16K, Flash 1024k (R512/F1024) - STM32F767
|
|
DTCM 128K, SRAM1 368K, SRAM2 16K, Flash 2048k (R1024/F2048) - STM32Hxxx
|
|
Component : .ORIGIN - Starting address of the memory region.
|
|
.LENGTH - Length of the region.
|
|
******************************************************************************/
|
|
MEMORY
|
|
{
|
|
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 512K
|
|
FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 1024K
|
|
EROMEM0 (rx) : ORIGIN = 0x00000000, LENGTH = 0
|
|
ERWMEM0 (xrw) : ORIGIN = 0xC0000000, LENGTH = 32768K
|
|
}
|
|
_Privileged_Functions_Region_Size = 32K;
|
|
_Privileged_Data_Region_Size = 512;
|
|
|
|
__FLASH_segment_start__ = ORIGIN( FLASH );
|
|
__FLASH_segment_end__ = __FLASH_segment_start__ + LENGTH( FLASH );
|
|
|
|
__privileged_functions_start__ = ORIGIN( FLASH );
|
|
__privileged_functions_end__ = __privileged_functions_start__ + _Privileged_Functions_Region_Size;
|
|
|
|
__SRAM_segment_start__ = ORIGIN( RAM );
|
|
__SRAM_segment_end__ = __SRAM_segment_start__ + LENGTH( RAM );
|
|
|
|
__privileged_data_start__ = ORIGIN( RAM );
|
|
__privileged_data_end__ = ORIGIN( RAM ) + _Privileged_Data_Region_Size;
|
|
/* End Memory Definitions ****************************************************/
|
|
|
|
/* Stack Definitions *********************************************************/
|
|
/* The '__stack' definition is required by crt0, do not remove it. */
|
|
__stack = ORIGIN(RAM) + LENGTH(RAM);
|
|
/* STM specific definition */
|
|
_estack = __stack;
|
|
|
|
/* Default stack sizes. These are used by the startup in order to allocate stacks for the different modes */
|
|
__Main_Stack_Size = 1024 ;
|
|
/* "PROVIDE" allows to easily override these values from an object file or the command line */
|
|
PROVIDE ( _Main_Stack_Size = __Main_Stack_Size );
|
|
__Main_Stack_Limit = __stack - __Main_Stack_Size ;
|
|
PROVIDE ( _Main_Stack_Limit = __Main_Stack_Limit ) ;
|
|
/* The default stack - There will be a link error if there is not this amount of RAM free at the end */
|
|
_Minimum_Stack_Size = 256 ;
|
|
/* End Stack Definitions *****************************************************/
|
|
|
|
/* Heap Definitions **********************************************************/
|
|
/* Default heap definitions.
|
|
* The heap start immediately after the last statically allocated
|
|
* .sbss/.noinit section, and extends up to the main stack limit.
|
|
*/
|
|
PROVIDE ( _Heap_Begin = _end_noinit ) ;
|
|
PROVIDE ( _Heap_Limit = __stack - __Main_Stack_Size ) ;
|
|
/* End Heap Definitions ******************************************************/
|
|
|
|
/* Entry Point Definitions ***************************************************/
|
|
/* The entry point is informative, for debuggers and simulators,
|
|
* since the Cortex-M vector points to it anyway.
|
|
*/
|
|
ENTRY(_start);
|
|
/* End Entry Point Definitions ***********************************************/
|
|
|
|
/* Section Definitions *******************************************************/
|
|
SECTIONS
|
|
{
|
|
|
|
/* Begin Section:.isr_vector **************************************************
|
|
Description : The interrupt section for Cortex-M devices.
|
|
Location : Flash
|
|
Component : .isr_vector - The ISR vector section.
|
|
.cfmconfig - The Freescale configuration words.
|
|
.after_vectors - The startup code and ISR.
|
|
******************************************************************************/
|
|
.isr_vector : ALIGN(4)
|
|
{
|
|
FILL(0xFF)
|
|
__vectors_start = ABSOLUTE(.) ;
|
|
/* STM specific definition */
|
|
__vectors_start__ = ABSOLUTE(.) ;
|
|
KEEP(*(.isr_vector))
|
|
*(privileged_functions)
|
|
|
|
/* Non privileged code is after _Privileged_Functions_Region_Size. */
|
|
__privileged_functions_actual_end__ = .;
|
|
. = _Privileged_Functions_Region_Size;
|
|
|
|
KEEP(*(.cfmconfig))
|
|
|
|
/* This section is here for convenience, to store the
|
|
* startup code at the beginning of the flash area, hoping that
|
|
* this will increase the readability of the listing.
|
|
*/
|
|
*(.after_vectors .after_vectors.*) /* Startup code and ISR */
|
|
|
|
} >FLASH
|
|
/* End Section:.isr_vector ***************************************************/
|
|
|
|
/* Begin Section:.inits *******************************************************
|
|
Description : Memory regions initialisation arrays. There are two kinds of arrays
|
|
for each RAM region, one for data and one for bss. Each is iterrated
|
|
at startup and the region initialisation is performed.
|
|
The data array includes:
|
|
- from (LOADADDR())
|
|
- region_begin (ADDR())
|
|
- region_end (ADDR()+SIZEOF())
|
|
The bss array includes:
|
|
- region_begin (ADDR())
|
|
- region_end (ADDR()+SIZEOF())
|
|
WARNING: It is mandatory that the regions are word aligned,
|
|
since the initialisation code works only on words.
|
|
Location : Flash
|
|
Component : .data.* - The data section initialization section.
|
|
.bss.* - The bss section initialization section.
|
|
.preinit_array - The preinit code to run before constructors.
|
|
.init_array - The constructor code for global C++ objects.
|
|
.fini_array - The destructor code for global C++ objects.
|
|
******************************************************************************/
|
|
.inits : ALIGN(4)
|
|
{
|
|
/* The data array */
|
|
__data_regions_array_start = .;
|
|
LONG(LOADADDR(.data));
|
|
LONG(ADDR(.data));
|
|
LONG(ADDR(.data)+SIZEOF(.data));
|
|
__data_regions_array_end = .;
|
|
|
|
/* The bss array */
|
|
__bss_regions_array_start = .;
|
|
LONG(ADDR(.bss));
|
|
LONG(ADDR(.bss)+SIZEOF(.bss));
|
|
__bss_regions_array_end = .;
|
|
|
|
/* These are the old initialisation sections, intended to contain
|
|
* naked code, with the prologue/epilogue added by crti.o/crtn.o
|
|
* when linking with startup files. The standalone startup code
|
|
* currently does not run these, better use the init arrays below.
|
|
*/
|
|
KEEP(*(.init))
|
|
KEEP(*(.fini))
|
|
. = ALIGN(4);
|
|
|
|
/* The preinit code, i.e. an array of pointers to initialisation
|
|
* functions to be performed before constructors.
|
|
*/
|
|
PROVIDE_HIDDEN (__preinit_array_start = .);
|
|
/* Used to run the SystemInit() before anything else. */
|
|
KEEP(*(.preinit_array_sysinit .preinit_array_sysinit.*))
|
|
/* Used for other platform inits. */
|
|
KEEP(*(.preinit_array_platform .preinit_array_platform.*))
|
|
/* The application inits. If you need to enforce some order in execution, create new sections, as before. */
|
|
KEEP(*(.preinit_array .preinit_array.*))
|
|
PROVIDE_HIDDEN (__preinit_array_end = .);
|
|
. = ALIGN(4);
|
|
|
|
/* The init code, i.e. an array of pointers to static constructors. */
|
|
PROVIDE_HIDDEN (__init_array_start = .);
|
|
KEEP(*(SORT(.init_array.*)))
|
|
KEEP(*(.init_array))
|
|
PROVIDE_HIDDEN (__init_array_end = .);
|
|
. = ALIGN(4);
|
|
|
|
/* The fini code, i.e. an array of pointers to static destructors. */
|
|
PROVIDE_HIDDEN (__fini_array_start = .);
|
|
KEEP(*(SORT(.fini_array.*)))
|
|
KEEP(*(.fini_array))
|
|
PROVIDE_HIDDEN (__fini_array_end = .);
|
|
} >FLASH
|
|
/* End Section:.inits ********************************************************/
|
|
|
|
/* Begin Section:.flashtext ***************************************************
|
|
Description : For some STRx devices, the beginning of the startup code is stored
|
|
in the .flashtext section, which goes to FLASH.
|
|
Location : Flash
|
|
Component : .flashtext - The STRx devices startup code.
|
|
******************************************************************************/
|
|
.flashtext : ALIGN(4)
|
|
{
|
|
*(.flashtext .flashtext.*)
|
|
} >FLASH
|
|
/* End Section:.flashtext ****************************************************/
|
|
|
|
/* Begin Section:.text ********************************************************
|
|
Description : The program code is stored in the .text section, which goes to FLASH.
|
|
Location : Flash
|
|
Component : .text - The code segment.
|
|
.rodata.* - The reaad-only data segment.
|
|
vtable - C++ vtable segment.
|
|
******************************************************************************/
|
|
.text : ALIGN(4)
|
|
{
|
|
/* All remaining code */
|
|
*(.text .text.*)
|
|
/* Read-only data (constants) */
|
|
*(.rodata .rodata.* .constdata .constdata.*)
|
|
/* C++ virtual tables */
|
|
*(vtable)
|
|
|
|
KEEP(*(.eh_frame*))
|
|
/* Stub sections generated by the linker, to glue together
|
|
* ARM and Thumb code. .glue_7 is used for ARM code calling
|
|
* Thumb code, and .glue_7t is used for Thumb code calling
|
|
* ARM code. Apparently always generated by the linker, for some
|
|
* architectures, so better leave them here.
|
|
*/
|
|
*(.glue_7)
|
|
*(.glue_7t)
|
|
} >FLASH
|
|
/* End Section:.text *********************************************************/
|
|
|
|
/* Begin Section:.ARM.extab,.ARM.exidx ****************************************
|
|
Description : ARM magic sections. You don't need them if you don't care about unwinding
|
|
(unwinding is useful for C++ exception and for debugging).
|
|
Location : Flash
|
|
Component : .ARM.extab - The ARM external tab for unwinding.
|
|
.ARM.exidx - The ARM external index for unwinding.
|
|
******************************************************************************/
|
|
.ARM.extab : ALIGN(4)
|
|
{
|
|
*(.ARM.extab* .gnu.linkonce.armextab.*)
|
|
} >FLASH
|
|
. = ALIGN(4);
|
|
|
|
__exidx_start = .;
|
|
.ARM.exidx : ALIGN(4)
|
|
{
|
|
*(.ARM.exidx* .gnu.linkonce.armexidx.*)
|
|
} >FLASH
|
|
__exidx_end = .;
|
|
|
|
. = ALIGN(4);
|
|
_etext = .;
|
|
__etext = .;
|
|
/* End Section:.ARM.extab,.ARM.exidx *****************************************/
|
|
|
|
/* Begin Section:.data ********************************************************
|
|
Description : The main initialized data section. The program executes knowing that
|
|
the data is in the RAM but the loader puts the initial values in the
|
|
FLASH (inidata). It is one task of the startup to copy the initial
|
|
values from FLASH to RAM.
|
|
Location : RAM
|
|
Component : .data - The sections to put into the RAM.
|
|
******************************************************************************/
|
|
/* Used by the startup code to initialise the .data section */
|
|
_sidata = LOADADDR(.data);
|
|
.data : ALIGN(8192)
|
|
{
|
|
FILL(0xFF)
|
|
/* This is used by the startup code to initialise the .data section */
|
|
_sdata = . ; /* STM specific definition */
|
|
__data_start__ = . ;
|
|
|
|
*(privileged_data)
|
|
/* Non kernel data is kept out of the first _Privileged_Data_Region_Size bytes of SRAM. */
|
|
__privileged_data_actual_end__ = .;
|
|
. = _Privileged_Data_Region_Size;
|
|
|
|
*(.data_begin .data_begin.*)
|
|
*(.data .data.*)
|
|
*(.data_end .data_end.*)
|
|
. = ALIGN(4);
|
|
|
|
/* This is used by the startup code to initialise the .data section */
|
|
_edata = . ; /* STM specific definition */
|
|
__data_end__ = . ;
|
|
} >RAM AT>FLASH
|
|
/* End Section:.data *********************************************************/
|
|
|
|
/* Begin Section:.bss *********************************************************
|
|
Description : The initialised-to-0 data sections. NOLOAD is used to avoid
|
|
the "section `.bss' type changed to PROGBITS" warning. This is the
|
|
main region which is placed in RAM.
|
|
Location : RAM
|
|
Component : .bss - The sections to put into the RAM, and initialized to 0.
|
|
******************************************************************************/
|
|
.bss (NOLOAD) : ALIGN(4)
|
|
{
|
|
__bss_start__ = .; /* standard newlib definition */
|
|
_sbss = .; /* STM specific definition */
|
|
*(.bss_begin .bss_begin.*)
|
|
*(.bss .bss.*)
|
|
*(COMMON)
|
|
*(.bss_end .bss_end.*)
|
|
. = ALIGN(4);
|
|
|
|
__bss_end__ = .; /* standard newlib definition */
|
|
_ebss = . ; /* STM specific definition */
|
|
} >RAM
|
|
/* End Section:.bss **********************************************************/
|
|
|
|
/* Begin Section:.noinit ******************************************************
|
|
Description : The uninitialised data sections. NOLOAD is used to avoid
|
|
the "section `.noinit' type changed to PROGBITS" warning.
|
|
Location : RAM
|
|
Component : .noinit - The sections to put into the RAM, and not initialized.
|
|
******************************************************************************/
|
|
.noinit (NOLOAD) : ALIGN(4)
|
|
{
|
|
_noinit = .;
|
|
*(.noinit .noinit.*)
|
|
. = ALIGN(4) ;
|
|
_end_noinit = .;
|
|
} >RAM
|
|
/* Mandatory to be word aligned, _sbrk assumes this */
|
|
PROVIDE ( end = _end_noinit ); /* was _ebss */
|
|
PROVIDE ( _end = _end_noinit );
|
|
PROVIDE ( __end = _end_noinit );
|
|
PROVIDE ( __end__ = _end_noinit );
|
|
/* End Section:.noinit *******************************************************/
|
|
|
|
/* Begin Section:._check_stack ************************************************
|
|
Description : Used for validation only, do not allocate anything here!
|
|
This is just to check that there is enough RAM left for the Main
|
|
stack. It should generate an error if it's full. This stack,
|
|
in composite, is the section for kernel stack. All the component
|
|
related layouts will be in the component sections that follow.
|
|
Location : RAM
|
|
Component : Padding of size "_Minimum_Stack_Size" - The stack location.
|
|
******************************************************************************/
|
|
._check_stack : ALIGN(4)
|
|
{
|
|
. = . + _Minimum_Stack_Size ;
|
|
} >RAM
|
|
/* End Section:._check_stack *************************************************/
|
|
|
|
/* Begin Section:.eromem0 *****************************************************
|
|
Description : This section should only be used when there is external read-only
|
|
direct-executable memory, such as Quad SPI Flash, Nor Flash, etc.
|
|
(Nand flash does not count!)
|
|
When there is no such sections, this can be commented out. When this
|
|
is used, use the section attribute to explicitly place the code/data.
|
|
Location : EROMEM0
|
|
Component : .ero0text - The code section in this area.
|
|
.ero0rodata - The ro-data section in this area.
|
|
******************************************************************************/
|
|
/*
|
|
.eromem0 : ALIGN(4)
|
|
{
|
|
*(.ero0text)
|
|
*(.ero0rodata)
|
|
*(.ero0rodata.*)
|
|
} >EROMEM0
|
|
*/
|
|
/* End Section:.eromem0 ******************************************************/
|
|
|
|
/* Begin Section:.erwmem0 *****************************************************
|
|
Description : This section should only be used when there is external read-write
|
|
direct-executable memory, such as SRAM, FRAM, SDRAM, etc.
|
|
When there is no such sections, this can be commented out. When this
|
|
is used, use the section attribute to explicitly place the code/data.
|
|
This section is not initialized in the init code. Thus, this area will
|
|
not be initialized at the startup. It is the user's duty to initialize
|
|
this area manually.
|
|
Location : EROMEM0
|
|
Component : .ero0text - The code section in this area.
|
|
.ero0rodata - The ro-data section in this area.
|
|
******************************************************************************/
|
|
.erwmem0 : ALIGN(4)
|
|
{
|
|
*(.erw0text)
|
|
*(.erw0data)
|
|
} >ERWMEM0
|
|
/* End Section:.erwmem0 ******************************************************/
|
|
|
|
/* Begin Section:.debugging ***************************************************
|
|
Description : These are debuggingsections.
|
|
Location : None.
|
|
Component : None.
|
|
******************************************************************************/
|
|
/* This can remove the debugging information from the standard libraries */
|
|
/*
|
|
DISCARD :
|
|
{
|
|
libc.a ( * )
|
|
libm.a ( * )
|
|
libgcc.a ( * )
|
|
}
|
|
*/
|
|
|
|
/* Stabs debugging sections. */
|
|
.stab 0 : { *(.stab) }
|
|
.stabstr 0 : { *(.stabstr) }
|
|
.stab.excl 0 : { *(.stab.excl) }
|
|
.stab.exclstr 0 : { *(.stab.exclstr) }
|
|
.stab.index 0 : { *(.stab.index) }
|
|
.stab.indexstr 0 : { *(.stab.indexstr) }
|
|
.comment 0 : { *(.comment) }
|
|
/*
|
|
* DWARF debug sections.
|
|
* Symbols in the DWARF debugging sections are relative to the beginning
|
|
* of the section so we begin them at 0.
|
|
*/
|
|
/* DWARF 1 */
|
|
.debug 0 : { *(.debug) }
|
|
.line 0 : { *(.line) }
|
|
/* GNU DWARF 1 extensions */
|
|
.debug_srcinfo 0 : { *(.debug_srcinfo) }
|
|
.debug_sfnames 0 : { *(.debug_sfnames) }
|
|
/* DWARF 1.1 and DWARF 2 */
|
|
.debug_aranges 0 : { *(.debug_aranges) }
|
|
.debug_pubnames 0 : { *(.debug_pubnames) }
|
|
/* DWARF 2 */
|
|
.debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) }
|
|
.debug_abbrev 0 : { *(.debug_abbrev) }
|
|
.debug_line 0 : { *(.debug_line) }
|
|
.debug_frame 0 : { *(.debug_frame) }
|
|
.debug_str 0 : { *(.debug_str) }
|
|
.debug_loc 0 : { *(.debug_loc) }
|
|
.debug_macinfo 0 : { *(.debug_macinfo) }
|
|
/* SGI/MIPS DWARF 2 extensions */
|
|
.debug_weaknames 0 : { *(.debug_weaknames) }
|
|
.debug_funcnames 0 : { *(.debug_funcnames) }
|
|
.debug_typenames 0 : { *(.debug_typenames) }
|
|
.debug_varnames 0 : { *(.debug_varnames) }
|
|
/* End Section:.debugging ****************************************************/
|
|
|
|
}
|
|
/* End Section Definitions ***************************************************/
|
|
|
|
|