C语言 在 elf 的最后一次加载部分之后闪存中存在的附加数据



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

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

最后,脚本CRC应用程序区域并将结果值注入原始elf。

这一切都工作正常,但我在 mcu 的实际闪光灯内容中看到我无法确定来源的其他数据。在对精灵进行编程之前,闪光灯会被完全擦除,因此这些数据来自加载到设备上的精灵。

我猜这里发生的事情是精灵中的某些部分被我的脚本忽略了,但在使用常规方式刷新时仍然被写入闪存。

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

节标题: [nr] 名称类型 addr 关闭大小 ES flg lk inf al

[ 0] NULL

00000000 000000 000000 00 0 0 0[ 1] .isr_vector PROGBITS 08020000 010000 0001f8 00 WA 0 0 4

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

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

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

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

[ 6] .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 PROGBITS 0803e330 02e330 000008 00 WA 0 0 4

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

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

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

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

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

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

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

[17] .reserved_for_sta PROGBITS 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 PROGBITS 00000000 033b10 001404 00 0 0 4

[21] .stab PROGBITS 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

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

我确实注意到某些部分的地址确实为 0。其中一些可能只是附加到闪存吗?

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

例如static int x = 23;应该给你一个包含"23"的片段。闪存中这个"23"的地址不是RAM中x的地址。

最新更新