使用 gcc 的 Intel 十六进制格式和位置独立代码

Intel hex format and position independent code using gcc

我不确定这是否特定于我正在使用的处理器,因此我使用的是 Cortex M0+ 的价值。我想知道:如果我使用 -fPIC 通过 gcc 生成十六进制文件,我会生成...位置独立代码。然而,我从objcopy中得到的intel hex文件格式在每一行的header上总是有地址信息。如果我正在尝试编写引导加载程序,我是忽略该信息,跳过与其相关的字节,并将实际代码加载到我想要的任何地方的内存中,还是我必须以某种方式跟踪它?

intel-HEX 格式专门设计用于对 PROM、EPROM 或带有内部 EPROM 的处理器进行编程,通常与这些设备的编程器一起使用。记录开头的地址与程序代码直接关系不大。它们指示数据将写入 PROM 的哪个地址。还请记住,PROM 可以映射到处理器地址 space 的任何位置,因此最终地址无论如何都可以更改。

只要您不想对 PROM 进行编程,就必须从记录中删除除数据以外的任何内容。 (不要忘记最后的校验和 ;-)

据我了解,intel-HEX 格式的记录不能连续,中间可能有空洞。

一些备注:

-f PIC参数不负责intel-HEX格式。我认为您会在命令行的某处找到 -O ihex。如果你想要一个可以执行的文件,objcopy 提供了更适合的输出格式。

只要您不自己编写启动过程的早期阶段,就不会加载您的引导加载程序 - 它会为您加载。发生这种情况的地址通常是固定的且不可更改。所以不需要位置独立的代码,但也没有坏处。