由于ROM中的.data部分,将校验和添加到.elf文件失败

时间:2018-07-11 15:20:22

标签: ld elf crc

我正在尝试将校验和添加到由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标记为已初始化。我在这里想念什么?

我被困住了,我真的需要您的帮助。

谢谢!

0 个答案:

没有答案