| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196 | MEMORY{    FLASH(rx) : ORIGIN = 0x10000000, LENGTH = 352k    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")    /* If BlueSCSI SD card bootloader is included, it goes in first 128 kB */    .text.bootloader : ALIGN(16) SUBALIGN(16)    {        KEEP(*(.text.btldr*))        . = ALIGN(131072);        CHECK_BOOTLOADER_SIZE = 1 / (. <= 131072);    } > FLASH    .text : {        __logical_binary_start = .;        __real_vectors_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);        /* Put only non-timecritical code in flash         * This includes e.g. floating point math routines.         */        *libm*:(.text .text*)        *libc*:(.text .text*)        *libgcc*:*df*(.text .text*)        *USB*(.text .text*)        *SPI*(.text .text*)        *Spi*(.text .text*)        *spi*(.text .text*)        *stdc*:(.text .text*)        *supc*:(.text .text*)        *nosys*:(.text .text*)        *libc*:*printf*(.text .text*)        *libc*:*toa*(.text .text*)        *libminIni.a:(.text .text*)        /* RP2040 breakpoints in RAM code don't always work very well         * because the boot routine tends to overwrite them.         * Uncommenting this line puts all code in flash.         */        /* *(.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 code will go here to avoid external flash latency */        *(.time_critical*)        . = ALIGN(4);        *(.text)        *(.text*)        . = 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")}
 |