Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C elf最后加载部分后闪存中存在的其他数据_C_Linker_Embedded_Elf - Fatal编程技术网

C elf最后加载部分后闪存中存在的其他数据

C elf最后加载部分后闪存中存在的其他数据,c,linker,embedded,elf,C,Linker,Embedded,Elf,我有一个STM32项目,其中涉及一个引导加载程序。引导加载程序CRCs闪存的整个应用程序区域,然后将该值与闪存中应用程序映像区域之后存储的固件头进行比较 我编写了一个python脚本,它在构建二进制文件之后运行。该脚本获取生成的elf文件,并将每个部分加载到“虚拟闪存”图像中,该图像表示正常加载elf后mcu上应该显示的内容。数组开始时是应用程序区域的大小,每个字节的初始值为0xff,就像完全擦除后的闪存一样。然后,脚本从elf中获取每个部分,并覆盖虚拟闪存映像中该部分应该驻留的部分 最后,脚本

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

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

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

这一切都很好,但我在mcu的实际闪存内容中看到了额外的数据,我无法确定其来源。在对elf编程之前,闪存被完全擦除,因此这些数据来自加载到设备上的elf

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

以下是对我的应用程序映像执行readelf的结果:

节头:[Nr]名称类型地址大小ES Flg Lk Inf Al

[0]空0000000000000000000

[1].isr_矢量程序08020000010000 0001f8 00 WA 0 4

[2].固件\u头\u程序位080201f8 0101f8 000004 00 WA 0 4

[3].文本程序08020200 010200 01e11c 00 AX 0 64

[4].ARM.extab程序位0803e31c 033a68 00000000 W 0 1

[5].exidx臂_exidx 0803e31c 02e31c 000008 00铝3 0 4

[6].ARM.attributes ARM_attributes 0803e324 033a68 0000300 00 0 1

[7].初始化数组初始化数组0803e324 02e324 000008 04 WA 0 4

[8]。fini_阵列fini_阵列0803e32c 02e32c 000004 04 WA 0 4

[9]。固件_头程序位0803e330 02e330 000008 00 WA 0 0 4

[10] .数据程序20000000 030000 0009c8 00 WA 0 8

[11] .RxDecripSection程序位200009c8 0309c8 0000800 WA 0 4

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

[13] .TxDescripSection程序位20002218 032218 0000800 WA 0 0 4

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

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

[16] .堆程序位20049628 033a98 00000000 W 0 1

[17] .保留用于存储程序20049628 033a98 00000000 W 0 1

[18] .电池支持的NOBITS 40024000 034000 00000c 00 WA 0 4

[19] 注释程序00000000 033a98 000075 01 MS 0 1

[20] .debug_帧程序位00000000 033b10 001404 00 4

[21].稳定程序00000000 034f14 000084 0c 22 0 4

[22].stabstr STRTAB 00000000 034f98 000117 00 01

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

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

[25].shstrtab STRTAB 00000000 041e88 00013200 0 1

我正在将以下部分加载到虚拟闪存映像中:.isr\u vector、.firmware\u header\u vector、.text、.exidx、.ARM.attributes、.init\u array、.fini\u array


我注意到有些部分的地址为0。其中一些可能只是附加到flash中吗?

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


例如
static int x=23应该为您提供一个包含“23”的段。闪存中此“23”的地址不是RAM中
x
的地址。

根据您发布的
readelf
输出,部分
.ARM.attributes
没有
A
标志,这意味着它应该从内存映像中排除。请注意,它的地址与
.init_array
一致,因此您的虚拟加载过程无论如何都会覆盖它-但是如果您颠倒节加载顺序,您将得到错误的内存映像。简而言之,您应该只加载具有
A
标志的节。请参阅,
“SHF\u ALLOC”