В моем скрипте компоновщика есть следующая строка
JumpTable ABSOLUTE(0x2000000C): AT(eROData)
{
JumpTableStart = .;
*(.JumpSection);
. = ALIGN(4);
JumpTableEnd = .;
} > SRAM
eROData - это адрес из флэш-памяти и принимает значение 0x1000xxxx
После связывания я заметил, что компоновщик назначает VMA и LMA разделу JumpTable. Это список из файла списка.
2 .rodata 00000004 10001214 10001214 00001214 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
3 JumpTable 00000140 2000000c 2000000c 00008954 2**2
CONTENTS, READONLY
С разделом .data таких проблем нет.
Это известная проблема компоновщика GNU?
РЕДАКТИРОВАТЬ: Я заметил, что если раздел «.JumpSection» был определен в файле C, LMA был назначен правильно.
Я столкнулся с этой проблемой, потому что раздел определен в файле сборки.
Вы сталкивались с этой проблемой раньше?
РЕДАКТИРОВАТЬ - РЕШЕНИЕ: Оказалось, что .JumpSection должен был быть определен с правильными атрибутами: .section ".JumpSection", "ax",% progbits
Только тогда компоновщик будет вести себя правильно.