В процессе работы над программой заметил, что все массивы, особенно большие (более 8к) заметно увеличивают размер выходного бинарника, т.к. находятся внутри тела программы. Скорее всего это потому, что в линкере все объявлено в одну секцию. Может кто более опытный в этом деле посоветует, как "вынести" все эти массивы и структуры за тело программы, как в ИАРе делалось, и второе, каким образом будут инициализироваться эти данные, компилятор сам вставляет процедуры заполнения константой(как делал ИАР) или мне надо писать их самостоятельно?
Файл линкера:
CODE
MEMORY
{
RAM (XRW) : ORIGIN = 0x40000000, LENGTH = 0x000A0000 /* 1MB */
}
SECTIONS
{
.start : { *(.start) } > RAM
.text : { *(.text) } > RAM
.bss : { *(.bss) } > RAM
.ivc : {. = ALIGN(32); *(.ivc) *(.rodata)} >RAM
.stack : {. = ALIGN(512);__StackLimit = . ;*(.stack*). = . + 0x4500; __StackTop = .;} >RAM
_stack = __StackTop;
.fill :
{
FILL(0x00);
. = ORIGIN(RAM) + 0x8ffff;
BYTE(0x00);
} > RAM
/DISCARD/ : { *(.dynstr*) }
/DISCARD/ : { *(.dynamic*) }
/DISCARD/ : { *(.plt*) }
/DISCARD/ : { *(.interp*) }
/DISCARD/ : { *(.gnu*) }
/DISCARD/ : { *(.note*) }
}
{
RAM (XRW) : ORIGIN = 0x40000000, LENGTH = 0x000A0000 /* 1MB */
}
SECTIONS
{
.start : { *(.start) } > RAM
.text : { *(.text) } > RAM
.bss : { *(.bss) } > RAM
.ivc : {. = ALIGN(32); *(.ivc) *(.rodata)} >RAM
.stack : {. = ALIGN(512);__StackLimit = . ;*(.stack*). = . + 0x4500; __StackTop = .;} >RAM
_stack = __StackTop;
.fill :
{
FILL(0x00);
. = ORIGIN(RAM) + 0x8ffff;
BYTE(0x00);
} > RAM
/DISCARD/ : { *(.dynstr*) }
/DISCARD/ : { *(.dynamic*) }
/DISCARD/ : { *(.plt*) }
/DISCARD/ : { *(.interp*) }
/DISCARD/ : { *(.gnu*) }
/DISCARD/ : { *(.note*) }
}