1*150812a8SEvalZero/* Linker script for Nordic Semiconductor nRF devices 2*150812a8SEvalZero * 3*150812a8SEvalZero * Version: Sourcery G++ 4.5-1 4*150812a8SEvalZero * Support: https://support.codesourcery.com/GNUToolchain/ 5*150812a8SEvalZero * 6*150812a8SEvalZero * Copyright (c) 2007, 2008, 2009, 2010 CodeSourcery, Inc. 7*150812a8SEvalZero * 8*150812a8SEvalZero * The authors hereby grant permission to use, copy, modify, distribute, 9*150812a8SEvalZero * and license this software and its documentation for any purpose, provided 10*150812a8SEvalZero * that existing copyright notices are retained in all copies and that this 11*150812a8SEvalZero * notice is included verbatim in any distributions. No written agreement, 12*150812a8SEvalZero * license, or royalty fee is required for any of the authorized uses. 13*150812a8SEvalZero * Modifications to this software may be copyrighted by their authors 14*150812a8SEvalZero * and need not follow the licensing terms described here, provided that 15*150812a8SEvalZero * the new terms are clearly indicated on the first page of each file where 16*150812a8SEvalZero * they apply. 17*150812a8SEvalZero */ 18*150812a8SEvalZeroOUTPUT_FORMAT ("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") 19*150812a8SEvalZero 20*150812a8SEvalZero/* Linker script to place sections and symbol values. Should be used together 21*150812a8SEvalZero * with other linker script that defines memory regions FLASH and RAM. 22*150812a8SEvalZero * It references following symbols, which must be defined in code: 23*150812a8SEvalZero * Reset_Handler : Entry of reset handler 24*150812a8SEvalZero * 25*150812a8SEvalZero * It defines following symbols, which code can use without definition: 26*150812a8SEvalZero * __exidx_start 27*150812a8SEvalZero * __exidx_end 28*150812a8SEvalZero * __etext 29*150812a8SEvalZero * __data_start__ 30*150812a8SEvalZero * __preinit_array_start 31*150812a8SEvalZero * __preinit_array_end 32*150812a8SEvalZero * __init_array_start 33*150812a8SEvalZero * __init_array_end 34*150812a8SEvalZero * __fini_array_start 35*150812a8SEvalZero * __fini_array_end 36*150812a8SEvalZero * __data_end__ 37*150812a8SEvalZero * __bss_start__ 38*150812a8SEvalZero * __bss_end__ 39*150812a8SEvalZero * __end__ 40*150812a8SEvalZero * end 41*150812a8SEvalZero * __HeapBase 42*150812a8SEvalZero * __HeapLimit 43*150812a8SEvalZero * __StackLimit 44*150812a8SEvalZero * __StackTop 45*150812a8SEvalZero * __stack 46*150812a8SEvalZero */ 47*150812a8SEvalZeroENTRY(Reset_Handler) 48*150812a8SEvalZero 49*150812a8SEvalZeroSECTIONS 50*150812a8SEvalZero{ 51*150812a8SEvalZero .text : 52*150812a8SEvalZero { 53*150812a8SEvalZero KEEP(*(.isr_vector)) 54*150812a8SEvalZero *(.text*) 55*150812a8SEvalZero 56*150812a8SEvalZero KEEP(*(.init)) 57*150812a8SEvalZero KEEP(*(.fini)) 58*150812a8SEvalZero 59*150812a8SEvalZero /* .ctors */ 60*150812a8SEvalZero *crtbegin.o(.ctors) 61*150812a8SEvalZero *crtbegin?.o(.ctors) 62*150812a8SEvalZero *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors) 63*150812a8SEvalZero *(SORT(.ctors.*)) 64*150812a8SEvalZero *(.ctors) 65*150812a8SEvalZero 66*150812a8SEvalZero /* .dtors */ 67*150812a8SEvalZero *crtbegin.o(.dtors) 68*150812a8SEvalZero *crtbegin?.o(.dtors) 69*150812a8SEvalZero *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors) 70*150812a8SEvalZero *(SORT(.dtors.*)) 71*150812a8SEvalZero *(.dtors) 72*150812a8SEvalZero 73*150812a8SEvalZero *(.rodata*) 74*150812a8SEvalZero 75*150812a8SEvalZero KEEP(*(.eh_frame*)) 76*150812a8SEvalZero } > FLASH 77*150812a8SEvalZero 78*150812a8SEvalZero .ARM.extab : 79*150812a8SEvalZero { 80*150812a8SEvalZero *(.ARM.extab* .gnu.linkonce.armextab.*) 81*150812a8SEvalZero } > FLASH 82*150812a8SEvalZero 83*150812a8SEvalZero __exidx_start = .; 84*150812a8SEvalZero .ARM.exidx : 85*150812a8SEvalZero { 86*150812a8SEvalZero *(.ARM.exidx* .gnu.linkonce.armexidx.*) 87*150812a8SEvalZero } > FLASH 88*150812a8SEvalZero __exidx_end = .; 89*150812a8SEvalZero 90*150812a8SEvalZero __etext = .; 91*150812a8SEvalZero 92*150812a8SEvalZero .data : AT (__etext) 93*150812a8SEvalZero { 94*150812a8SEvalZero __data_start__ = .; 95*150812a8SEvalZero *(vtable) 96*150812a8SEvalZero *(.data*) 97*150812a8SEvalZero 98*150812a8SEvalZero . = ALIGN(4); 99*150812a8SEvalZero /* preinit data */ 100*150812a8SEvalZero PROVIDE_HIDDEN (__preinit_array_start = .); 101*150812a8SEvalZero KEEP(*(.preinit_array)) 102*150812a8SEvalZero PROVIDE_HIDDEN (__preinit_array_end = .); 103*150812a8SEvalZero 104*150812a8SEvalZero . = ALIGN(4); 105*150812a8SEvalZero /* init data */ 106*150812a8SEvalZero PROVIDE_HIDDEN (__init_array_start = .); 107*150812a8SEvalZero KEEP(*(SORT(.init_array.*))) 108*150812a8SEvalZero KEEP(*(.init_array)) 109*150812a8SEvalZero PROVIDE_HIDDEN (__init_array_end = .); 110*150812a8SEvalZero 111*150812a8SEvalZero 112*150812a8SEvalZero . = ALIGN(4); 113*150812a8SEvalZero /* finit data */ 114*150812a8SEvalZero PROVIDE_HIDDEN (__fini_array_start = .); 115*150812a8SEvalZero KEEP(*(SORT(.fini_array.*))) 116*150812a8SEvalZero KEEP(*(.fini_array)) 117*150812a8SEvalZero PROVIDE_HIDDEN (__fini_array_end = .); 118*150812a8SEvalZero 119*150812a8SEvalZero KEEP(*(.jcr*)) 120*150812a8SEvalZero . = ALIGN(4); 121*150812a8SEvalZero /* All data end */ 122*150812a8SEvalZero __data_end__ = .; 123*150812a8SEvalZero 124*150812a8SEvalZero } > RAM 125*150812a8SEvalZero 126*150812a8SEvalZero .bss : 127*150812a8SEvalZero { 128*150812a8SEvalZero . = ALIGN(4); 129*150812a8SEvalZero __bss_start__ = .; 130*150812a8SEvalZero *(.bss*) 131*150812a8SEvalZero *(COMMON) 132*150812a8SEvalZero . = ALIGN(4); 133*150812a8SEvalZero __bss_end__ = .; 134*150812a8SEvalZero } > RAM 135*150812a8SEvalZero 136*150812a8SEvalZero .heap (COPY): 137*150812a8SEvalZero { 138*150812a8SEvalZero __HeapBase = .; 139*150812a8SEvalZero __end__ = .; 140*150812a8SEvalZero PROVIDE(end = .); 141*150812a8SEvalZero KEEP(*(.heap*)) 142*150812a8SEvalZero __HeapLimit = .; 143*150812a8SEvalZero } > RAM 144*150812a8SEvalZero 145*150812a8SEvalZero /* .stack_dummy section doesn't contains any symbols. It is only 146*150812a8SEvalZero * used for linker to calculate size of stack sections, and assign 147*150812a8SEvalZero * values to stack symbols later */ 148*150812a8SEvalZero .stack_dummy (COPY): 149*150812a8SEvalZero { 150*150812a8SEvalZero KEEP(*(.stack*)) 151*150812a8SEvalZero } > RAM 152*150812a8SEvalZero 153*150812a8SEvalZero /* Set stack top to end of RAM, and stack limit move down by 154*150812a8SEvalZero * size of stack_dummy section */ 155*150812a8SEvalZero __StackTop = ORIGIN(RAM) + LENGTH(RAM); 156*150812a8SEvalZero __StackLimit = __StackTop - SIZEOF(.stack_dummy); 157*150812a8SEvalZero PROVIDE(__stack = __StackTop); 158*150812a8SEvalZero 159*150812a8SEvalZero /* Check if data + heap + stack exceeds RAM limit */ 160*150812a8SEvalZero ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack") 161*150812a8SEvalZero 162*150812a8SEvalZero /* Check if text sections + data exceeds FLASH limit */ 163*150812a8SEvalZero DataInitFlashUsed = __bss_start__ - __data_start__; 164*150812a8SEvalZero CodeFlashUsed = __etext - ORIGIN(FLASH); 165*150812a8SEvalZero TotalFlashUsed = CodeFlashUsed + DataInitFlashUsed; 166*150812a8SEvalZero ASSERT(TotalFlashUsed <= LENGTH(FLASH), "region FLASH overflowed with .data and user data") 167*150812a8SEvalZero 168*150812a8SEvalZero} 169