Ну это только в gcc. GHS MULTI (он ещё и сжимает в FLASH, а потом разжимает при копировании в ОЗУ):
SECTIONS { .CROM.fastcode CROM(.fastcode) : > flash_memory .fastcode ALIGN(4) : > sram_memory }И более никаких телодвижений, линкер и системный стартапный код сами разберутся. Порядок расположения строк в линкере неважен. ARMCC:
#! armcc -E ; code upper need to use #define ;------------------------------------------------------------------------------------- ; Keil scatter loading file ; For LPC4357 ;------------------------------------------------------------------------------------- ; Internal SRAM0 #define SRAM0_START 0x10000000 #define SRAM0_END 0x10008000 #define SRAM0_SIZE (SRAM0_END-SRAM0_START) ; Internal SRAM1 #define SRAM1_START 0x10080000 #define SRAM1_END 0x1008A000 #define SRAM1_SIZE (SRAM1_END-SRAM1_START) ; Internal SRAM2 #define SRAM2_START 0x20000000 #define SRAM2_END 0x20010000 #define SRAM2_SIZE (SRAM2_END-SRAM2_START) ; SDRAM #define SDRAM_START 0x28000000 ; Internal FLASHA #define FLASHA_START 0x1A000000 #define FLASHA_END 0x1A080000 #define FLASHA_SIZE (FLASHA_END-FLASHA_START) ; Internal FLASHB #define FLASHB_START 0x1B000000 #define FLASHB_END 0x1B080000 #define FLASHB_SIZE (FLASHB_END-FLASHB_START) LR1 FLASHA_START { ER1 FLASHA_START { startup_LPC43xx.o (RESET, +FIRST) startup_LPC43xx.o (+RO) system_LPC43xx.o (+RO) *(InRoot$$Sections) lludivv7m.o (+RO) } ER2 SRAM0_START { *(STACK) *.o (+RW +ZI) } ER3 SRAM1_START { *.o (+RO) } ER4 SRAM2_START { *(HEAP) } }И тоже более никаких телодвижений, линкер сам разберётся (построит таблицу секций) и системный стартапный код скопирует секции с RO атрибутом, не попадающие в ER1, в регион ER3 (находящийся в SRAM1_START)