相关疑难解决方法(0)

如何将目标文件"链接"到可执行/编译二进制文件?

问题

我希望将一个目标文件注入现有的二进制文件中.作为一个具体的例子,考虑一个来源Hello.c:

#include <stdlib.h>

int main(void)
{
    return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)

它可以编译为名为Hellothrough 的可执行文件gcc -std=gnu99 -Wall Hello.c -o Hello.此外,现在考虑Embed.c:

func1(void)
{
}
Run Code Online (Sandbox Code Playgroud)

Embed.o可以从此创建目标文件gcc -c Embed.c.我的问题是如何将一般插入Embed.oHello以这样的方式使必要的位置进行,并适当ELF内部表(如符号表,PLT等)正确修补?


假设

可以假设要嵌入的目标文件已经静态链接其依赖关系.可以假设任何动态依赖项(例如C运行时)也存在于目标可执行文件中.


目前的尝试/想法

  • 使用libbfd从对象文件复制到节二进制.我对此所取得的进展是,我可以使用原始二进制文件中的部分和目标文件中的部分创建一个新对象.问题是,由于目标文件是可重定位的,因此无法在不先执行重定位的情况下将其部分正确复制到输出.
  • 将二进制文件转换回目标文件并重新链接ld.到目前为止,我尝试使用objcopy来执行转换objcopy --input elf64-x86-64 --output elf64-x86-64 Hello Hello.o.显然这不符合我的意图,因为那样ld -o Hello2 Embed.o Hello.o会导致ld: error: Hello.o: unsupported ELF file type 2.我想这应该是预期的,因为Hello它不是一个目标文件.
  • 找到执行此类插入的现有工具?

理由(可选阅读)

我正在制作一个静态可执行编辑器,其目的是允许将任意用户定义的例程检测到现有的二进制文件中.这将分两步进行:

  1. 将对象文件(包含用户定义的例程)注入二进制文件.这是一个必需的步骤,不能通过注入共享对象等替代方法来解决. …

c linux linker

12
推荐指数
2
解决办法
1万
查看次数

标签 统计

c ×1

linker ×1

linux ×1