Arm:objcopy 如何知道 elf 中的哪些部分包含在二进制或 ihex 中?

chr*_*892 5 c embedded linker elf stm32

我正在开发一个项目,其中涉及解析arm elf 文件并从中提取部分。

显然,elf 文件中有很多部分没有加载到闪存中,但我想知道 objcopy 到底如何知道要在二进制文件中包含哪些部分以直接闪存到闪存中?

以arm elf文件的以下readelf为例:

节标题: [Nr] 名称 类型 地址 关闭大小 ES Flg Lk Inf Al

[0] 空 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.attributes 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].TxDescriptSection PROGBITS 20002218 032218 000080 00 WA 0 0 4

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

[15] .bss 诺比特 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

现在,显然其中相当多的部分(例如 .TxarraySection)没有加载到闪存中。然而,该节类型是 PROGBITS,并且它有一个可写和已分配的标志。这与 isr_vector 没有什么不同,后者已加载但具有相同的类型和标志。我在这里缺少什么?我应该查看程序头吗?

小智 -2

地址告诉您它在 RAM 中,因此除非您的闪存编程器也可以处理 SRAM,否则您可以通过这种方式消除它们。同上,这也是处理调试符号的方式,它们的地址为零。

  • 但是“objcopy”本质上并不知道特定目标上的哪些地址是 RAM,哪些是 ROM,甚至不知道目标具有 ROM - 这就是问题所在。ELF 中的地址是由链接描述文件生成的;`objcopy` 和 `readelf` 都不将任何属性应用于地址值 - 该信息必须是单独的元数据。 (3认同)