如何将动态链接的应用程序转换为静态链接的应用程序?

7

我有一个应用程序,比如说gedit,它是动态链接的,而且我没有源代码。所以我不能按照自己的意愿编译它。我想做的是将其静态链接并移动到没有必要的库来运行该应用程序的系统上。那么这是否可能,如何实现呢?

1个回答

1
理论上是可能的。你基本上需要做与动态链接器相同的工作,但会有一些修改,即:
  • 从原始文件中转储所有部分
  • 解析符号
  • 定位库
  • 不要将它们加载到内存中,而是将它们组装成一个“虚拟映像”
  • 解决内部链接
  • 将整个东西转储到一个独立的文件中。
因此,objdumpreadelfobjcopy将是你的一些朋友。
这项任务并不容易,结果既不会自动化,也不稳定(可能)。
你可能想要查看this code,由其他人尝试相同的操作,实际上是通过截取动态链接器(即上述所有步骤,除了最后一个)并将结果转储到磁盘上来完成的。
它基于this tool,所以任何人都可以打赌它是否适用于最新的内核。

(可能不行 - 你至少需要打补丁来反映新的结构。这是我的尝试购买者自负).


我明白了。所以不能仅仅从 ELF 文件中转储对象,然后静态链接它们。 - cosimo
“这个工具”的链接已经失效,最后一个链接是它的补丁。” - DavidJ
@DavidJ,二进制文件仍可通过Wayback Machine获取(对于二进制文件,URL为https://web.archive.org/web/20130114222319if_/http://dagobah.ucc.asn.au/wacky/cryopid-0.5.9.1-x86_64.tar.gz)。 - LSerni

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接