/* | |
* Default linker script for GCC CEC1302 | |
* Based upon linker scripts from GNU ARM Eclipse plug-in | |
*/ | |
INCLUDE mem.ld | |
__SRAM_segment_end__ = ORIGIN( RAM ) + LENGTH( RAM ); | |
/* | |
* The '__stack' definition is required by crt0, do not remove it. | |
*/ | |
/* Place top of stack immediate before ROM Log | |
*__stack = ORIGIN(RAM) + LENGTH(RAM); | |
*/ | |
__stack = ORIGIN(RAM) + LENGTH(RAM); | |
_estack = __stack; | |
/* | |
* Default stack sizes. | |
* These are used by the startup in order to allocate stacks | |
* for the different modes. | |
*/ | |
__Main_Stack_Size = 2048 ; | |
PROVIDE ( _Main_Stack_Size = __Main_Stack_Size ) ; | |
__Main_Stack_Limit = __stack - __Main_Stack_Size ; | |
/*"PROVIDE" allows to easily override these values from an object file or the command line. */ | |
PROVIDE ( _Main_Stack_Limit = __Main_Stack_Limit ) ; | |
/* | |
* There will be a link error if there is not this amount of | |
* RAM free at the end. | |
*/ | |
_Minimum_Stack_Size = 1024 ; | |
/* | |
* 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 ) ; | |
/* | |
* The entry point is informative, for debuggers and simulators, | |
* since the Cortex-M vector points to it anyway. | |
*/ | |
ENTRY(_start) | |
/* Sections Definitions */ | |
SECTIONS | |
{ | |
/* | |
* For Cortex-M devices, the beginning of the startup code is stored in | |
* the .isr_vector section, which goes to ROM | |
*/ | |
.isr_vector : | |
{ | |
. = ALIGN(4); | |
_isr_vector = .; | |
KEEP(*(.isr_vector)) | |
. = ALIGN(4); | |
} >ROM | |
.text : | |
{ | |
. = ALIGN(4); | |
/* | |
* 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. | |
*/ | |
KEEP(*(.after_vectors .after_vectors.*)) /* Startup code and ISR */ | |
. = ALIGN(4); | |
/* | |
* 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 = .); | |
. = ALIGN(4); | |
. = ALIGN(4); | |
*(.text*) /* all remaining code */ | |
*(vtable) /* C++ virtual tables */ | |
} >ROM | |
.rodata : | |
{ | |
*(.rodata*) /* read-only data (constants) */ | |
} >ROM | |
.glue : | |
{ | |
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) | |
} >ROM | |
/* ARM magic sections */ | |
.ARM.extab : | |
{ | |
*(.ARM.extab* .gnu.linkonce.armextab.*) | |
} > ROM | |
__exidx_start = .; | |
.ARM.exidx : | |
{ | |
*(.ARM.exidx* .gnu.linkonce.armexidx.*) | |
} > ROM | |
__exidx_end = .; | |
. = ALIGN(4); | |
_etext = .; | |
__etext = .; | |
/* | |
* This address is used by the startup code to | |
* initialise the .data section. | |
*/ | |
_sidata = _etext; | |
/* MEMORY_ARRAY */ | |
/* | |
.ROarraySection : | |
{ | |
*(.ROarraySection .ROarraySection.*) | |
} >MEMORY_ARRAY | |
*/ | |
/* | |
* The initialised data section. | |
* The program executes knowing that the data is in the RAM | |
* but the loader puts the initial values in the ROM (inidata). | |
* It is one task of the startup to copy the initial values from | |
* ROM to RAM. | |
*/ | |
.data : AT ( _sidata ) | |
{ | |
. = ALIGN(4); | |
/* This is used by the startup code to initialise the .data section */ | |
_sdata = . ; /* STM specific definition */ | |
__data_start__ = . ; | |
*(.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 | |
/* | |
* The uninitialised data section. NOLOAD is used to avoid | |
* the "section `.bss' type changed to PROGBITS" warning | |
*/ | |
.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 | |
.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 ); | |
PROVIDE ( ROM_DATA_START = __data_start__ ); | |
/* | |
* 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. | |
*/ | |
._check_stack : | |
{ | |
. = ALIGN(4); | |
. = . + _Minimum_Stack_Size ; | |
. = ALIGN(4); | |
} >RAM | |
._check_rom_log : | |
{ | |
. = ALIGN(4); | |
/* . = . + __ROM_Log_Size ; */ | |
. = ALIGN(4); | |
} >RAM | |
/* | |
.bss_CCMRAM : ALIGN(4) | |
{ | |
*(.bss.CCMRAM .bss.CCMRAM.*) | |
} > CCMRAM | |
*/ | |
/* | |
* The ROM Bank1. | |
* The C or assembly source must explicitly place the code | |
* or data there using the "section" attribute. | |
*/ | |
/* remaining code */ | |
/* read-only data (constants) */ | |
/* | |
.b1text : | |
{ | |
*(.b1text) | |
*(.b1rodata) | |
*(.b1rodata.*) | |
} >ROMB1 | |
*/ | |
/* | |
* The EXTMEM. | |
* The C or assembly source must explicitly place the code or data there | |
* using the "section" attribute. | |
*/ | |
/* EXTMEM Bank0 */ | |
/* | |
.eb0text : | |
{ | |
*(.eb0text) | |
*(.eb0rodata) | |
*(.eb0rodata.*) | |
} >EXTMEMB0 | |
*/ | |
/* EXTMEM Bank1 */ | |
/* | |
.eb1text : | |
{ | |
*(.eb1text) | |
*(.eb1rodata) | |
*(.eb1rodata.*) | |
} >EXTMEMB1 | |
*/ | |
/* EXTMEM Bank2 */ | |
/* | |
.eb2text : | |
{ | |
*(.eb2text) | |
*(.eb2rodata) | |
*(.eb2rodata.*) | |
} >EXTMEMB2 | |
*/ | |
/* EXTMEM Bank0 */ | |
/* | |
.eb3text : | |
{ | |
*(.eb3text) | |
*(.eb3rodata) | |
*(.eb3rodata.*) | |
} >EXTMEMB3 | |
*/ | |
/* After that there are only debugging sections. */ | |
/* 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) } | |
} |