将.so静态链接到可执行文件

时间:2016-06-20 13:45:01

标签: linux shared-libraries

我有一些非常特殊的需求: 是否可以将.so文件静态链接到构建的可执行文件,以便可执行文件不再动态链接此.so

1 个答案:

答案 0 :(得分:0)

ELF共享对象应该以某种方式dynamically linked并且实际上应该包含position-independent code(这是强烈建议的,但理论上不是强制性的)。另请参阅this

有关所有细节,请阅读Drepper的论文How To Write Shared Libraries(超过100页)。

另请阅读Program Library HOWTOC++ dlopen minihowto

如果缺少共享库,也许您只是想让可执行文件能够做一些合理的事情。然后你可以在运行时使用dlopen(3)显式加载它(作为插件),很好地处理失败错误情况,并在成功时使用dlsym(3)从中获取相应的符号。另请参阅ld-linux.so(8)elf(5)execve(2)mmap(2)

也许你想要一个完全静态的ELF可执行文件。然后你应该这样构建它(并且只使用静态库)。

也许您想从共享对象中提取文本,数据和重定位信息(使用objdumpreadelf或使用libbfd或{的某些代码可能会非常糟糕{1}})并重建一些可链接的目标文件(可能带有libelf或一些痛苦的ld -r脚本)。我不确定它在所有情况下都是完全可行的(例如,当ld本身具有动态依赖关系时),这肯定是痛苦的。

PS。 请提出更多问题,并解释为什么你真的在问。我做了一些盲目的猜测。我想你可以访问源代码,并且可以更改其中的一部分。