将二进制文件从特定地址点填充到地址中的另一个特定地址点
Posted
技术标签:
【中文标题】将二进制文件从特定地址点填充到地址中的另一个特定地址点【英文标题】:Padding binary files from a specific address point to another specific address point in address 【发布时间】:2018-06-07 10:11:12 【问题描述】:问题描述:
我有两个二进制文件(我们称它们为 file A 和 B)。文件 A 是内核,文件 B 是要运行的应用程序(是的,它是嵌入式操作系统)。对于文件 A,我需要填补从内核末尾到从地址 0x00020000 开始的程序开始之间的空白。
然后从 0x00020000 + 程序长度我需要填补空白到 0x00080000。
我尝试调查arm-none-eabi-objcopy gap fill
,但没有运气。(contiki 使用它)
我基本上有两个问题。我怎么知道什么时候从 file A 开始填充到 0x00080000 以及如何进行填充。
如果有什么不清楚的地方请告诉我,我会尽我所能详细解释。
【问题讨论】:
srec_cat 或许可以做到这一点。或者只是编写您自己的自定义程序来执行您想要的基本文件 I/O。 @kkrambo 建议的 SRecord 实用程序套件是我的建议。我不确定该建议是否值得回答,而不仅仅是评论。 你没有展示你是如何尝试使用 objcopy 的——你当然不会像你的问题中那样使用它。arm-none-eabi-objcopy --gap-fill xx
后面可能还有其他参数。但是--gap-fill
单独填补了 部分之间的空白,而不是单独文件中的地址空间之间的空白。
对于实际的二进制文件,您可以在需要时使用dd
和/dev/zero
作为源的各种选项。了解您需要多少填充是一个简单的问题,即计算出您拥有的部分的大小并相对于地址进行数学运算。虽然使用dd
方法,您也可以从创建一个充满零的文件开始,然后在正确的偏移量处写入所需的部分。
【参考方案1】:
要使用objcopy 在最后一节之后添加填充,您需要将--pad-to <address>
与--gap-fill <fillvalue>
结合使用。
例如:
arm-none-eabi-objcopy --gap-fill 0x00 --pad-to 0x80000 filea.out filea_padded.out
然而,objcopy 是在目标文件而不是原始二进制文件上执行的。原始二进制文件缺少地址信息和节元数据,这些元数据告诉它间隙和结束地址在哪里。
如果您的“二进制”实际上是一个 hex 文件(例如 Intel 或 S-Record 格式),您可以使用 SRecord 实用程序套件来操作这些文件,因为格式包括地址/位置元数据。您也可以使用它来将两个文件连接成一个图像。
【讨论】:
Clifford,感谢您的回答,但似乎我需要进行一些更改。首先,我现在有一个二进制文件。它通常包含大约 25 240 个字节。我需要用 0xff 填充这个二进制文件,所以二进制文件的大小正好是 516 096 字节。是否仍然可以使用 objcpy 来执行此操作?感谢您的帮助 @EmbeddedOS 试试看。我刚刚阅读了文档。我看不出你的评论和你原来的问题有什么区别。 我试过了,但我无法控制二进制文件的大小。使用您发布的命令后,它变得超过 1kb以上是关于将二进制文件从特定地址点填充到地址中的另一个特定地址点的主要内容,如果未能解决你的问题,请参考以下文章