_start = ORIGIN(FLASH); ENTRY(_start) MEMORY { FLASH (xrx) :ORIGIN = 0x10000000, LENGTH = 256K RAM (xrw) :ORIGIN = 0x20000000, LENGTH = 256K STACK (rw) :ORIGIN = 0x20040000, LENGTH = 8K - 256 AUTO(xrx) :ORIGIN = 0x20041F00, LENGTH = 256 } _stack_top = ORIGIN(STACK) + LENGTH(STACK); PHDRS { boot2_pre PT_LOAD FLAGS(5); /* R + X */ text PT_LOAD FLAGS(5); /* R + X */ bss PT_LOAD FLAGS(6); /* R + W */ } SECTIONS { .boot2_pre : { KEEP(*boot2_pre.*(.text.boot2_pre)) KEEP(*(.text.boot2_pre)) _boot2_pre_size = . - ADDR(.boot2_pre); ASSERT(_boot2_pre_size <= 240, "Error: .boot2_pre size exceeds 240 bytes!"); . += 240 - _boot2_pre_size; LONG(_env_start) /* envionment variables start address */ LONG(0) LONG(0) LONG(0) /* MPEG2 of CRC32 */ } >AUTO AT > FLASH :boot2_pre .text : { . = ALIGN(4); _boot2_copy_self_start_addr = .; *(.text*) *(.rodata*) *(.data*) . = ALIGN(4); } >RAM AT > FLASH :text _boot2_copy_self_end_addr = .; .bss (NOLOAD) : { . = ALIGN(4); _bss_start = .; *(.bss*) . = ALIGN(4); _bss_end = .; } >RAM :bss _env_start = ADDR(.bss); _env_start = ALIGN(4K); _env_start = _env_start - (ORIGIN(RAM) - ORIGIN(FLASH)); }