|
@@ -0,0 +1,172 @@
|
|
|
+/***************************************************************************//**
|
|
|
+ * @file efm32_rom_gg.ld
|
|
|
+ * @brief Linker script for EFM32 giant gecko
|
|
|
+ * COPYRIGHT (C) 2012, RT-Thread Development Team
|
|
|
+ * @author onelife
|
|
|
+ * @version 1.0
|
|
|
+ *******************************************************************************
|
|
|
+ * @section License
|
|
|
+ * The license and distribution terms for this file may be found in the file
|
|
|
+ * LICENSE in this distribution or at http://www.rt-thread.org/license/LICENSE
|
|
|
+ *******************************************************************************
|
|
|
+ * @section Change Logs
|
|
|
+ * Date Author Notes
|
|
|
+ * 2011-12-08 onelife Initial creation for EFM3 giant gecko support
|
|
|
+ * 2012-05-15 onelife Modified to compatible with CMSIS v3
|
|
|
+ ******************************************************************************/
|
|
|
+MEMORY
|
|
|
+{
|
|
|
+ FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 1048576
|
|
|
+ RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 131072
|
|
|
+}
|
|
|
+_system_stack_size = 0x200;
|
|
|
+
|
|
|
+/* 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*))
|
|
|
+
|
|
|
+ /* section information for finsh shell */
|
|
|
+ . = ALIGN(4);
|
|
|
+ __fsymtab_start = .;
|
|
|
+ KEEP(*(FSymTab))
|
|
|
+ __fsymtab_end = .;
|
|
|
+ . = ALIGN(4);
|
|
|
+ __vsymtab_start = .;
|
|
|
+ KEEP(*(VSymTab))
|
|
|
+ __vsymtab_end = .;
|
|
|
+ } > FLASH = 0
|
|
|
+
|
|
|
+ .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*)
|
|
|
+ *(.ram)
|
|
|
+
|
|
|
+ . = 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 = .);
|
|
|
+
|
|
|
+ . = ALIGN(4);
|
|
|
+ /* All data end */
|
|
|
+ __data_end__ = .;
|
|
|
+
|
|
|
+ } > RAM
|
|
|
+
|
|
|
+ .bss :
|
|
|
+ {
|
|
|
+ __bss_start__ = .;
|
|
|
+ *(.bss*)
|
|
|
+ *(COMMON)
|
|
|
+ __bss_end__ = .;
|
|
|
+ } > RAM
|
|
|
+
|
|
|
+ .heap :
|
|
|
+ {
|
|
|
+ __end__ = .;
|
|
|
+ end = __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);
|
|
|
+
|
|
|
+ /* Check if data + heap + stack exceeds RAM limit */
|
|
|
+ ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
|
|
|
+}
|