Ну это только в 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)