【问题标题】:Is it possible to get location of dependent libraries from within code是否可以从代码中获取依赖库的位置
【发布时间】:2019-01-03 10:25:21
【问题描述】:

我想使用 dlopen 函数从我的程序中加载一些依赖库。是否有可能知道这些库的实际位置?

例如,ldd 显示系统中所有带有路径的依赖库。它是如何工作的?是否可以通过我的 C++ 代码中的一些调用获取我需要使用 dlopen 加载的对应库的路径?

【问题讨论】:

  • 您要加载的是“已安装”的库吗?
  • ldd 使用 LD_LIBRARY_PATH 获取所需库的路径,对于 dlopen,它可以位于文件系统上的任何位置。
  • 是的。例如,它可能是我在某些时候并不总是需要的某种运行时库(例如 nvidia cuda)。

标签: c++ linux shared-libraries executable


【解决方案1】:

来自man dlopen 可以阅读:

函数 dlopen() 加载以 null 结尾的字符串文件名命名的动态库文件,并为动态库返回一个不透明的“句柄”。如果 filename 为 NULL,则返回的句柄用于主程序。如果文件名包含斜杠(“/”),则将其解释为(相对或绝对)路径名。否则,动态链接器按如下方式搜索库(有关详细信息,请参阅 ld.so(8)):

  • (仅限 ELF)如果调用程序的可执行文件包含 DT_RPATH 标记,但不包含 DT_RUNPATH 标记,则搜索 DT_RPATH 标记中列出的目录。

  • 如果在程序启动时,环境变量 LD_LIBRARY_PATH 被定义为包含以冒号分隔的目录列表,则搜索这些目录。 (作为一项安全措施,对于 set-user-ID 和 set-group-ID 程序,此变量将被忽略。)

  • (仅限 ELF)如果调用程序的可执行文件包含 DT_RUNPATH 标记,则搜索该标记中列出的目录。

  • 检查缓存文件 /etc/ld.so.cache(由 ldconfig(8) 维护)以查看它是否包含文件名条目。

  • 搜索目录/lib/usr/lib(按此顺序)。

因此,如果所需的库已“安装”,则只需一个简单的dlopen("foobar.so", flag)

【讨论】:

    猜你喜欢
    • 2014-09-14
    • 1970-01-01
    • 2012-03-24
    • 1970-01-01
    • 2011-03-29
    • 2022-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多