如何使用 OBJCOPY 的 --add-section 开关?

Posted

技术标签:

【中文标题】如何使用 OBJCOPY 的 --add-section 开关?【英文标题】:How can the --add-section switch of OBJCOPY be used? 【发布时间】:2013-07-24 00:47:28 【问题描述】:

实际上有两个问题围绕着 --add-section 的使用。简单的在标题中。根据我的阅读,我无法弄清楚如何执行 --add-section。

要使用添加部分,我必须传递一个部分名称。如果我使用现有的部分名称,程序会响应“无法添加部分'.data':文件格式错误。”也许我只需要传递另一个参数。如果我使用新的部分名称(我更愿意这样做),则会警告我“分配的部分 '.blob' 不在段中。”

现在,除了“不在细分”警告之外,我已经让我的功能可以正常工作了。我想弄清楚是否有一种合法的方法可以将此 blob 放入可执行文件中。我会把它链接进去,但这并不容易,因为我添加的数据是从可执行文件本身的内容生成的。

第二个问题是我真正关心的。鉴于在链接完成之前无法计算 blob,有没有办法执行以下操作。

    链接 ELF 文件 从 ELF 文件和其他数据生成 blob

    将 blob 添加到 ELF 文件,以便在运行时将其加载到内存中的正确位置

    objcopy --add-section .blob=blob.o \ --set-section-flags .blob=alloc,contents,load,readonly \ --change-section-address .blob=ADDRESS \ program.elf program.blobbed.elf

我很乐意在 ELF 文件中添加一个部分和/或段作为链接的一部分,并在其中插入这个 blob。我不知道该怎么做。

我突然想到,我可以通过第二个链接来完成这项壮举,但 objcopy 会更简洁。

    链接 ELF 文件 从 ELF 文件和其他数据生成 blob 重新链接 ELF 文件,包括新的 blob.o

更新:只要重新链接不会改变由第一个链接生成的程序部分中的某些内容,最后一种策略可能是可行的。它不会在第一次尝试时出现,但它可能会解决它。因此,希望使用 --add-section 来添加这个 blob,而不是通过第二个链接。

【问题讨论】:

【参考方案1】:

您可以添加该部分,用例如 NUL 填充它,然后计算您的 blob。然后将该 blob 修补到此部分。稍后,当您检查 ELF 的完整性时,就好像该部分充满了 NUL 并再次计算 blob。最后,比较计算的 blob 和存储在 section 中的 blob。

【讨论】:

【参考方案2】:

没有具体回答您的问题,但我用于此类事情的一种方法是链接占位符块,然后在之后修补正确的值。

我知道这不是您想要做的,但这是一种非常简单且可靠的方法。并且具有与工具链/平台无关的主要优势。

【讨论】:

我考虑过这种方法,因为我事先知道块的大小。但是,这个占位符 blob 的存在会改变第一个链接的结果,我相信这不会发生。 Blob 的要点是将完整性检查数据附加到转储二进制文件的末尾。虚拟 blob 的存在使这变得棘手,尽管并非不可能。我正在寻找一种更清洁的方法。 @user2600958 你的最终解决方案是什么?

以上是关于如何使用 OBJCOPY 的 --add-section 开关?的主要内容,如果未能解决你的问题,请参考以下文章

如何避免 objcopy 炸毁文件?

Objcopy,它如何进行二进制输出?

如何在 cmake 中使用 self ld、objcopy 和 ar?

如何使 `objcopy` 支持 efi-app 目标?

如何使用objcopy或libelf将elf文件的一部分替换为另一部分,以便将其加载到内存中?

使用 objcopy 将文本文件添加到二进制文件,但 objcopy 抱怨架构