假设我有一个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_PATH
或ldconfig
之外的路径中的共享库,并且所有依赖项都已解决libfoo.so.1
,位于与libbar
不同的目录中的共享库,但它取决于libbar
。在运行时,libfoo
将知道在哪里可以找到libbar
。 App
,这是一个二进制应用程序,需要在运行时的某个时刻加载libfoo
。 App
不知道在哪里可以找到libbar
,但是知道libfoo
知道。我要完成的工作是在libfoo
中拥有一个init函数,该函数只需将App
的当前工作目录更改为libbar
所在的位置,以最终解决所有依赖关系并使每个人高兴。libfoo
最终将需要调用libbar
中的内容,只是不需要在此init函数中。我不认为创建 stub 会起作用,因为符号最终将需要解析为实际功能。 最佳答案
好了,即使使用RTLD_LAZY
,变量仍然可以解析,因此通常您确实需要链接所有库。似乎您应该创建一个没有功能的 stub libbar.so.1
,并且链接器可以找到它。
关于c - 如何在不加载依赖库的情况下加载共享库?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2009183/