我已经剥离了现有的Linux共享对象文件(共享库)。我想生成一个新版本的库,其中包含一些附加功能。我曾希望以下类似的东西可行,但不会:
ld -o newlib.so newfuncs.o --whole-archive existinglib.so
我没有现有库的来源。我可以得到它,但是获得具有必要依赖关系的完整构建环境对于看似简单的问题需要付出很多努力。
答案 0 :(得分:2)
您可能希望通过使用预加载来加载对象,尝试从稍微不同的角度进行此操作。
将LD_PRELOAD设置为指向新对象
export LD_PRELOAD=/my/newfuncs/dir/newfuncs.o
并通过LD_LIBRARY_PATH以相同的方式指定现有库。
然后,这将指示运行时链接程序在查找位于LD_LIBRARY_PATH中的对象之前在对象中搜索所需的符号。
BTW您可以在对象中调用,然后调用在未指定LD_PRELOAD对象或对象时将被调用的函数。这就是为什么这有时被称为插入。
这是多少内存分配分析工具的工作原理。它们介绍了malloc()和free()的版本,它们记录对alloc()和free()的调用,然后调用实际的系统alloc和free函数来执行内存管理。
关于使用LD_PRELOAD的互联网上有很多教程。最原始的和最好的之一仍然是“Building library interposers for fun and profit”。虽然写于九年前并为Solaris编写,但它仍然是一个很好的资源。
HTH祝你好运。答案 1 :(得分:1)
完全没有经过考验的想法:
# mv existinglib.so existinglib-real.so
# ld -o exlistinglib.so -shared newfuncs.o -lexistinglib-real
动态链接器在加载期望加载existinglib.so
的程序时,将找到您的版本,并加载它所依赖的existinglib-real.so
。它没有完全实现你的问题的既定目标,但看起来好像它对加载库的程序有效。
答案 2 :(得分:0)
共享库不是归档,它们更像是可执行文件。因此,您无法以与.a静态库相同的方式将额外内容填充到其中。
答案 3 :(得分:0)
简短回答:完全你要求的东西无法完成。
更长的答案:取决于为什么你想要这样做,以及existinglib.so
的确切联系方式,你可能会接近所需的行为。除了已经提到的LD_PRELOAD
和重命名existinglib.so
之外,您还可以使用链接描述文件(cat /lib/libc.so
来查看我的意思)。