在 ARM 的 iHex 程序中,英特尔十六进制记录类型 03 或 05 是做啥的?

Posted

技术标签:

【中文标题】在 ARM 的 iHex 程序中,英特尔十六进制记录类型 03 或 05 是做啥的?【英文标题】:What are the intel hex records type 03 or 05 doing in iHex program for ARM?在 ARM 的 iHex 程序中,英特尔十六进制记录类型 03 或 05 是做什么的? 【发布时间】:2014-10-10 09:08:50 【问题描述】:

intel hex 记录类型 03 或 05 在 iHex 程序中做了什么?

记录类型 03:起始段地址 对于 80x86 处理器,指定 CS:IP 寄存器的初始内容。地址字段为0000,字节数为04,前两个字节为CS值,后两个为IP值。

记录类型05:起始线性地址地址字段为0000(未使用),字节数为04。四个数据字节代表加载到EIP寄存器中的32位值80386 及更高的 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) $< $@

【问题讨论】:

ARM's page here 有一些特定于 ARM 的解释。 【参考方案1】:

这些对于 ARM 程序是否有意义?

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

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

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

【讨论】:

很高兴知道!我试图找到有关此行为的 objcopy 文档,因为它在不同的目标上也让我感到惊讶,同样在遇到其中一种类型时破坏了工具。

以上是关于在 ARM 的 iHex 程序中,英特尔十六进制记录类型 03 或 05 是做啥的?的主要内容,如果未能解决你的问题,请参考以下文章

无法刷写 ARM 设备 - “英特尔 Hex 文件不以 ':' 开头”

Android逆向基础之ARM汇编语言知识总结

Android逆向基础之ARM汇编语言知识总结

倍福TwinCAT2中CX(ARM)啥意思

AVR 内存和英特尔十六进制

苹果 M1带起ARM,英特尔 x86 霸主地位遭威胁