我有一个链接器脚本,我在其中定义了一个包含软件映像校验和的部分。就像是:
...
.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.
...
}
elf
现在,如果我用and文件复制与上述相同的步骤bin
(使用适当的偏移量),我可以从bin
文件中检索校验和(elf
并bin
给出相同的结果)。
问题
我的第一个问题是:我知道您可以使用 定义一个部分__attribute__((section))
,但是如果您使用链接描述文件中已经定义的部分,此命令是否会更改其将变量放置在该部分中的行为,而不是创建一个新的?
我的第二个问题是:objcopy
这是防止删除此特定部分的唯一方法吗?