1 /******************************************************************************
\r
2 * author: Freddie Chopin, http://www.freddiechopin.info/
\r
3 * file: STM32F4xxxG_rom.ld
\r
4 * last change: 2012-03-15
\r
7 * compiler: arm-none-eabi-gcc (GNU Tools for ARM Embedded Processors) 4.6.2
\r
8 * 20110921 (release) [ARM/embedded-4_6-branch revision 182083]
\r
11 * Linker script for STM32F4xxxG chip (1MB Flash, 112kB SRAM, 16kB aux SRAM,
\r
12 * 64kB CCM RAM and 4kB backup SRAM). Only main block o SRAM (112kB) is used.
\r
13 ******************************************************************************/
\r
18 +=============================================================================+
\r
19 | format configurations
\r
20 +=============================================================================+
\r
23 OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm");
\r
27 +=============================================================================+
\r
29 +=============================================================================+
\r
32 /* Handler mode (core exceptions / interrupts) can use only main stack */
\r
33 /* Thread mode can use main stack (default) or process stack - selected in CONTROL special register */
\r
35 __main_stack_size = 2048;
\r
36 __process_stack_size = 2048;
\r
38 PROVIDE(__main_stack_size = __main_stack_size);
\r
39 PROVIDE(__process_stack_size = __process_stack_size);
\r
42 +=============================================================================+
\r
43 | available memories definitions
\r
44 +=============================================================================+
\r
49 rom (rx) : org = 0x08000000, len = 2M
\r
50 ram (rwx) : org = 0x20000000, len = 112k
\r
51 aux_ram (rwx) : org = 0x2001C000, len = 16k
\r
52 ccm_ram (rw) : org = 0x10000000, len = 64k
\r
53 bkp_ram (rwx) : org = 0x40024000, len = 4k
\r
56 __rom_start = ORIGIN(rom);
\r
57 __rom_size = LENGTH(rom);
\r
58 __rom_end = __rom_start + __rom_size;
\r
60 __ram_start = ORIGIN(ram);
\r
61 __ram_size = LENGTH(ram);
\r
62 __ram_end = __ram_start + __ram_size;
\r
64 __aux_ram_start = ORIGIN(aux_ram);
\r
65 __aux_ram_size = LENGTH(aux_ram);
\r
66 __aux_ram_end = __aux_ram_start + __aux_ram_size;
\r
68 __ccm_ram_start = ORIGIN(ccm_ram);
\r
69 __ccm_ram_size = LENGTH(ccm_ram);
\r
70 __ccm_ram_end = __ccm_ram_start + __ccm_ram_size;
\r
72 __bkp_ram_start = ORIGIN(bkp_ram);
\r
73 __bkp_ram_size = LENGTH(bkp_ram);
\r
74 __bkp_ram_end = __bkp_ram_start + __bkp_ram_size;
\r
76 PROVIDE(__rom_start = __rom_start);
\r
77 PROVIDE(__rom_size = __rom_size);
\r
78 PROVIDE(__rom_end = __rom_end);
\r
80 PROVIDE(__ram_start = __ram_start);
\r
81 PROVIDE(__ram_size = __ram_size);
\r
82 PROVIDE(__ram_end = __ram_end);
\r
84 PROVIDE(__aux_ram_start = __aux_ram_start);
\r
85 PROVIDE(__aux_ram_size = __aux_ram_size);
\r
86 PROVIDE(__aux_ram_end = __aux_ram_end);
\r
88 PROVIDE(__ccm_ram_start = __ccm_ram_start);
\r
89 PROVIDE(__ccm_ram_size = __ccm_ram_size);
\r
90 PROVIDE(__ccm_ram_end = __ccm_ram_end);
\r
92 PROVIDE(__bkp_ram_start = __bkp_ram_start);
\r
93 PROVIDE(__bkp_ram_size = __bkp_ram_size);
\r
94 PROVIDE(__bkp_ram_end = __bkp_ram_end);
\r
97 +=============================================================================+
\r
99 +=============================================================================+
\r
102 ENTRY(Reset_Handler);
\r
105 +=============================================================================+
\r
106 | put data in sections
\r
107 +=============================================================================+
\r
116 PROVIDE(__text_start = __text_start);
\r
121 *(.text .text.* .gnu.linkonce.t.*);
\r
123 *(.glue_7t .glue_7);
\r
125 *(.rodata .rodata.* .gnu.linkonce.r.*);
\r
128 *(.ARM.extab* .gnu.linkonce.armextab.*); /* exception unwinding information */
\r
130 *(.gcc_except_table); /* information used for stack unwinding during exception */
\r
132 *(.eh_frame_hdr); /* additional information about .ex_frame section */
\r
134 *(.eh_frame); /* information used for stack unwinding during exception */
\r
139 __preinit_array_start = .;
\r
140 KEEP(*(.preinit_array));
\r
142 __preinit_array_end = .;
\r
143 __init_array_start = .;
\r
144 KEEP(*(SORT(.init_array.*)));
\r
146 KEEP(*(.init_array));
\r
148 __init_array_end = .;
\r
151 __fini_array_start = .;
\r
152 KEEP(*(.fini_array));
\r
154 KEEP(*(SORT(.fini_array.*)));
\r
156 __fini_array_end = .;
\r
160 PROVIDE(__text_end = __text_end);
\r
165 PROVIDE(__exidx_start = __exidx_start);
\r
169 *(.ARM.exidx* .gnu.linkonce.armexidx.*);
\r
170 } > rom AT > rom /* index entries for section unwinding */
\r
174 PROVIDE(__exidx_end = __exidx_end);
\r
179 __data_init_start = LOADADDR (.data);
\r
180 PROVIDE(__data_init_start = __data_init_start);
\r
182 PROVIDE(__data_start = __data_start);
\r
185 *(.data .data.* .gnu.linkonce.d.*)
\r
189 PROVIDE(__data_end = __data_end);
\r
196 PROVIDE(__bss_start = __bss_start);
\r
199 *(.bss .bss.* .gnu.linkonce.b.*)
\r
205 PROVIDE(__bss_end = __bss_end);
\r
212 PROVIDE(__stack_start = __stack_start);
\r
215 __main_stack_start = .;
\r
216 PROVIDE(__main_stack_start = __main_stack_start);
\r
218 . += __main_stack_size;
\r
221 __main_stack_end = .;
\r
222 PROVIDE(__main_stack_end = __main_stack_end);
\r
225 __process_stack_start = .;
\r
226 PROVIDE(__process_stack_start = __process_stack_start);
\r
228 . += __process_stack_size;
\r
231 __process_stack_end = .;
\r
232 PROVIDE(__process_stack_end = __process_stack_end);
\r
236 PROVIDE(__stack_end = __stack_end);
\r
241 PROVIDE(__heap_start = __heap_start);
\r
244 __heap_end = __ram_end;
\r
245 PROVIDE(__heap_end = __heap_end);
\r
247 .stab 0 (NOLOAD) : { *(.stab) }
\r
248 .stabstr 0 (NOLOAD) : { *(.stabstr) }
\r
249 /* DWARF debug sections.
\r
250 * Symbols in the DWARF debugging sections are relative to the beginning
\r
251 * of the section so we begin them at 0. */
\r
253 .debug 0 : { *(.debug) }
\r
254 .line 0 : { *(.line) }
\r
255 /* GNU DWARF 1 extensions */
\r
256 .debug_srcinfo 0 : { *(.debug_srcinfo) }
\r
257 .debug_sfnames 0 : { *(.debug_sfnames) }
\r
258 /* DWARF 1.1 and DWARF 2 */
\r
259 .debug_aranges 0 : { *(.debug_aranges) }
\r
260 .debug_pubnames 0 : { *(.debug_pubnames) }
\r
262 .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) }
\r
263 .debug_abbrev 0 : { *(.debug_abbrev) }
\r
264 .debug_line 0 : { *(.debug_line) }
\r
265 .debug_frame 0 : { *(.debug_frame) }
\r
266 .debug_str 0 : { *(.debug_str) }
\r
267 .debug_loc 0 : { *(.debug_loc) }
\r
268 .debug_macinfo 0 : { *(.debug_macinfo) }
\r
269 /* SGI/MIPS DWARF 2 extensions */
\r
270 .debug_weaknames 0 : { *(.debug_weaknames) }
\r
271 .debug_funcnames 0 : { *(.debug_funcnames) }
\r
272 .debug_typenames 0 : { *(.debug_typenames) }
\r
273 .debug_varnames 0 : { *(.debug_varnames) }
\r
275 .note.gnu.arm.ident 0 : { KEEP(*(.note.gnu.arm.ident)) }
\r
276 .ARM.attributes 0 : { KEEP(*(.ARM.attributes)) }
\r
277 /DISCARD/ : { *(.note.GNU-stack) }
\r
280 PROVIDE(__text_size = __text_end - __text_start);
\r
281 PROVIDE(__exidx_size = __exidx_end - __exidx_start);
\r
282 PROVIDE(__data_size = __data_end - __data_start);
\r
283 PROVIDE(__bss_size = __bss_end - __bss_start);
\r
284 PROVIDE(__stack_size = __stack_end - __stack_start);
\r
285 PROVIDE(__heap_size = __heap_end - __heap_start);
\r
287 /******************************************************************************
\r
289 ******************************************************************************/
\r