/* * Copyright 2010 - 2012 Michael Ossmann * * This file is part of HackRF * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, * Boston, MA 02110-1301, USA. */ OUTPUT_FORMAT ("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") ENTRY(_start) SEARCH_DIR(.) GROUP(libgcc.a libc.a libm.a libnosys.a) MEMORY { /* * Our code is installed in SPIFI at 0x80000000 (and copied to RAM at * 0x10000000 by the bootloader?), but it is addressed through the 256M * shadow area at 0x00000000. */ shadow (rx) : ORIGIN = 0x00000000, LENGTH = 1M ram (rwx) : ORIGIN = 0x10000000, LENGTH = 128K /* there are some additional RAM regions */ } /* * much copied from: Linker script for Cortex-M3 * * Version:CodeSourcery Sourcery G++ Lite 2007q3-53 * BugURL:https://support.codesourcery.com/GNUToolchain/ * * Copyright 2007 CodeSourcery. * * The authors hereby grant permission to use, copy, modify, distribute, * and license this software and its documentation for any purpose, provided * that existing copyright notices are retained in all copies and that this * notice is included verbatim in any distributions. No written agreement, * license, or royalty fee is required for any of the authorized uses. * Modifications to this software may be copyrighted by their authors * and need not follow the licensing terms described here, provided that * the new terms are clearly indicated on the first page of each file where * they apply. */ EXTERN(Reset_Handler) ENTRY(Reset_Handler) SECTIONS { .text : { . = ALIGN(0x400); /* Ensure that vector table is aligned as hardware requires. */ _interrupt_vector_table = .; KEEP(*(.irq_handler_table)) *(.text .text.* .gnu.linkonce.t.*) *(.rodata .rodata.* .gnu.linkonce.r.*) *(.eh_frame_hdr) *(.eh_frame) . = ALIGN(4); KEEP(*(.init)) . = ALIGN(4); __preinit_array_start = .; KEEP (*(.preinit_array)) __preinit_array_end = .; . = ALIGN(4); __init_array_start = .; KEEP (*(SORT(.init_array.*))) KEEP (*(.init_array)) __init_array_end = .; . = ALIGN(0x4); KEEP (*crtbegin.o(.ctors)) KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors)) KEEP (*(SORT(.ctors.*))) KEEP (*crtend.o(.ctors)) . = ALIGN(4); KEEP(*(.fini)) . = ALIGN(4); __fini_array_start = .; KEEP (*(.fini_array)) KEEP (*(SORT(.fini_array.*))) __fini_array_end = .; KEEP (*crtbegin.o(.dtors)) KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors)) KEEP (*(SORT(.dtors.*))) KEEP (*crtend.o(.dtors)) . = ALIGN(8); _etext = .; } > shadow .ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } > shadow __exidx_start = .; .ARM.exidx : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) } > shadow __exidx_end = .; _etext = .; .data : { _data = .; *(vtable) *(.data*) _edata = .; } > ram AT>shadow /* zero initialized data */ .bss : { _bss = .; __bss_start__ = .; *(.bss*) *(COMMON) _ebss = .; __bss_end__ = .; } > ram /* Where we put the heap with cr_clib */ .cr_heap : { end = .; __end__ = .; _pvHeapStart = .; } > ram /* Leave room above stack for IAP to run */ _StackTop = ORIGIN(ram) + LENGTH(ram) - 32; }