我已经构建了一个linux共享对象,我将其注入到第三方程序中,以使用LD_PRELOAD拦截一些动态函数调用。
第三方程序使用位于某个路径的SO“libabc.so”。我注入的SO使用另一个SO,也称为“libabc.so”,位于另一条路径上(基本相同但代码差异很小)。
我现在的问题是,对libabc.so中出现的函数“def”的调用总是由第一个解决。 (大概是因为它首先加载了?!)如何用第二个libabc.so来解决它们?
非常感谢!
答案 0 :(得分:2)
除非我以前做过更改,否则您需要dlopen()要传递调用的库并手动调用该函数,例如;
handle = dlopen("/path/to/libabc.so", RTLD_LAZY);
otherDef = dlsym(handle, "def");
orderDef(parameter);
在LinuxJournal处有一个完整的例子如何做到这一点。
答案 1 :(得分:2)
如果您只想使用一个 libabc.so
版本,则可以始终使用LD_PRELOAD
将其与您自己的共享对象一起加载。
如果您想使用多个版本,您可以选择以下几种方法:
在共享对象中使用dlopen()
来加载该库。由于您已创建了函数注入对象,因此您应该熟悉此过程。这是更通用和更强大的方式 - 你甚至可以混合和放大匹配来自不同库版本的函数。
对共享对象链接的库版本使用不同的DT_SONAME
。不幸的是,这需要(稍微)更改该库的构建系统并重新编译。
将您的共享对象静态链接到相关库。并非总是可行,但不需要修改相关库。这个替代方案的主要问题是,在库中的任何更改之后都应该重新链接共享对象,以便将更改引入。
警告:您可能需要使用自定义链接描述文件或特定链接器选项来避免符号冲突。