我读了which
相当于共享库和可执行文件在运行时在哪里寻找共享对象, 但有没有列出所有目录的命令将在其中搜索共享库?
类似于自动计算第二个问题中解释的所有列表的命令。
答案1
短:无
long:相关的环境变量取决于系统和配置。对于给定的系统/配置,您可以编写一个脚本来执行此操作。
可执行文件在运行时在哪里寻找共享对象提供了一些见解,但并不完整。它提到了 OSX 和 Solaris,但重点关注 Linux,并指出了两个资源:
- 程序库 HOWTO:3. 共享库(其中提到
LD_LIBRARY_PATH
但没有提及不太常见的LD_LIBRARY_PATH_64
,并且还单行提到了路径)。 - ld.so、ld-linux.so* - 动态链接器/加载器,其中再次提到了一些环境变量和路径。
您还会发现这些很有用:
- ldconfig - 配置动态链接器运行时绑定, Linux 特定的(OSX 或 Solaris 都不是):
ldconfig
在文件中创建在命令行指定的目录中找到的最新共享库的必要链接和缓存/etc/ld.so.conf
,并在受信任的目录中,/lib
和/usr/lib
(在某些 64 位架构上,例如 x86-64、lib 和/usr/lib
是 32 位库的可信目录,而/lib64
和/usr/lib64
用于 64 位库)。 - 共享库如何在混合 64 位/32 位系统中工作?
- shlib脚本,ncurses 中的一个实用程序脚本,列出了用于指定共享库所在位置的各种环境变量。
尤其, ”sudo ldconfig -v
”
-v
,--verbose
详细模式。打印当前版本号、扫描的每个目录的名称以及创建的任何链接。覆盖安静模式。
这是关闭回答了所问的问题,但提供了很多无关的信息。 (虽然 BSD 使用它,但它主要是 Linux 特定的——但不同,请参阅手册页)。如果您对其输出格式做出一些假设,您可以使用以下命令从中获取目录
sudo ldconfig -v 2>/dev/null | grep ':$' |sed -e 's/://'
(在一个系统上)
/usr/local/lib
/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu
/lib
/usr/lib
回顾一下:没有命令,但您可以制作一个脚本,该脚本取决于系统。
答案2
在 GNU 系统上
ldconfig -p | tail -n +2 | grep -o '/.*/' | sort -u
将为您提供在缓存中找到动态库的目录。您可以将这些添加到$LD_LIBRARY_PATH
.这里的zsh
语法是:
(
ldconfig -p | tail -n +2 | grep -o '/.*/'
[ -n "$LD_LIBRARY_PATH" ] && printf '%s/\n' ${${(s/:/)LD_LIBRARY_PATH}:A}
) | sort -u
另请注意,至少在我的 x86_64 GNU 系统上,对于 64 位可执行文件,对于每个目录,它还会在$dir/x86_64
、$dir/tls
和中搜索$dir/tls/x86_64
。
另请注意,可执行文件可以对其中的库的路径进行硬编码。仍然使用 GNU 动态链接器,您可以用来LD_DEBUG=libs
获取搜索路径,例如使用类似的东西(此处针对我的 GNU/Linux 系统上的 64 位 ELF 可执行文件):
$ LD_DEBUG=libs /lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 --inhibit-cache /bin/true 2>&1 |
sed '/.*search path=/!d;s///;s/[[:blank:]]*([^)]*)$//' |
tr : '\n' |
sort -u
/home/stephane/lib
/home/stephane/lib/tls
/home/stephane/lib/tls/x86_64
/home/stephane/lib/x86_64
/lib
/lib/tls
/lib/tls/x86_64
/lib/x86_64
/lib/x86_64-linux-gnu
/lib/x86_64-linux-gnu/tls
/lib/x86_64-linux-gnu/tls/x86_64
/lib/x86_64-linux-gnu/x86_64
/usr/lib
/usr/lib/tls
/usr/lib/tls/x86_64
/usr/lib/x86_64
/usr/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu/tls
/usr/lib/x86_64-linux-gnu/tls/x86_64
/usr/lib/x86_64-linux-gnu/x86_64
答案3
我不知道有这样的命令。但是,/etc/ld.so.conf
可能所有文件/etc/ld.so.conf.d/
加上您在其中找到的任何内容$LD_LIBRARY_PATH
都会产生问题的答案在哪里搜索共享库?。
注意:可执行文件可能会定义附加或替代搜索路径。
您还可以使用ldd
搜索路径中的所有文件来查看动态链接器实际搜索的位置。以下方法需要一段时间,而且肯定不会获奖:
ldd /bin/* /usr/bin/* /sbin/* /usr/sbin/* 2>/dev/null | grep '=>' | awk '{print $3;}' | xargs dirname | sort -u
答案4
我不知道会列出所有共享库的特定命令,但您可以通过运行来使用一些“模糊”解决方法
which <non-existent command/alias>
并查看输出,例如:
[$]› which fake-command
/usr/bin/which: no fake-command in (/usr/local/sbin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin)
或查找任何以 *bin 结尾的目录
find / -name *bin -type d
但这很可能会带来太多不在共享库中的结果