13

假设我有一个库libfoo.so.1,它(根据ldd)依赖于libbar.so.1. 但是,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_PATHor中的路径中的共享库ldconfig,并且其依赖关系都已解决
  • libfoo.so.1,一个共享库,位于与 不同的目录中libbar,但取决于libbar. 在运行时,libfoo会知道在哪里定位libbar.
  • App,一个二进制应用程序,需要libfoo在运行时的某个时间点加载。

App不知道在哪里可以找到libbar,但知道libfoo知道。我想要完成的是拥有一个 init 函数,libfoo其中只需将App' 的当前工作目录更改libbar为最终解决所有依赖项并使每个人都开心的位置。

libfoo最终需要调用 in 的东西libbar而不是在这个 init 函数中。我不认为创建存根会起作用,因为符号最终需要解析为实际功能。

4

5 回答 5

4

好吧,即使使用 ,变量仍然可以解析RTLD_LAZY,因此通常您确实需要链接所有库。似乎您应该创建一个libbar.so.1没有功能并且可以由链接器找到的存根。

于 2010-01-05T21:30:09.733 回答
0

只是一个想法,您是否考虑过插入依赖项 - 只需创建一个具有相同签名、参数等的相同函数,然后让链接器解析此函数并忽略 libbar.so.1?既然你没有提到这个,我想我会建议这个。

希望这会有所帮助,最好的问候,汤姆。

于 2010-01-05T21:32:14.597 回答
0

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

于 2010-01-05T21:47:51.830 回答
0

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

我想这里的元问题是我看不到能够抢占依赖链接的价值。它只是一个辅助函数。

于 2010-01-05T21:53:11.820 回答
-1

使用 dlopen 加载库并使用 dlsym 获取您需要的功能。

于 2010-01-05T21:40:50.603 回答