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

仅当满足依赖关系时加载共享库

  •  6
  • tmlen  · 技术社区  · 7 年前

    我有一个链接到两个共享库的可执行文件,每个共享库都依赖于系统共享库(在本例中,这些是OpenCL和CUDA运行时库,但这不会影响问题)

         +--> libA.so  --->  libOpenCL.so (on system)
    Exe -|
         +--> libB.so  --->  libcudart.so (on system)
    

    Exe ,以及 libA.so libB.so 分发给用户。用户可能没有 libOpenCL.so libcudart.so 安装在他们的系统上。

    执行 应该能够以任何方式启动,并在运行时检测到,例如。 利巴索 无法加载,因为不满足其依赖项。

    dlopen() ,它检测加载是否失败。

    执行 仍然可以发射如果 利巴索

    2 回复  |  直到 7 年前
        1
  •  5
  •   R.. GitHub STOP HELPING ICE    7 年前

    如果你想这样做,你需要 dlopen . 在程序加载时,除了执行失败之外,没有用于错误报告的向量,也没有任何合理的选择,如果缺少定义,则丢失库中的符号将解析为什么。

        2
  •  4
  •   yugr    7 年前

    libA libB 针对中可能丢失的DLL delay-loaded mode . 这将阻止运行时系统加载DLL,直到您的程序实际调用其函数之一。

    Linux没有现成的延迟加载功能,但是您可以通过为来自的函数添加虚拟包装器来模拟它 libOpenCL.so libcudart.so )进入 (或 ). 包装纸会 dlopen 第一次调用所需的库并跳转到真正的函数实现。这种包装器可以手工编写,也可以通过 Implib.so

    # This will generate libOpenCL.tramp.S and libOpenCL.init.c
    # which need to be linked into libA.
    $ implib-gen.py libOpenCL.so
    

    因此 利巴 将不再直接与 除非调用使用OpenCL的函数,否则程序运行正常。