用于简单修改elf文件的工具?

6
我的嵌入式项目有一个后处理步骤,它会将可执行文件中的某个值替换为(某些部分)flash 的 CRC。由于这是第一次计算图像的 CRC,因此此步骤只能在链接后完成。过去文件格式为 COFF,并且我创建了一个自定义工具来进行修补。
开发工具已经转换为 ELF,因此我需要重新实现 CRC 修补程序。在此之前,我想寻找一个现有的工具来完成此任务。编译器基于 gcc,但我看不到任何组合的 ld、nm 和 readelf 可以完成此任务。谷歌搜索也没有结果。
我的现有工具使用 nm 查找要修补的地址,并使用该地址、期望值(以防止覆盖错误数据)和新的 CRC 值调用修补程序。CRC 是在“hex”格式的可执行文件上计算的(我也进行了修补),所以幸运的是我不必重做这部分。
我可以再次使用 libelf 和自定义代码实现这一点,但在此之前,是否已经存在这样的工具?
有更好的方法来实现我的目标吗?即将可执行文件的 CRC 放入可执行文件中,以便应用程序可以使用它?
2个回答

4
如果我正确理解你的意图,我认为以下方法可以解决问题:
  • nm 命令可以给出你想要 patch 的运行时虚拟地址;
  • readelf -S 命令可以给出每个段落开头的运行时虚拟地址和文件中的偏移量;
  • 将两者拼接在一起(例如使用您喜欢的脚本语言编写几行代码)即可得到需要进行 patch 的文件偏移量。

这是一个很好的建议,+1。我会尝试一下。 - Doug Currie

0

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

这仍然是相当hacky的,而且我不确定它是否容易实现(因为这是对工具的滥用)。


是的,我还没有想出如何使这个工作,因为链接缺少符号,我需要完成链接以便计算CRC。 - Doug Currie
我曾认为这可能不是一个问题,但似乎即使在重新链接已构建的可执行文件(所有依赖项都由一个文件满足)时,ld 也会重新组织并破坏它。有几个用于将序列号插入固件映像的程序。也许有一个针对elf映像的程序可以改变你的需求。 - nategoose

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接