【问题标题】:Load dependent library with dlopen in case of custom library location在自定义库位置的情况下使用 dlopen 加载依赖库
【发布时间】:2020-04-24 20:47:16
【问题描述】:

我的程序使用来自某个供应商的“libone.so”对象。它在系统中具有自定义位置。程序搜索这个库位置,然后用 dlopen 打开它。当“libone.so”在后台做一些事情并开始加载“libsecond.so”时会出现问题。我通过 strace 看到 dlopen 尝试通过为 ldconfig 定义的标准路径查找“libsecond.so”,而不使用“libone.so”的位置作为可能的路径之一。

是否可以在“libone.so”中配置 dlopen 调用,以便从“libone.so”的位置加载“libsecond.so”? (“libsecond.so”与“libone.so”位于同一路径)

ps。在程序启动之前,我无法影响系统配置(ldconf 路径)。我需要在我的程序中解决这个问题。

pss。如果我将'libone.so'的路径添加到/etc/ld.so.conf.d/custom.conf,那么问题就解决了。

【问题讨论】:

  • libsecond.so 是“自动”加载的还是 libeone.so 做了一些魔法(像你一样)?
  • 能否设置/修改执行环境? LD_LIBRARY_PATH 环境变量可以解决问题。
  • @MaxLanghof libsecond.so 由 libone.so 自动加载。如果两个库都位于标准路径(比如 /usr/lib),那么没问题。我的情况是这个库的位置是自定义的,我加载第一个库,第二个库应该由第一个加载。
  • @JL.Sanchez 我尝试在我的程序中使用从 stdlib.h 调用 LD_LIBRARY_PATH 的 'setenv' 在第一个库的“dlopen”之前执行此操作,但它没有帮助。我可以'不要提前设置 LD_LIBRARY_PATH 并且不能像这样启动我的程序:LD_LIBRARY_PATH=my_path ./my_program

标签: c++ linux dll shared-libraries dlopen


【解决方案1】:

我认为你有三个选择:

  1. 在执行二进制程序之前创建一个设置 LD_LIBRARY_PATH 的脚本文件(例如 bash、Python 等)并使其可执行。

  2. 使用-rpath链接器选项,在LD_LIBRARY_PATH之外为动态链接器使用的搜索路径添加一个固定的绝对路径。

  3. dlopen 具有自下而上的绝对路径。即首先是 dlopen 依赖项,然后是 dlopen 主库。

我更喜欢第一个选项。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-11
    • 2012-04-06
    • 1970-01-01
    • 2012-09-27
    • 2011-10-09
    相关资源
    最近更新 更多