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

Dav*_*tte 2 c linux search-path

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

Jon*_*ler 5

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目录).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()

另请参阅下面评论中的注释......完整的主题适用于从平台到平台的各种变化.