arm - 英特尔十六进制记录类型 03 或 05 在 ARM 的 iHex 程序中起什么作用?

标签 arm hex objcopy

intel 十六进制记录类型 03 或 05 在 iHex 程序中起什么作用?

Record type 03: Start Segment Address For 80x86 processors, specifies the initial content of the CS:IP registers. The address field is 0000, the byte count is 04, the first two bytes are the CS value, the latter two are the IP value.

Record type 05: Start Linear Address The address field is 0000 (not used) and the byte count is 04. The four data bytes represent the 32-bit value loaded into the EIP register of the 80386 and higher CPU.

这些对于 ARM 程序有意义吗?

每当我生成 .hex 来对嵌入式 ARM 进行编程时,结尾看起来都是这样的:

:10851400B4040020BC040020BC040020C4040020D7
:10852400C4040020CC040020CC040020D404002087
:10853400D4040020DC040020DC040020E404002037
:10854400E4040020EC040020EC040020F4040020E7
:10855400F4040020FC040020FC040020FFFFFFFFC3
:048564000000020011
:0400000508002910B6
:00000001FF

我已经编辑了编程应用程序以忽略此记录,就在今天,一位同事报告说他的编译器在倒数第二行生成了 03 类型记录,这导致无法对 MPU 进行编程。

为什么 objcopy 创建这些记录?我可以阻止它这样做吗?

相关 Makefile 行:

 FORMAT = ihex
 OBJCOPY = arm-elf-objcopy

  %.hex: %.elf
    @echo
    @echo $(MSG_FLASH) $@
    $(OBJCOPY) -O $(FORMAT) $< $@

最佳答案

Do these even make sense for an ARM program?

即使您在裸机情况下提供了向量表,ARM 程序也始终会设置一个入口点。

arm-*-objcopy 程序不是很智能,出于兼容性原因,当入口地址在第一个兆字节内时,它只会生成 03 记录,并且 05否则。

闪存工具可以安全地忽略裸机 ARM 上的这些记录类型,因为向量表已包含所需的地址。您可以尝试过滤十六进制文件以删除这些记录,例如使用sed

关于arm - 英特尔十六进制记录类型 03 或 05 在 ARM 的 iHex 程序中起什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26295776/

相关文章:

arm - Thumb-2指令的W后缀是什么意思?

linux-kernel - ARM Linux 在解压 head.S 中的内核时如何切换到 Thumb2 模式

c - 是否可以覆盖目标模块(gcc、ld、x86、objcopy)中的静态函数?

gcc - 如何删除特定的 ELF 部分,而不删除其他符号?

assembly - 如何理解这一点?

c++ - 在 arm neon 中有效地计算两个不同的数字

c - 32位架构下10位寄存器的读取和比较

java - Java中7F以上的16进制转成String

python - 这是什么类型的数据,如何使用 python 将其转换为人类可读的形式?

python - 在 Python 中从十六进制解压到双倍