代码之家  ›  专栏  ›  技术社区  ›  Fred

如何在不加载其依赖项的情况下加载共享库?

  •  13
  • Fred  · 技术社区  · 15 年前

    假设我有一个图书馆 libfoo.so.1 ,这取决于 ldd libbar.so.1 . 然而, LBBar,S. 1 目前不可用。我的应用程序需要在 LIBOO,S. 1 这不需要 LBBar,S. 1 完全。

    有装东西的方法吗 LIBOO,S. 1 ,解析函数符号,然后在不具有 LBBar,S. 1 满足依赖?这是一个“我知道我在做什么,就让我已经做了”的例子。我尝试了RTLD U LAZY标志,但它仍然试图加载 LBBar,S. 1 图书馆以前 加载符号。


    编辑

    具体情况如下。

    我们有3个玩家:

    • LBBar,S. 1 ,位于路径中的共享库不在 LD_LIBRARY_PATH ldconfig ,并且其依赖项都已解决
    • LIBOO,S. 1 ,位于不同目录中的共享库 libbar ,但这取决于 利巴尔 .在运行时, libfoo 会知道在哪里 伦敦银行同业拆借利率 .
    • App ,需要加载的二进制应用程序 利伯霍 在运行时的某个时刻。

    应用程序 不知道在哪能找到 利巴尔 但我知道 利布福 知道。我要做的是在 利布福 那只会改变 应用程序 的当前工作目录 利巴尔 最终解决所有依赖关系,让每个人都快乐。

    利布福 最后 需要打电话进来 利巴尔 ,只是不在这个init函数中。我不认为创建存根会起作用,因为符号最终需要解析为 真实的 功能。

    5 回复  |  直到 15 年前
        1
  •  4
  •   Adam Goode    15 年前

    好吧,即使用 RTLD_LAZY ,所以一般来说,您需要链接所有库。似乎您应该创建一个存根 libbar.so.1 它没有任何功能,链接器可以找到它。

        2
  •  0
  •   t0mm13b    15 年前

    只是一个想法,你有没有想过插入依赖关系——简单地用相同的签名、参数等创建一个相同的函数,让链接器解析这个函数并忽略libbar.so.1?既然你没提这个,我想我建议你提这个。

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

        3
  •  0
  •   mpez0    15 年前

    另一种想法是:从 libfoo.so.1 ,或者进入 .o 或进入另一个 .so 文件,然后根据提取帮助链接?我假设参考 libbar.so.1 在libfoo函数中,该函数不是从程序中调用的(甚至是间接调用的)。

        4
  •  0
  •   Andy Ross    15 年前

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

    我想这里的元问题是,我不知道能够抢占依赖链接有什么价值。它只是一个辅助函数。

        5
  •  -1
  •   Richard Pennington    15 年前

    使用dlopen加载库,使用dlsym获取所需的功能。