Коллеги, подскажите по линкеру ld Надо, чтобы эта сволочь прямо выполнила мои инструкции, указанные в скрипте линкера, и не умничала.
Фрагмент скрипта:
MEMORY {
/* 256KB of Internal Sram starting at 0x00000000 after remap */
RAM (rwx) : ORIGIN = 0x00000000, LENGTH = 256K
}
SECTIONS
{
.data : {
__data_load = LOADADDR (.data);
__data_start = .;
*(.data .data.*)
} >RAM AT>RAM
}
Проблема в том, что LMA секции .data = VMA секции .data. Я же ожидаю, что линкер в области памяти RAM зарезервирует два блока размером SIZEOF(.data): в одном будут храниться константы (начальные значения), а во втором непосредственно данные (сейчас резервируется только один блок). Мой стартапный код во время инициализации из LMA тупо скопирует в VMA эти константы и передаст управление дальше.
Сейчас при рестарте у меня не инициализируется секция .data: копируется из себя в себя (при загрузке из отладчика отладчик загружает секцию .data из .elf правильно, но если программа поработала и изменила .data, то рестарт без повторной загрузки секции .data приводит к сбоям из-за отсутствия инициализации .data).
Создавать второй регион памяти в MEMORY не предлагать. Я не хочу мучиться с распределением памяти и с точным указанием абсолютных адресов размещения различных блоков памяти.