You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
177 lines
4.1 KiB
177 lines
4.1 KiB
/* source: gcc-arm-none-eabi-4_7-2013q1/share/gcc-arm-none-eabi/samples/ldscripts/mem.ld */ |
|
|
|
/* Linker script to configure memory regions. |
|
* Need modifying for a specific board. |
|
* FLASH.ORIGIN: starting address of flash |
|
* FLASH.LENGTH: length of flash |
|
* RAM.ORIGIN: starting address of RAM bank 0 |
|
* RAM.LENGTH: length of RAM bank 0 |
|
*/ |
|
MEMORY |
|
{ |
|
/* LPC82x User Manual Page 8 */ |
|
FLASH (rx) : ORIGIN = 0x0, LENGTH = 0x8000 /* 32K for LPC824 */ |
|
RAM (rwx) : ORIGIN = 0x10000000, LENGTH = 0x2000 /* 8K for LPC824 */ |
|
} |
|
|
|
/* source: gcc-arm-none-eabi-4_7-2013q1/share/gcc-arm-none-eabi/samples/ldscripts/sections.ld */ |
|
|
|
/* Linker script to place sections and symbol values. Should be used together |
|
* with other linker script that defines memory regions FLASH and RAM. |
|
* It references following symbols, which must be defined in code: |
|
* Reset_Handler : Entry of reset handler |
|
* |
|
* It defines following symbols, which code can use without definition: |
|
* __exidx_start |
|
* __exidx_end |
|
* __etext |
|
* __data_start__ |
|
* __preinit_array_start |
|
* __preinit_array_end |
|
* __init_array_start |
|
* __init_array_end |
|
* __fini_array_start |
|
* __fini_array_end |
|
* __data_end__ |
|
* __bss_start__ |
|
* __bss_end__ |
|
* __end__ |
|
* end |
|
* __HeapLimit |
|
* __StackLimit |
|
* __StackTop |
|
* __stack |
|
*/ |
|
|
|
/* entry point */ |
|
ENTRY(Reset_Handler) |
|
|
|
/* extern declaration so that the value appears correctly for the LPC checksum calculation */ |
|
EXTERN(NMI_Handler) |
|
EXTERN(HardFault_Handler) |
|
|
|
SECTIONS |
|
{ |
|
.text : |
|
{ |
|
KEEP(*(.isr_vector)) |
|
*(.text*) |
|
|
|
KEEP(*(.init)) |
|
KEEP(*(.fini)) |
|
|
|
/* .ctors */ |
|
*crtbegin.o(.ctors) |
|
*crtbegin?.o(.ctors) |
|
*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors) |
|
*(SORT(.ctors.*)) |
|
*(.ctors) |
|
|
|
/* .dtors */ |
|
*crtbegin.o(.dtors) |
|
*crtbegin?.o(.dtors) |
|
*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors) |
|
*(SORT(.dtors.*)) |
|
*(.dtors) |
|
|
|
*(.rodata*) |
|
|
|
KEEP(*(.eh_frame*)) |
|
} > FLASH |
|
|
|
.ARM.extab : |
|
{ |
|
*(.ARM.extab* .gnu.linkonce.armextab.*) |
|
} > FLASH |
|
|
|
__exidx_start = .; |
|
.ARM.exidx : |
|
{ |
|
*(.ARM.exidx* .gnu.linkonce.armexidx.*) |
|
} > FLASH |
|
__exidx_end = .; |
|
|
|
__etext = .; |
|
|
|
.data : AT (__etext) |
|
{ |
|
__data_start__ = .; |
|
*(vtable) |
|
*(.data*) |
|
|
|
. = ALIGN(4); |
|
/* preinit data */ |
|
PROVIDE_HIDDEN (__preinit_array_start = .); |
|
KEEP(*(.preinit_array)) |
|
PROVIDE_HIDDEN (__preinit_array_end = .); |
|
|
|
. = ALIGN(4); |
|
/* init data */ |
|
PROVIDE_HIDDEN (__init_array_start = .); |
|
KEEP(*(SORT(.init_array.*))) |
|
KEEP(*(.init_array)) |
|
PROVIDE_HIDDEN (__init_array_end = .); |
|
|
|
|
|
. = ALIGN(4); |
|
/* finit data */ |
|
PROVIDE_HIDDEN (__fini_array_start = .); |
|
KEEP(*(SORT(.fini_array.*))) |
|
KEEP(*(.fini_array)) |
|
PROVIDE_HIDDEN (__fini_array_end = .); |
|
|
|
KEEP(*(.jcr*)) |
|
. = ALIGN(4); |
|
/* All data end */ |
|
__data_end__ = .; |
|
|
|
} > RAM |
|
|
|
.bss : |
|
{ |
|
. = ALIGN(4); |
|
__bss_start__ = .; |
|
*(.bss*) |
|
*(COMMON) |
|
. = ALIGN(4); |
|
__bss_end__ = .; |
|
} > RAM |
|
|
|
.heap (COPY): |
|
{ |
|
__end__ = .; |
|
end = __end__; |
|
*(.heap*) |
|
__HeapLimit = .; |
|
} > RAM |
|
|
|
/* .stack_dummy section doesn't contains any symbols. It is only |
|
* used for linker to calculate size of stack sections, and assign |
|
* values to stack symbols later */ |
|
.stack_dummy (COPY): |
|
{ |
|
*(.stack*) |
|
} > RAM |
|
|
|
/* Set stack top to end of RAM, and stack limit move down by |
|
* size of stack_dummy section */ |
|
__StackTop = ORIGIN(RAM) + LENGTH(RAM); |
|
__StackLimit = __StackTop - SIZEOF(.stack_dummy); |
|
PROVIDE(__stack = __StackTop); |
|
|
|
/* Check if data + heap + stack exceeds RAM limit */ |
|
ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack") |
|
|
|
/* |
|
http://www.lpcware.com/content/forum/lpc1788-flash-signature-generation |
|
Section 3.5.2/page 12 of the LPC82x User Manual |
|
|
|
Linker works with even addresses, however to indicate thumb address mode, |
|
the lowest bit of the address is set to one. For the checksum calculation we |
|
only have the even addresses, however later in the isr table the compiler will |
|
store the odd addresses for the three handler subprocedures if compiled in |
|
thumb mode. Because of this, 3 is added to consider the three odd handler calls. |
|
*/ |
|
LPC_checksum = 0- (__StackTop + Reset_Handler + NMI_Handler + HardFault_Handler + 3 /* three entries */); |
|
} |
|
|
|
|