1/* Linker script to configure memory regions. */ 2 3SEARCH_DIR(.) 4GROUP(-lgcc -lc -lnosys) 5 6MEMORY 7{ 8 FLASH (rx) : ORIGIN = 0x0, LENGTH = 0x100000 9 RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x80000 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 .nrf_queue : 68 { 69 PROVIDE(__start_nrf_queue = .); 70 KEEP(*(.nrf_balloc)) 71 PROVIDE(__stop_nrf_queue = .); 72 } > FLASH 73 74 .ARM.extab : 75 { 76 *(.ARM.extab* .gnu.linkonce.armextab.*) 77 } > FLASH 78 79 __exidx_start = .; 80 .ARM.exidx : 81 { 82 *(.ARM.exidx* .gnu.linkonce.armexidx.*) 83 } > FLASH 84 __exidx_end = .; 85 86 __etext = .; 87 88 .data : AT (__etext) 89 { 90 __data_start__ = .; 91 *(vtable) 92 *(.data*) 93 94 . = ALIGN(4); 95 /* preinit data */ 96 PROVIDE_HIDDEN (__preinit_array_start = .); 97 KEEP(*(.preinit_array)) 98 PROVIDE_HIDDEN (__preinit_array_end = .); 99 100 . = ALIGN(4); 101 /* init data */ 102 PROVIDE_HIDDEN (__init_array_start = .); 103 KEEP(*(SORT(.init_array.*))) 104 KEEP(*(.init_array)) 105 PROVIDE_HIDDEN (__init_array_end = .); 106 107 108 . = ALIGN(4); 109 /* finit data */ 110 PROVIDE_HIDDEN (__fini_array_start = .); 111 KEEP(*(SORT(.fini_array.*))) 112 KEEP(*(.fini_array)) 113 PROVIDE_HIDDEN (__fini_array_end = .); 114 115 KEEP(*(.jcr*)) 116 . = ALIGN(4); 117 /* All data end */ 118 __data_end__ = .; 119 120 } > RAM 121 122 .bss : 123 { 124 . = ALIGN(4); 125 __bss_start__ = .; 126 *(.bss*) 127 *(COMMON) 128 . = ALIGN(4); 129 __bss_end__ = .; 130 } > RAM 131 132 .heap (COPY): 133 { 134 __HeapBase = .; 135 __end__ = .; 136 PROVIDE(end = .); 137 KEEP(*(.heap*)) 138 __HeapLimit = .; 139 } > RAM 140 141 /* .stack_dummy section doesn't contains any symbols. It is only 142 * used for linker to calculate size of stack sections, and assign 143 * values to stack symbols later */ 144 .stack_dummy (COPY): 145 { 146 KEEP(*(.stack*)) 147 } > RAM 148 149 /* Set stack top to end of RAM, and stack limit move down by 150 * size of stack_dummy section */ 151 __StackTop = ORIGIN(RAM) + LENGTH(RAM); 152 __StackLimit = __StackTop - SIZEOF(.stack_dummy); 153 PROVIDE(__stack = __StackTop); 154 155 /* Check if data + heap + stack exceeds RAM limit */ 156 ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack") 157 158 /* Check if text sections + data exceeds FLASH limit */ 159 DataInitFlashUsed = __bss_start__ - __data_start__; 160 CodeFlashUsed = __etext - ORIGIN(FLASH); 161 TotalFlashUsed = CodeFlashUsed + DataInitFlashUsed; 162 ASSERT(TotalFlashUsed <= LENGTH(FLASH), "region FLASH overflowed with .data and user data") 163 164} 165 166 167