2010-10-01 192 views
6

我的嵌入式项目有一个后处理步骤,用闪存的(某些部分)的CRC替换可执行文件中的值。这一步只能在链接之后完成,因为这是CRC映像的第一次机会。在过去,文件格式是COFF,并且我创建了一个自定义工具来完成修补。简单修改elf文件的工具?

开发工具已经切换到ELF,所以我需要重新实现CRC修补程序。在我做之前,我想我会寻找一个现有的工具来做到这一点。编译器基于gcc,但我看不到可以完成这项工作的任何组合ldnmreadelf。谷歌搜索尚未取得丰硕成果。

我现在的工具使用nm找到要打补丁的地址,并用地址,期望值(以防止覆盖错误的数据)和新的CRC值调用修补程序。 CRC是根据可执行文件的“十六进制”格式计算的(我也打补丁),幸运的是我不必重做那部分。

我可以实现这与libelf和自定义代码再次,但在我之前,它已经存在?

有没有更好的方法来完成我的目标,即将可执行文件的CRC放入可执行文件中,以便可用于应用程序?

回答

4

如果我理解你想要正确地做什么,我觉得有以下将工作:

  • nm给你,你要修补的位置运行的虚拟地址;
  • readelf -S为您提供了运行时虚拟地址和文件中每个部分开头的偏移量;
  • 将两者拼接在一起(例如,用您最喜欢的脚本语言的几行)将文件内的偏移量打补丁。
+0

这是一个很棒的建议,+1。我会试一试。 – 2010-10-02 01:15:52

0

我不确定这是否可行,但您可能可以安排它,以便将目标文件中的CRC位置设置为外部符号的地址X。然后,通过链接一个elf文件,最后的链接步骤可以满足该外部符号,该elf文件什么也不做,只是指定的地址是您计算的CRC。

这仍然是非常hacky,我不确定它是否容易实现(因为它是如此滥用的工具)。

+0

是的,我还没有想出如何使这项工作,因为链接不会完成丢失的符号,我需要链接完成,所以我可以计算CRC。 – 2010-10-01 21:17:13

+0

我在想这可能不是问题,但它似乎即使在重新链接构建的可执行文件(所有依赖关系符合该文件文件)时,ld会重新组织并破坏事情。有几种程序可以将序列号填充到固件映像中。也许有一个小精灵的图像,你可以为此重新调整。 – nategoose 2010-10-01 21:46:10