c - 在共享库搜索路径中查找目录

标签 c linux search-path

我想要 dlopen() 特定目录中的每个共享库。为了做到这一点,
检索 linux 的库搜索路径的最干净的方法是什么。或者是否有更快的方法在该路径中查找特定目录?
posix 会更好。

最佳答案

POSIX 不支持在共享库搜索路径上查找目录的机制(例如,它不强制要求 LD_LIBRARY_PATH),因此任何解决方案本质上都是特定于平台的。

Linux 存在一些问题,因为要使用的值可能基于 /etc/ld.so.conf 的内容以及 LD_LIBRARY_PATH 中的任何运行时值环境变量;其他系统存在类似的问题。默认位置也因系统而异 - /lib/usr/lib 通常用于 32 位 Linux 机器,但 /lib64/usr/lib64 至少在一些 64 位机器上使用。但是,其他平台将其他位置用于 64 位软件。例如,Solaris 使用 /lib/sparcv9/usr/lib/sparcv9(尽管文档提到了 /lib/64/usr/lib/64,它们是指向 sparcv9 目录的符号链接(symbolic link))。 Solaris 还有环境变量 LD_LIBRARY_PATH_64LD_LIBRARY_PATH_32。 HP-UX 和 AIX 传统上使用 LD_LIBRARY_PATH 以外的其他变量——SHLIB_PATHLIBPATH,IIRC——尽管我相信 AIX 现在使用 LD_LIBRARY_PATH 也是。而且,在 Solaris 上,配置共享库的工具是“crle”(配置运行时链接环境),/etc/ld.so.conf 的模拟是 /var/ld/ld.config/var/ld/64/ld.config。当然,共享库的扩展也各不相同(.so.sl.dylib.bundle 等)。

因此,您的解决方案将特定于平台。您将需要决定默认位置、要读取的环境变量、要读取的配置文件以及相关的文件扩展名。鉴于这些,那么它主要是一个 SMOP - 简单的编程问题:

  • 对于由任何来源命名的每个目录:
    • 打开相关子目录(opendir())
      • 依次读取每个文件名(readdir())
      • 在相关文件的路径上使用dlopen()
      • 做任何与您相关的分析。
      • 使用dlclose()
    • 使用closedir()

另请参阅下面评论中的注释...完整的主题适度地充满了不同平台的变化。

关于c - 在共享库搜索路径中查找目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4213857/

相关文章:

.net - 为什么以及在哪里使用 WCF

linux - 回溯 pwd 直到在 Linux 上找到表达式

postgresql - 使用 URL 中的 currentSchema,search_path 无法按预期工作

Delphi - 定位编译器无法在其默认路径中搜索的单元的路径

postgresql - search_path 如何影响标识符解析和 "current schema"

c - 在 C 中,这个宏定义了什么?

c - 在 void 函数中通过引用而不是值传递结构

将时间戳中的秒转换为纳秒并使用有符号整数表示

Python 应用程序权限被拒绝

c - dup() 后跟来自多个线程或进程的 close()