【问题标题】:Arm: How does objcopy know which sections from an elf to include in a binary or ihex?Arm:objcopy 如何知道 elf 中的哪些部分要包含在二进制或 ihex 中?
【发布时间】:2019-10-23 09:11:45
【问题描述】:

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

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

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

部分标题:[Nr] 名称类型地址关闭大小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 程序 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 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 程序 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 没有什么不同,它已加载但具有相同的类型和标志。我在这里想念什么?我应该查看程序标题吗?

【问题讨论】:

  • Objcpy 可能会从一些 elf 文件中生成许多 GB 文件。它只获取文本和rodata 段。我们你的结构更复杂(例如 o 覆盖)你需要明确告诉它你需要什么
  • 请在代码中重新粘贴您的readelf 输出,而不是引用标记,以便保留列。任何人都在猜测为什么您将闪存标记为“可写” - 也许您应该将链接描述文件添加到您的问题中。

标签: c linker embedded stm32 elf


【解决方案1】:

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

【讨论】:

  • 当然,但这就是 objcopy 确定 flash 映像中的内容的方式吗?它只是检查加载地址吗?我想我认为标志或部分类型中会有信息表明这一点。
  • 但是objcopy 本质上并不知道什么地址是 RAM,什么是特定目标上的 ROM,甚至不知道目标有 ROM——这就是问题所在。 ELF 中的地址是由链接描述文件生成的; objcopyreadelf 都不会对地址值应用任何属性 - 该信息必须是单独的元数据。
猜你喜欢
  • 1970-01-01
  • 2019-01-26
  • 2018-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-21
  • 2023-01-30
  • 1970-01-01
相关资源
最近更新 更多