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

时间:2013-07-24 00:47:29

标签: embedded binutils linker-scripts

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

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

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

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

  1. 链接ELF文件
  2. 从ELF文件和其他数据生成blob
  3. 将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

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

    我发现我可以用第二个链接完成这个专长,但是objcopy会更清晰。

    1. 链接ELF文件
    2. 从ELF文件和其他数据生成blob
    3. 重新链接ELF文件,包括新的blob.o
    4. 更新:只要重新链接不会更改第一个链接生成的程序部分中的某些内容,此最后一个策略就可以运行。它不是第一次尝试,但它可能解决它。因此,希望使用--add-section添加此blob而不是通过第二个链接。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

没有具体回答您的问题,但我过去常常使用的一种方法是在占位符块中进行链接,然后在之后修补正确的值。

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