Часть глобальных данных хочу инициализировать ещё на этапе объявления. Ну там int32_t a[5] = {1, 2, 3, 4, 5}; А всю остальную часть глобальных данных хочу обнулить. Моя проблема в том, что секция с данными {1, 2, 3, 4, 5} и a[5] оказываются отдельно в разных секциях .rodata и .data соответсвенно. Существует ли какой-то способ сэкономить память и сразу их объеденить ещё на этапе линкования? Спасибо.
Сейчас использую такое описание в *.ld файле для линкера:
Код
MEMORY
{
...
...
IntCodeRAM (rx) : ORIGIN = 0x00080000, LENGTH = 128k
IntDataRAM (rw) : ORIGIN = 0x20000000, LENGTH = 112k
...
...
}
PROVIDE (initStart = _etext);
/*******************************************/
/* .rodata section for read-only data (constants) */
.rodata . :
{
*(.rodata)
*(.rodata.*)
. = ALIGN(4);
_etext = .;
PROVIDE (etext = .);
} >IntCodeRAM
/*******************************************/
/* .data section for initialized data */
.data : AT (_etext)
{
/* used for initialized data */
dataStart = .;
PROVIDE (dataStart = .);
*(.data)
*(.data.*)
*(.gnu.linkonce.d*)
SORT(CONSTRUCTORS)
dataEnd = .;
PROVIDE (dataEnd = .);
} >IntDataRAM
. = ALIGN(4);
_edata = .;
PROVIDE (edata = .);
/*******************************************/
/* .bss section for uninitialized data */
.bss :
{
bssStart = .;
bssStart = .;
*(.bss)
*(.gnu.linkonce.b*)
. = ALIGN(4);
bssEnd = .;
} >IntDataRAM
{
...
...
IntCodeRAM (rx) : ORIGIN = 0x00080000, LENGTH = 128k
IntDataRAM (rw) : ORIGIN = 0x20000000, LENGTH = 112k
...
...
}
PROVIDE (initStart = _etext);
/*******************************************/
/* .rodata section for read-only data (constants) */
.rodata . :
{
*(.rodata)
*(.rodata.*)
. = ALIGN(4);
_etext = .;
PROVIDE (etext = .);
} >IntCodeRAM
/*******************************************/
/* .data section for initialized data */
.data : AT (_etext)
{
/* used for initialized data */
dataStart = .;
PROVIDE (dataStart = .);
*(.data)
*(.data.*)
*(.gnu.linkonce.d*)
SORT(CONSTRUCTORS)
dataEnd = .;
PROVIDE (dataEnd = .);
} >IntDataRAM
. = ALIGN(4);
_edata = .;
PROVIDE (edata = .);
/*******************************************/
/* .bss section for uninitialized data */
.bss :
{
bssStart = .;
bssStart = .;
*(.bss)
*(.gnu.linkonce.b*)
. = ALIGN(4);
bssEnd = .;
} >IntDataRAM
А потом для обнуления или инициализации глобальных данных константами использую в исходниках следующий код
Код
/* initialize .data segment */
src = &initStart;
for(dst = &dataStart; dst < &dataEnd; )
{
*dst++ = *src++;
}
/* Zero fill the .bss segment. */
for(dst = &bssStart; dst < &bssEnd; )
{
*dst++ = 0;
}