gpt4 book ai didi

linker - 如何使用额外的目标文件重新链接现有共享库

转载 作者:行者123 更新时间:2023-12-02 08:29:25 26 4
gpt4 key购买 nike

我现有的 Linux 共享对象文件(共享库)已被删除。我想生成一个新版本的库,其中包含一些附加功能。我曾希望像下面这样的东西会起作用,但没有:

ld -o newlib.so newfuncs.o --whole-archive existinglib.so

我没有现有库的源代码。我可以得到它,但是对于一个看似简单的问题来说,获得一个具有必要依赖项的完整构建环境将需要付出很大的努力。

最佳答案

您可能想尝试通过使用预加载来加载对象,从稍微不同的角度来解决这个问题。

设置 LD_PRELOAD 以指向您的新对象

export LD_PRELOAD=/my/newfuncs/dir/newfuncs.o

并通过 LD_LIBRARY_PATH 以相同的方式指定现有库。

这将指示运行时链接器在查找位于 LD_LIBRARY_PATH 中的对象之前在对象中搜索所需的符号。

顺便说一句,您可以在对象中进行调用,然后调用如果未指定 LD_PRELOAD 对象或对象就会调用的函数。这就是为什么这有时被称为插入。

这就是许多内存分配分析工具的工作原理。它们插入了 malloc() 和 free() 的版本,记录对 alloc() 和 free() 的调用,然后调用实际的系统 alloc 和 free 函数来执行内存管理。

互联网上有很多有关使用 LD_PRELOAD 的教程。原始且最好的之一仍然是“Building library interposers for fun and profit”。尽管是九年前写的并且是为 Solaris 编写的,但它仍然是一个优秀的资源。

HTH,祝你好运。

关于linker - 如何使用额外的目标文件重新链接现有共享库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2616637/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com