如何加载共享库而不加载它的依赖关系?

说我有一个库libfoo.so.1 ,这取决于libbar.so.1 (根据ldd )。 但是, libbar.so.1目前不可用。 我的应用程序需要在libfoo.so.1调用一个不需要libbar.so.1的函数。

有没有办法加载libfoo.so.1 ,解决函数符号,然后调用它没有libbar.so.1满足依赖? 这是一个“我知道我在做什么,只是让我做”的情况。 我尝试了RTLD_LAZY标志,但它仍然会尝试加载libbar.so.1库之前加载符号。


编辑

这是确切的情况。

我们有3名球员:

  • libbar.so.1 ,位于不在LD_LIBRARY_PATHldconfig中的path中的共享库,其所有依赖关系都已parsing
  • libfoo.so.1 ,一个共享库位于不同于libbar目录中,但依赖于libbar 。 在运行时, libfoo会知道libbar
  • App ,一个在运行时需要加载libfoo的二进制应用程序。

App不知道在哪里可以findlibbar ,但知道libfoo知道。 我试图完成的是在libfoo有一个init函数,它将简单地将App的当前工作目录更改为libbar所在的位置,以最终解决所有的依赖关系,并使每个人都感到高兴。

libfoo 最终将需要在libbar调用东西,而不是在这个init函数中。 我不认为创build存根是可行的,因为这些符号最终需要解决实际的function。

Solutions Collecting From Web of "如何加载共享库而不加载它的依赖关系?"

那么,即使使用RTLD_LAZY ,变量仍然可以解决,所以一般来说,你需要连接所有的库。 看起来像你应该创建一个存根libbar.so.1没有功能,可以找到链接器。

只是一个想法,你有没有想过插入依赖 – 简单地创建一个具有相同的签名,参数等相同的功能,让链接器解决这个功能,忽略libbar.so.1? 既然你没有提到这个,我想我会提出这个建议。

希望这有助于,最好的问候,汤姆。

另一个想法是:从libfoo.so.1提取(使用ar(1))必要的函数,将其转换为.o或另一个.so文件,然后链接到该提取的帮助? 我假设对libbar.so.1的引用是在libfoo函数中,而不是从程序调用(甚至间接)。

这里的实际要求是什么? 仅仅链接一个图书馆并没有太多的工作,通常是良性的。 你缺乏图书馆吗? 只需创建一个同名的存根库。 你想控制或抢先使用库中的符号? 把它们放在另一个库(使用正确的版本标签!)和LD_PRELOAD它。

我想这里的元问题是我看不到有什么价值能够抢占依赖关系。 这只是一个帮手功能。

使用dlopen加载库和dlsym来获得你需要的功能。