【发布时间】:2011-01-01 19:47:21
【问题描述】:
假设我有一个库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函数中。我不认为创建存根会起作用,因为符号最终需要解析为 real 函数。
【问题讨论】:
-
很好,您提到了 RTLD_LAZY - 它表明您已经尝试过并且阻止了我在建议它的红鲱鱼路径上继续前进。
标签: c linux shared-libraries elf