我想要dlopen()特定目录中的每个共享库。为了做到这一点,
什么是检索linux库搜索路径最干净的方法。或者是否有更快的方法在该路径中找到特定目录?
posix会更好。
答案 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_64
和LD_LIBRARY_PATH_32
。 HP-UX和AIX传统上使用除LD_LIBRARY_PATH
- SHLIB_PATH
和LIBPATH
,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)
枚举文件。