| /* Linker script for mbed LPC1768 */ | |
| GROUP(-lstdc++ -lsupc++ -lm -lc -lnosys -lgcc) | |
| /* Linker script to configure memory regions. */ | |
| MEMORY | |
| { | |
| FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 512K | |
| RAM (rwx) : ORIGIN = 0x100000C8, LENGTH = 0x7F38 | |
| USB_RAM(rwx) : ORIGIN = 0x2007C000, LENGTH = 16K | |
| ETH_RAM(rwx) : ORIGIN = 0x20080000, LENGTH = 16K | |
| } | |
| /* 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(Reset_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 (__preinit_array_start = .); | |
| KEEP(*(.preinit_array)) | |
| PROVIDE (__preinit_array_end = .); | |
| . = ALIGN(4); | |
| /* init data */ | |
| PROVIDE (__init_array_start = .); | |
| KEEP(*(SORT(.init_array.*))) | |
| KEEP(*(.init_array)) | |
| PROVIDE (__init_array_end = .); | |
| . = ALIGN(4); | |
| /* finit data */ | |
| PROVIDE (__fini_array_start = .); | |
| KEEP(*(SORT(.fini_array.*))) | |
| KEEP(*(.fini_array)) | |
| PROVIDE (__fini_array_end = .); | |
| . = ALIGN(4); | |
| /* All data end */ | |
| __data_end__ = .; | |
| } > RAM | |
| .bss : | |
| { | |
| __bss_start__ = .; | |
| *(.bss*) | |
| *(COMMON) | |
| __bss_end__ = .; | |
| Image$$RW_IRAM1$$ZI$$Limit = . ; | |
| } > RAM | |
| .heap : | |
| { | |
| __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 : | |
| { | |
| *(.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); | |
| PROVIDE(__heapLimit = __HeapLimit); | |
| PROVIDE(__stackSize = __StackTop - __HeapLimit); | |
| /* Area of memory, heap and stack, to fill on startup - 8 bytes at a time. */ | |
| __FillStart = ALIGN(__end__, 8); | |
| /* Check if data + heap + stack exceeds RAM limit */ | |
| ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack") | |
| /* Code can explicitly ask for data to be | |
| placed in these higher RAM banks where | |
| they will be left uninitialized. | |
| */ | |
| .AHBSRAM0 (NOLOAD): | |
| { | |
| Image$$RW_IRAM2$$Base = . ; | |
| PROVIDE(__AHB0_block_start = .); | |
| *(AHBSRAM0) | |
| Image$$RW_IRAM2$$ZI$$Limit = .; | |
| PROVIDE(__AHB0_dyn_start = .); | |
| PROVIDE(__AHB0_end = ORIGIN(USB_RAM) + LENGTH(USB_RAM)); | |
| } > USB_RAM | |
| .AHBSRAM1 (NOLOAD): | |
| { | |
| Image$$RW_IRAM3$$Base = . ; | |
| PROVIDE(__AHB1_block_start = .); | |
| *(AHBSRAM1) | |
| Image$$RW_IRAM3$$ZI$$Limit = .; | |
| PROVIDE(__AHB1_dyn_start = .); | |
| PROVIDE(__AHB1_end = ORIGIN(ETH_RAM) + LENGTH(ETH_RAM)); | |
| } > ETH_RAM | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment