У меня есть скрипт компоновщика, в котором я определил раздел для хранения контрольной суммы образа программного обеспечения.Что-то вроде:
...
.my_checksum :
{
__checksum_is_here = .;
KEEP (*(.my_checksum))
. = ALIGN(4);
_sw_image_code_end = .;
} > IMAGE
...
Контрольная сумма помещается в этот раздел с помощью objcopy --update-section
.
Я создаю файл elf
с помощью компилятора arm gcc
, и я вижуэтот раздел и его значение в нем:
> arm-none-eabu-objdumph -h my_elf_file.elf
...
0 .text 0001496c 08010000 08010000 00010000 2**4
...
7 .my_checksum 00000004 080250c0 080250c0 000350c0 2**2
...
// Notice that 000350c0 is the file offset and 080250c0 is the LMA.
// The starting LMA is 08010000
И я могу получить его значение:
> xxd -s 0x000350c0 -l 4 my_elf_file.elf
000350c0: 015e 028e // I have checked this value and it is correct.
Теперь я генерирую bin
файл, выполнив
> arm-none-eabi-objcopy -O binary --gap-fill 0xFF -S my_elf_file.elf my_elf_file.bin
Теперь, если я попытаюсь снова прочитать значение контрольной суммы, используя разницу между контрольной суммой LMA и первым разделом LMA (см. Выше):
> xxd -s 0x150c0 -l 4 my_elf_file.bin
Полученный здесь результат отличается отполученный в файле elf, то есть раздел контрольной суммы был удален с помощью objcopy.(Это то, что я думаю, по крайней мере).
Тем не менее, если я определю это в моем main.c
файле:
static volatile unsigned int __aux_checksum __attribute__((section(".my_checksum")));
...
int main() {
...
((void)__aux_checksum); // Avoid compiler/linker optimizations.
...
}
Теперь, если я повторю те же шаги, что и выше, с *Файлы 1028 * и bin
(используя правильные смещения), я могу получить контрольную сумму из файла bin
(elf
и bin
дают тот же результат).
Вопросы
Мой первый вопрос: Я знаю, что вы можете определить раздел, используя __attribute__((section))
, но если вы используете раздел, уже определенный в скрипте компоновщика, эта команда изменит свое поведение для помещения переменной враздел вместо создания нового?
Мой второй вопрос: Это единственный способ предотвратить objcopy
удаление этого конкретного раздела?