#ifndef FLASHSTART #define FLASH SRAM #endif #ifndef RAMSTART #define RAMSTART 0x20000000 #endif #ifndef RAMSIZE #define RAMSIZE 32K #endif #ifndef FLASHSIZE #define FLASHSIZE 128K #endif #ifndef STACKSIZE #define STACKSIZE 0x200 #endif #ifndef ETRSIZE #define ETRSIZE 0x0 #endif #ifndef ETRALIGN #define ETRALIGN 0x100 #endif /* * The entry point is important for debuggers and simulators, the * hardware has its own notion of the startup address. */ ENTRY( _start ) MEMORY { #ifdef FLASHSTART FLASH (rxai!w) : ORIGIN = FLASHSTART, LENGTH = FLASHSIZE #endif SRAM (wxa!ri) : ORIGIN = RAMSTART, LENGTH = RAMSIZE } SECTIONS { .init : { KEEP (*(SORT_NONE(.init))) } > SRAM .text : { *(.text.unlikely .text.unlikely.*) *(.text.startup .text.startup.*) *(.text .text.*) *(.gnu.linkonce.t.*) } > FLASH .fini : { KEEP (*(SORT_NONE(.fini))) } > FLASH PROVIDE (__etext = .); PROVIDE (_etext = .); PROVIDE (etext = .); .rodata : { *(.rdata) *(.rodata .rodata.*) *(.gnu.linkonce.r.*) } > FLASH . = ALIGN(4); .preinit_array : { PROVIDE_HIDDEN (__preinit_array_start = .); KEEP (*(.preinit_array)) PROVIDE_HIDDEN (__preinit_array_end = .); } > SRAM .init_array : { PROVIDE_HIDDEN (__init_array_start = .); KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) PROVIDE_HIDDEN (__init_array_end = .); } > SRAM .fini_array : { PROVIDE_HIDDEN (__fini_array_start = .); KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) PROVIDE_HIDDEN (__fini_array_end = .); } > SRAM .ctors : { /* gcc uses crtbegin.o to find the start of the constructors, so we make sure it is first. Because this is a wildcard, it doesn't matter if the user does not actually link against crtbegin.o; the linker won't look for a file to match a wildcard. The wildcard also means that it doesn't matter which directory crtbegin.o is in. */ KEEP (*crtbegin.o(.ctors)) KEEP (*crtbegin?.o(.ctors)) /* We don't want to include the .ctor section from the crtend.o file until after the sorted ctors. The .ctor section from the crtend file contains the end of ctors marker and it must be last */ KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) KEEP (*(SORT(.ctors.*))) KEEP (*(.ctors)) } > FLASH .dtors : { KEEP (*crtbegin.o(.dtors)) KEEP (*crtbegin?.o(.dtors)) KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) KEEP (*(SORT(.dtors.*))) KEEP (*(.dtors)) } > FLASH .lalign : { . = ALIGN(4); PROVIDE( _data_lma = . ); } > SRAM .dalign : { . = ALIGN(4); PROVIDE( _data = . ); } > SRAM .data : { *(.data .data.*) *(.gnu.linkonce.d.*) . = ALIGN(8); PROVIDE( __global_pointer$ = . + 0x800 ); *(.sdata .sdata.*) *(.gnu.linkonce.s.*) . = ALIGN(8); *(.srodata.cst16) *(.srodata.cst8) *(.srodata.cst4) *(.srodata.cst2) *(.srodata .srodata.*) } > SRAM . = ALIGN(4); PROVIDE( _edata = . ); PROVIDE( edata = . ); PROVIDE( _fbss = . ); PROVIDE( __bss_start = . ); .bss : { *(.sbss*) *(.gnu.linkonce.sb.*) *(.bss .bss.*) *(.gnu.linkonce.b.*) *(COMMON) . = ALIGN(4); } > SRAM . = ALIGN(8); PROVIDE( _end = . ); PROVIDE( end = . ); .stack : { . = ALIGN(8); __stack_start = .; . += STACKSIZE; PROVIDE( _sp = . ); } > SRAM __heap_start = .; }