在elf

时间:2019-06-07 21:26:08

标签: c linker embedded elf

我有一个涉及引导加载程序的STM32项目。引导加载程序会对整个闪存应用程序区域进行CRC校验,然后将该值与紧随闪存中应用程序映像区域之后存储的固件标头进行比较。

我写了一个Python脚本,该脚本在二进制文件构建后运行。该脚本将获取生成的elf文件,并将每个部分加载到“虚拟Flash”映像中,该映像表示在应正常加载elf之后,mcu上应该存在的内容。数组开始是应用程序区域的大小,每个字节的初始值为0xff,就像完全擦除后的闪存一样。然后,脚本从elf提取每个部分,并覆盖该部分应驻留的虚拟Flash映像的部分。

最后,脚本对应用程序区域进行CRC校验,并将结果值注入原始的elf。

一切正常,但是我在无法确定其来源的MCU的实际Flash内容中看到其他数据。在对elf进行编程之前,会完全擦除闪存,因此这些数据来自加载到设备上的elf。

我猜测这里发生的是我的脚本忽略了elf中的某些部分,但是当使用常规方式进行刷新时,这些部分仍在写入闪存中。

以下是我的应用程序映像上的readelf的结果:

  

部分标题:[Nr]名称类型Addr Off Size ES Flg Lk Inf Al

     

[0] NULL 00000000 000000 000000 00 0 0 0

     

[1] .isr_vector程序08020000 010000 0001f8 00 WA 0 0 4

     

[2] .firmware_header_ PROGBITS 080201f8 0101f8 000004 00 WA 0 0 4

     

[3] .text凭证08020200 010200 01e11c 00 AX 0 0 64

     

[4] .ARM.extab程序0803e31c 033a68 000000 00 W 0 0 1

     

[5] .exidx ARM_EXIDX 0803e31c 02e31c 000008 00 AL 3 0 4

     

[6] .ARM.ARM属性归于ARM_ATTRIBUTES 0803e324 033a68 000030 00 0 0 1

     

[7] .init_array INIT_ARRAY 0803e324 02e324 000008 04 WA 0 0 4

     

[8] .fini_array FINI_ARRAY 0803e32c 02e32c 000004 04 WA 0 0 4

     

[9] .firmware_header程序0803e330 02e330 000008 00 WA 0 0 4

     

[10] .data PROGBITS 20000000 030000 0009c8 00 WA 0 0 8

     

[11] .RxDecripSection程序200009c8 0309c8 000080 00 WA 0 0 4

     

[12] .RxarraySection程序20000a48 030a48 0017d0 00 WA 0 0 4

     

[13] .TxDescripSection程序20002218 032218 000080 00 WA 0 0 4

     

[14] .TxarraySection程序20002298 032298 0017d0 00 WA 0 0 4

     

[15] .bss NOBITS 20003a68 033a68 045bc0 00 WA 0 0 8

     

[16] .heap利润20049628 033a98 000000 00 W 0 0 1

     

[17] .reserved_for_sta计划书20049628 033a98 000000 00 W 0 0 1

     

[18] .battery_backed_s NOBITS 40024000 034000 00000c 00 WA 0 0 4

     

[19] .comment PROGBITS 00000000 033a98 000075 01 MS 0 0 1

     

[20] .debug_frame计划00000000 033b10 001404 00 0 0 4

     

[21] .stab利润00000000 034f14 000084 0c 22 0 4

     

[22] .stabstr STRTAB 00000000 034f98 000117 00 0 0 1

     

[23] .symtab SYMTAB 00000000 0350b0 009010 10 24 1646 4

     

[24] .strtab STRTAB 00000000 03e0c0 003dc8 00 0 0 1

     

[25] .shstrtab STRTAB 00000000 041e88 000132 00 0 0 1

我正在将以下部分加载到我的虚拟Flash映像中:.isr_vector,.firmware_header_vector,.text,.exidx,.ARM.attributes,.init_array,.fini_array

我确实注意到某些节的地址确实为0。其中某些可能只是简单地附加到flash中了吗?

1 个答案:

答案 0 :(得分:1)

其他部分很可能是DATA段的初始数据。大多数系统的启动代码会将内容复制到为这些段分配的RAM空间中。这样可以设置用非零值初始化的静态变量。

例如static int x = 23;应该给您一个段中带有“ 23”的段。闪存中的“ 23”的地址不是RAM中的x的地址。