我正在尝试将校验和添加到由gcc工具链生成的.elf文件中。我的程序是TM4C129的引导程序,它执行得很好, 因此,我认为此时节的位置不是问题。
我使用IAR中的ielftool程序进行校验和计算,并将此校验和放置在.elf中的特定地址。 问题在于,在计算校验和的过程中,它抱怨统一数据。这些“统一数据”实际上是 ROM中的.data部分。我可以将--fill参数传递给程序,但是ielftool会覆盖ROM中的.data部分 以我作为参数传递的任何模式。
以下一些背景信息可能会有所帮助。
1-ielftool命令的输出(带有--fill参数)。我们可以在“图片”中看到ielftool在ROM中的.data上添加了一个填充部分。
C:\ Users \ cmgpml \ Desktop \ question>“ C:\ Program Files(x86)\ IAR Systems \ Embedded Workbench 7.5 \ arm \ bin \ ielftool.exe” --verbose --fill 0xFF; Binary_Start - Binary_End +3 --checksum = 校验和:2,crc = 0x18005:mi,0xFFFF; __ Binary_Start - Binary_End + 3 USBBootloader.elf USBBootloader.elf
IAR ELF工具V9.22.0.164 [在IAR上构建] 版权所有2007-2016 IAR Systems AB。
加载USBBootloader.elf
添加范围为7820-788f的填充段
计算了0x7894的校验和(__checksum):0xdcd9
校验和的地址为: 0x4000-0x7893
将ELF文件保存到USBBootloader.elf
2-.map文件中的.data部分:
// .data section in ROM
0x00007820 _ldata = LOADADDR (.data)
// 0x20000000 is the beginning of RAM
.data 0x20000000 0x70 load address 0x00007820
3-这是我的.elf部分。请注意,该工具如何在.data范围内添加填充部分。
Section Headers:
[Nr] Name Type Addr Off Size ES Flg Lk Inf Al
[ 0] NULL 00000000 000000 000000 00 0 0 0
[ 1] .isr_vector PROGBITS 00004000 0000d8 0001fc 00 A 0 0 8
[ 2] .prog_info PROGBITS 00004400 0004d8 000017 00 A 0 0 8
[ 3] .text PROGBITS 00004418 0004f0 003400 00 AX 0 0 8
[ 4] .init_array INIT_ARRAY 00007818 0038f0 000004 00 WA 0 0 4
[ 5] .fini_array FINI_ARRAY 0000781c 0038f4 000004 00 WA 0 0 4
[ 6] .data PROGBITS 20000000 0038f8 000070 00 WA 0 0 8
[ 7] .binary_end PROGBITS 00007890 003968 000004 00 A 0 0 4
[ 8] .checksum PROGBITS 00007894 00396c 000002 00 WA 0 0 1
[ 9] .bss NOBITS 20000400 003cea 000d5c 00 WA 0 0 1024
[10] .stack NOBITS 20001160 003cea 001000 00 WA 0 0 8
[11] .heap NOBITS 20002160 003cea 002000 00 WA 0 0 8
[12] .ARM.attributes ARM_ATTRIBUTES 00000000 00396e 000030 00 0 0 1
[13] .comment PROGBITS 00000000 00399e 000138 01 MS 0 0 1
[14] .debug_frame PROGBITS 00000000 003ad6 000150 00 0 0 4
[15] .stabstr STRTAB 00000000 003c26 000076 00 0 0 1
[16] .shstrtab STRTAB 00000000 007a87 0000b3 00 0 0 1
[17] .symtab SYMTAB 00000000 003c9e 002630 10 18 387 4
[18] .strtab STRTAB 00000000 0062ce 001749 00 0 0 1
[19] Fill1 PROGBITS 00007820 007a17 000070 01 AX 0 0 0
4-最后但并非最不重要的是,代码的相应链接脚本部分:
_ldata = LOADADDR(.data);
.data : ALIGN(8)
{
__data_start__ = .;
*(.data)
*(.data*)
*(vtable)
*(COMMON)
__data_end__ = .;
} >SRAM AT>ROM
因此,有一种方法可以修改链接器脚本,以将ROM中的.data标记为已初始化。我在这里想念什么?
我被困住了,我真的需要您的帮助。
谢谢!