我的嵌入式项目有一个后处理步骤,用Flash(某些部分)的CRC替换可执行文件中的值。此步骤只能在链接后完成,因为这是CRC图像的第一次机会。在过去,文件格式是COFF,我已经创建了一个自定义工具来进行修补。
开发工具已切换到ELF,因此我需要重新实现CRC修补程序。在我做之前,我以为我会寻找一个现有的工具来做到这一点。编译器基于gcc,但我看不到可以完成这项工作的ld
和nm
以及readelf
的任意组合。 Google的搜索效果不佳。
我现在的工具使用nm
来查找要修补的地址,并使用地址,期望值(以防止覆盖错误的数据)和新的CRC值调用修补程序。 CRC是以可执行文件的“十六进制”格式计算的(我也补丁),所以我没必要重做那部分。
我可以再次使用libelf
和自定义代码实现此功能,但在此之前,它是否已经存在?
有没有更好的方法来实现我的目标,即将可执行文件的CRC放入可执行文件中,以便应用程序可以使用它?
答案 0 :(得分:4)
如果我已经理解你正在尝试做的事情,我认为以下方法可行:
nm
为您提供要修补的位置的运行时虚拟地址; readelf -S
为您提供运行时虚拟地址和文件中每个部分开头的偏移量; 答案 1 :(得分:0)
我不确定这是否可行,但您可以对其进行排列,以便将目标文件中的CRC位置设置为外部符号 X 的地址。然后,最后一个链接步骤可以通过链接elf文件来满足该外部符号,该文件除了指定 X 的地址是您计算的CRC之外什么也没做。
这仍然非常hacky,我不确定它是否容易执行(因为它是滥用工具)。