1/* 2 * Copyright (c) 2006-2022, RT-Thread Development Team 3 * 4 * SPDX-License-Identifier: Apache-2.0 5 * 6 * Change Logs: 7 * Date Author Notes 8 * 2011-12-08 onelife Initial creation for EFM3 giant gecko support 9 * 2012-05-15 onelife Modified to compatible with CMSIS v3 10 */ 11 12MEMORY 13{ 14 FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 1048576 15 RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 131072 16} 17_system_stack_size = 0x200; 18 19/* Linker script to place sections and symbol values. Should be used together 20 * with other linker script that defines memory regions FLASH and RAM. 21 * It references following symbols, which must be defined in code: 22 * Reset_Handler : Entry of reset handler 23 * 24 * It defines following symbols, which code can use without definition: 25 * __exidx_start 26 * __exidx_end 27 * __etext 28 * __data_start__ 29 * __preinit_array_start 30 * __preinit_array_end 31 * __init_array_start 32 * __init_array_end 33 * __fini_array_start 34 * __fini_array_end 35 * __data_end__ 36 * __bss_start__ 37 * __bss_end__ 38 * __end__ 39 * end 40 * __HeapLimit 41 * __StackLimit 42 * __StackTop 43 * __stack 44 */ 45ENTRY(Reset_Handler) 46 47SECTIONS 48{ 49 .text : 50 { 51 KEEP(*(.isr_vector)) 52 *(.text*) 53 54 KEEP(*(.init)) 55 KEEP(*(.fini)) 56 57 /* .ctors */ 58 *crtbegin.o(.ctors) 59 *crtbegin?.o(.ctors) 60 *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors) 61 *(SORT(.ctors.*)) 62 *(.ctors) 63 64 /* .dtors */ 65 *crtbegin.o(.dtors) 66 *crtbegin?.o(.dtors) 67 *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors) 68 *(SORT(.dtors.*)) 69 *(.dtors) 70 71 *(.rodata*) 72 73 KEEP(*(.eh_frame*)) 74 75 /* section information for finsh shell */ 76 . = ALIGN(4); 77 __fsymtab_start = .; 78 KEEP(*(FSymTab)) 79 __fsymtab_end = .; 80 . = ALIGN(4); 81 __vsymtab_start = .; 82 KEEP(*(VSymTab)) 83 __vsymtab_end = .; 84 } > FLASH = 0 85 86 .ARM.extab : 87 { 88 *(.ARM.extab* .gnu.linkonce.armextab.*) 89 } > FLASH 90 91 __exidx_start = .; 92 .ARM.exidx : 93 { 94 *(.ARM.exidx* .gnu.linkonce.armexidx.*) 95 } > FLASH 96 __exidx_end = .; 97 98 __etext = .; 99 100 .data : AT (__etext) 101 { 102 __data_start__ = .; 103 *(vtable) 104 *(.data*) 105 *(.ram) 106 107 . = ALIGN(4); 108 /* preinit data */ 109 PROVIDE_HIDDEN (__preinit_array_start = .); 110 KEEP(*(.preinit_array)) 111 PROVIDE_HIDDEN (__preinit_array_end = .); 112 113 . = ALIGN(4); 114 /* init data */ 115 PROVIDE_HIDDEN (__init_array_start = .); 116 KEEP(*(SORT(.init_array.*))) 117 KEEP(*(.init_array)) 118 PROVIDE_HIDDEN (__init_array_end = .); 119 120 121 . = ALIGN(4); 122 /* finit data */ 123 PROVIDE_HIDDEN (__fini_array_start = .); 124 KEEP(*(SORT(.fini_array.*))) 125 KEEP(*(.fini_array)) 126 PROVIDE_HIDDEN (__fini_array_end = .); 127 128 . = ALIGN(4); 129 /* All data end */ 130 __data_end__ = .; 131 132 } > RAM 133 134 .bss : 135 { 136 __bss_start__ = .; 137 *(.bss*) 138 *(COMMON) 139 __bss_end__ = .; 140 } > RAM 141 142 .heap : 143 { 144 __end__ = .; 145 end = __end__; 146 _end = __end__; 147 *(.heap*) 148 __HeapLimit = .; 149 } > RAM 150 151 /* .stack_dummy section doesn't contains any symbols. It is only 152 * used for linker to calculate size of stack sections, and assign 153 * values to stack symbols later */ 154 .stack_dummy : 155 { 156 *(.stack) 157 } > RAM 158 159 /* Set stack top to end of RAM, and stack limit move down by 160 * size of stack_dummy section */ 161 __StackTop = ORIGIN(RAM) + LENGTH(RAM); 162 __StackLimit = __StackTop - SIZEOF(.stack_dummy); 163 PROVIDE(__stack = __StackTop); 164 165 /* Check if data + heap + stack exceeds RAM limit */ 166 ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack") 167} 168