假设我有一个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_PATHldconfig之外的路径中的共享库,并且所有依赖项都已解决
  • 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/

    10-11 15:41