实际上有两个问题围绕着使用--add-section。简单的就是标题。根据我的阅读,我无法弄清楚如何执行--add-section。
要使用add-section,我必须传递一个部分名称。如果我使用现有的部分名称,程序将回复“无法添加部分'.data':文件格式错误。”也许我只需要传递另一个参数。如果我使用新的部分名称,我更愿意这样做,我警告说“分配部分'.blob'不在分段中。”
现在,除了“不在段”警告之外,我已经让我的功能正常工作了。我想弄清楚是否有合法的方法将此blob放入可执行文件中。我会链接它,但这不是那么容易,因为我添加的数据是从可执行文件本身的内容生成的。
第二个问题是我真正关心的问题。有没有办法执行以下操作,因为在链接完成之前无法计算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会更清晰。
更新:只要重新链接不会更改第一个链接生成的程序部分中的某些内容,此最后一个策略就可以运行。它不是第一次尝试,但它可能解决它。因此,希望使用--add-section添加此blob而不是通过第二个链接。
答案 0 :(得分:2)
您可以添加该部分,填充NUL,然后计算您的blob。然后将该blob修补到此部分。稍后,当您检查ELF的完整性时,请执行该部分充满NUL并再次计算blob。最后,比较存储在section。中的计算blob和blob。
答案 1 :(得分:0)
没有具体回答您的问题,但我过去常常使用的一种方法是在占位符块中进行链接,然后在之后修补正确的值。
我知道这不是你想要做的,但这是一种非常简单可靠的方法。并且具有与工具链/平台无关的主要优势。