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