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

时间:2010-11-18 10:36:54

标签: c linux search-path

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

2 个答案:

答案 0 :(得分:5)

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

Linux存在一些问题,因为要使用的值可能基于/etc/ld.so.conf的内容以及LD_LIBRARY_PATH环境变量中的任何运行时值;其他系统存在类似问题。默认位置也因系统而异 - 对于32位Linux计算机通常/lib/usr/lib,但至少在某些64位计算机上使用/lib64/usr/lib64 。但是,其他平台使用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()

另见下面评论中的注释......完整的主题恰好充满了各个平台之间的差异。

答案 1 :(得分:1)

我不确定是否可以这样做并且可移植。由于这个问题与Linux有关,因此可移植性可能不是最重要的。然后我不明白POSIX约束。你能澄清一下吗?

您可能必须实施man 8 ld.so中详细介绍的搜索功能,其中包括扫描/etc/ld.so.conf以及LD_LIBRARY_PATH或make /lib/ld.so你想要什么,解析输出。一个不完全漂亮的命令行可能是:

export LD_PRELOAD=THISLIBRARYSODOESNOTEXIST
strace -s 4096 /bin/true 2>&1 | sed -n 's/^open("\([^"]*\)\/THISLIBRARYSODOESNOTEXIST".*$/\1\/YOURSUBDIRHERE/gp'
unset LD_PRELOAD

然后,您可以使用POSIX调用opendir(3)readdir(3)枚举文件。