1/* Linker script to configure memory regions. */ 2 3SEARCH_DIR(.) 4GROUP(-lgcc -lc -lnosys) 5 6MEMORY 7{ 8 FLASH (rx) : ORIGIN = 0x0, LENGTH = 0x80000 9 RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x20000 10} 11 12ENTRY(Reset_Handler) 13 14SECTIONS 15{ 16 .text : 17 { 18 KEEP(*(.isr_vector)) 19 *(.text*) 20 21 KEEP(*(.init)) 22 KEEP(*(.fini)) 23 24 /* .ctors */ 25 *crtbegin.o(.ctors) 26 *crtbegin?.o(.ctors) 27 *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors) 28 *(SORT(.ctors.*)) 29 *(.ctors) 30 31 /* .dtors */ 32 *crtbegin.o(.dtors) 33 *crtbegin?.o(.dtors) 34 *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors) 35 *(SORT(.dtors.*)) 36 *(.dtors) 37 38 *(.rodata*) 39 40 KEEP(*(.eh_frame*)) 41 /* section information for finsh shell */ 42 . = ALIGN(4); 43 __fsymtab_start = .; 44 KEEP(*(FSymTab)) 45 __fsymtab_end = .; 46 47 . = ALIGN(4); 48 __vsymtab_start = .; 49 KEEP(*(VSymTab)) 50 __vsymtab_end = .; 51 52 /* section information for initial. */ 53 . = ALIGN(4); 54 __rt_init_start = .; 55 KEEP(*(SORT(.rti_fn*))) 56 __rt_init_end = .; 57 58 . = ALIGN(4); 59 60 PROVIDE(__ctors_start__ = .); 61 KEEP (*(SORT(.init_array.*))) 62 KEEP (*(.init_array)) 63 PROVIDE(__ctors_end__ = .); 64 65 } > FLASH 66 67 .ARM.extab : 68 { 69 *(.ARM.extab* .gnu.linkonce.armextab.*) 70 } > FLASH 71 72 __exidx_start = .; 73 .ARM.exidx : 74 { 75 *(.ARM.exidx* .gnu.linkonce.armexidx.*) 76 } > FLASH 77 __exidx_end = .; 78 79 __etext = .; 80 81 .data : AT (__etext) 82 { 83 __data_start__ = .; 84 *(vtable) 85 *(.data*) 86 87 . = ALIGN(4); 88 /* preinit data */ 89 PROVIDE_HIDDEN (__preinit_array_start = .); 90 KEEP(*(.preinit_array)) 91 PROVIDE_HIDDEN (__preinit_array_end = .); 92 93 . = ALIGN(4); 94 /* init data */ 95 PROVIDE_HIDDEN (__init_array_start = .); 96 KEEP(*(SORT(.init_array.*))) 97 KEEP(*(.init_array)) 98 PROVIDE_HIDDEN (__init_array_end = .); 99 100 101 . = ALIGN(4); 102 /* finit data */ 103 PROVIDE_HIDDEN (__fini_array_start = .); 104 KEEP(*(SORT(.fini_array.*))) 105 KEEP(*(.fini_array)) 106 PROVIDE_HIDDEN (__fini_array_end = .); 107 108 KEEP(*(.jcr*)) 109 . = ALIGN(4); 110 /* All data end */ 111 __data_end__ = .; 112 113 } > RAM 114 115 .bss : 116 { 117 . = ALIGN(4); 118 __bss_start__ = .; 119 *(.bss*) 120 *(COMMON) 121 . = ALIGN(4); 122 __bss_end__ = .; 123 } > RAM 124 125 .heap (COPY): 126 { 127 __HeapBase = .; 128 __end__ = .; 129 PROVIDE(end = .); 130 KEEP(*(.heap*)) 131 __HeapLimit = .; 132 } > RAM 133 134 /* .stack_dummy section doesn't contains any symbols. It is only 135 * used for linker to calculate size of stack sections, and assign 136 * values to stack symbols later */ 137 .stack_dummy (COPY): 138 { 139 KEEP(*(.stack*)) 140 } > RAM 141 142 /* Set stack top to end of RAM, and stack limit move down by 143 * size of stack_dummy section */ 144 __StackTop = ORIGIN(RAM) + LENGTH(RAM); 145 __StackLimit = __StackTop - SIZEOF(.stack_dummy); 146 PROVIDE(__stack = __StackTop); 147 148 /* Check if data + heap + stack exceeds RAM limit */ 149 ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack") 150 151 /* Check if text sections + data exceeds FLASH limit */ 152 DataInitFlashUsed = __bss_start__ - __data_start__; 153 CodeFlashUsed = __etext - ORIGIN(FLASH); 154 TotalFlashUsed = CodeFlashUsed + DataInitFlashUsed; 155 ASSERT(TotalFlashUsed <= LENGTH(FLASH), "region FLASH overflowed with .data and user data") 156 157} 158 159 160