|
@@ -0,0 +1,159 @@
|
|
|
|
|
+MEMORY
|
|
|
|
|
+{
|
|
|
|
|
+ FLASH(rx) : ORIGIN = 0x10000000, LENGTH = 2048k
|
|
|
|
|
+ RAM(rwx) : ORIGIN = 0x20000000, LENGTH = 240k /* Leave space for pico-debug */
|
|
|
|
|
+ SCRATCH_X(rwx) : ORIGIN = 0x20040000, LENGTH = 4k
|
|
|
|
|
+ SCRATCH_Y(rwx) : ORIGIN = 0x20041000, LENGTH = 4k
|
|
|
|
|
+}
|
|
|
|
|
+ENTRY(_entry_point)
|
|
|
|
|
+SECTIONS
|
|
|
|
|
+{
|
|
|
|
|
+ .flash_begin : {
|
|
|
|
|
+ __flash_binary_start = .;
|
|
|
|
|
+ } > FLASH
|
|
|
|
|
+ .boot2 : {
|
|
|
|
|
+ __boot2_start__ = .;
|
|
|
|
|
+ KEEP (*(.boot2))
|
|
|
|
|
+ __boot2_end__ = .;
|
|
|
|
|
+ } > FLASH
|
|
|
|
|
+ ASSERT(__boot2_end__ - __boot2_start__ == 256,
|
|
|
|
|
+ "ERROR: Pico second stage bootloader must be 256 bytes in size")
|
|
|
|
|
+ .text : {
|
|
|
|
|
+ __logical_binary_start = .;
|
|
|
|
|
+ KEEP (*(.vectors))
|
|
|
|
|
+ KEEP (*(.binary_info_header))
|
|
|
|
|
+ __binary_info_header_end = .;
|
|
|
|
|
+ KEEP (*(.reset))
|
|
|
|
|
+ KEEP (*(.init))
|
|
|
|
|
+ *(.fini)
|
|
|
|
|
+ *crtbegin.o(.ctors)
|
|
|
|
|
+ *crtbegin?.o(.ctors)
|
|
|
|
|
+ *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
|
|
|
|
|
+ *(SORT(.ctors.*))
|
|
|
|
|
+ *(.ctors)
|
|
|
|
|
+ *crtbegin.o(.dtors)
|
|
|
|
|
+ *crtbegin?.o(.dtors)
|
|
|
|
|
+ *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
|
|
|
|
|
+ *(SORT(.dtors.*))
|
|
|
|
|
+ *(.dtors)
|
|
|
|
|
+ *(.eh_frame*)
|
|
|
|
|
+ . = ALIGN(4);
|
|
|
|
|
+ *(.text)
|
|
|
|
|
+ *(.text*)
|
|
|
|
|
+ } > FLASH
|
|
|
|
|
+ .rodata : {
|
|
|
|
|
+ . = ALIGN(4);
|
|
|
|
|
+ *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.flashdata*)))
|
|
|
|
|
+ *(.rodata)
|
|
|
|
|
+ *(.rodata*)
|
|
|
|
|
+ . = ALIGN(4);
|
|
|
|
|
+ } > FLASH
|
|
|
|
|
+ .ARM.extab :
|
|
|
|
|
+ {
|
|
|
|
|
+ *(.ARM.extab* .gnu.linkonce.armextab.*)
|
|
|
|
|
+ } > FLASH
|
|
|
|
|
+ __exidx_start = .;
|
|
|
|
|
+ .ARM.exidx :
|
|
|
|
|
+ {
|
|
|
|
|
+ *(.ARM.exidx* .gnu.linkonce.armexidx.*)
|
|
|
|
|
+ } > FLASH
|
|
|
|
|
+ __exidx_end = .;
|
|
|
|
|
+ . = ALIGN(4);
|
|
|
|
|
+ __binary_info_start = .;
|
|
|
|
|
+ .binary_info :
|
|
|
|
|
+ {
|
|
|
|
|
+ KEEP(*(.binary_info.keep.*))
|
|
|
|
|
+ *(.binary_info.*)
|
|
|
|
|
+ } > FLASH
|
|
|
|
|
+ __binary_info_end = .;
|
|
|
|
|
+ . = ALIGN(4);
|
|
|
|
|
+ __etext = .;
|
|
|
|
|
+ .ram_vector_table (COPY): {
|
|
|
|
|
+ *(.ram_vector_table)
|
|
|
|
|
+ } > RAM
|
|
|
|
|
+ .data : {
|
|
|
|
|
+ __data_start__ = .;
|
|
|
|
|
+ *(vtable)
|
|
|
|
|
+ *(.time_critical*)
|
|
|
|
|
+ . = ALIGN(4);
|
|
|
|
|
+ *(.data*)
|
|
|
|
|
+ . = ALIGN(4);
|
|
|
|
|
+ *(.after_data.*)
|
|
|
|
|
+ . = ALIGN(4);
|
|
|
|
|
+ PROVIDE_HIDDEN (__mutex_array_start = .);
|
|
|
|
|
+ KEEP(*(SORT(.mutex_array.*)))
|
|
|
|
|
+ KEEP(*(.mutex_array))
|
|
|
|
|
+ PROVIDE_HIDDEN (__mutex_array_end = .);
|
|
|
|
|
+ . = ALIGN(4);
|
|
|
|
|
+ PROVIDE_HIDDEN (__preinit_array_start = .);
|
|
|
|
|
+ KEEP(*(SORT(.preinit_array.*)))
|
|
|
|
|
+ KEEP(*(.preinit_array))
|
|
|
|
|
+ PROVIDE_HIDDEN (__preinit_array_end = .);
|
|
|
|
|
+ . = ALIGN(4);
|
|
|
|
|
+ PROVIDE_HIDDEN (__init_array_start = .);
|
|
|
|
|
+ KEEP(*(SORT(.init_array.*)))
|
|
|
|
|
+ KEEP(*(.init_array))
|
|
|
|
|
+ PROVIDE_HIDDEN (__init_array_end = .);
|
|
|
|
|
+ . = ALIGN(4);
|
|
|
|
|
+ PROVIDE_HIDDEN (__fini_array_start = .);
|
|
|
|
|
+ *(SORT(.fini_array.*))
|
|
|
|
|
+ *(.fini_array)
|
|
|
|
|
+ PROVIDE_HIDDEN (__fini_array_end = .);
|
|
|
|
|
+ *(.jcr)
|
|
|
|
|
+ . = ALIGN(4);
|
|
|
|
|
+ __data_end__ = .;
|
|
|
|
|
+ } > RAM AT> FLASH
|
|
|
|
|
+ .uninitialized_data (COPY): {
|
|
|
|
|
+ . = ALIGN(4);
|
|
|
|
|
+ *(.uninitialized_data*)
|
|
|
|
|
+ } > RAM
|
|
|
|
|
+ .scratch_x : {
|
|
|
|
|
+ __scratch_x_start__ = .;
|
|
|
|
|
+ *(.scratch_x.*)
|
|
|
|
|
+ . = ALIGN(4);
|
|
|
|
|
+ __scratch_x_end__ = .;
|
|
|
|
|
+ } > SCRATCH_X AT > FLASH
|
|
|
|
|
+ __scratch_x_source__ = LOADADDR(.scratch_x);
|
|
|
|
|
+ .scratch_y : {
|
|
|
|
|
+ __scratch_y_start__ = .;
|
|
|
|
|
+ *(.scratch_y.*)
|
|
|
|
|
+ . = ALIGN(4);
|
|
|
|
|
+ __scratch_y_end__ = .;
|
|
|
|
|
+ } > SCRATCH_Y AT > FLASH
|
|
|
|
|
+ __scratch_y_source__ = LOADADDR(.scratch_y);
|
|
|
|
|
+ .bss : {
|
|
|
|
|
+ . = ALIGN(4);
|
|
|
|
|
+ __bss_start__ = .;
|
|
|
|
|
+ *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.bss*)))
|
|
|
|
|
+ *(COMMON)
|
|
|
|
|
+ . = ALIGN(4);
|
|
|
|
|
+ __bss_end__ = .;
|
|
|
|
|
+ } > RAM
|
|
|
|
|
+ .heap (COPY):
|
|
|
|
|
+ {
|
|
|
|
|
+ __end__ = .;
|
|
|
|
|
+ PROVIDE(end = .);
|
|
|
|
|
+ *(.heap*)
|
|
|
|
|
+ . = ORIGIN(RAM) + LENGTH(RAM) - 0x400;
|
|
|
|
|
+ __HeapLimit = .;
|
|
|
|
|
+ } > RAM
|
|
|
|
|
+ .stack1_dummy (COPY):
|
|
|
|
|
+ {
|
|
|
|
|
+ *(.stack1*)
|
|
|
|
|
+ } > SCRATCH_X
|
|
|
|
|
+ .stack_dummy (COPY):
|
|
|
|
|
+ {
|
|
|
|
|
+ *(.stack*)
|
|
|
|
|
+ } > RAM
|
|
|
|
|
+ .flash_end : {
|
|
|
|
|
+ __flash_binary_end = .;
|
|
|
|
|
+ } > FLASH
|
|
|
|
|
+ __StackTop = ORIGIN(RAM) + LENGTH(RAM);
|
|
|
|
|
+ __StackLimit = __StackTop - 0x400;
|
|
|
|
|
+ __StackOneTop = ORIGIN(SCRATCH_X) + LENGTH(SCRATCH_X);
|
|
|
|
|
+ __StackOneBottom = __StackOneTop - SIZEOF(.stack1_dummy);
|
|
|
|
|
+ __StackBottom = __StackTop - SIZEOF(.stack_dummy);
|
|
|
|
|
+ PROVIDE(__stack = __StackTop);
|
|
|
|
|
+ ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed")
|
|
|
|
|
+ ASSERT( __binary_info_header_end - __logical_binary_start <= 256, "Binary info must be in first 256 bytes of the binary")
|
|
|
|
|
+}
|