我知道我可以用 ldd 打印出 exe 链接的 so 文件。我想要的是另一种方式。
我目前的方法是运行类似 however 的程序find / -type f -executable -exec ldd {} \; | grep my_lib.so
,但由于必须搜索所有内容,因此需要很长时间才能运行(预料之中)。有没有快速的方法或命令来查找 Linux 中哪些 exes 指向 so?
答案1
如果您使用某些 Linux 发行版,应该有 - 但仅限于发行版中的软件包,对于通过其他方式(例如/opt
或/usr/local
)安装的所有内容,您仍然需要使用原始方法。
例如,在基于 Debian 的发行版上,我们首先会找到我们的共享库在哪个包中:
# dpkg -S /usr/lib/libgs.so.9.05
libgs9: /usr/lib/libgs.so.9.05
然后找到所有使用该库的包(并将副本保存在文件中软件包.txt):
# dpkg-query -W -f='${binary:Package} ${Depends}\n' | grep -w libgs9 | awk '{print $1}' | tee packages.txt
ghostscript
gimp
libgs9
libgs9-common
如果您需要知道使用这些库的确切二进制文件,您可以进一步解析该输出:
# while read pkg; do dpkg -L $pkg | xargs -i sh -c 'test -f {} -a -x {} && ldd {} | fgrep -H --label={} libgs.so.9'; done < packages.txt
/usr/bin/gs: libgs.so.9 => /usr/lib/libgs.so.9 (0x00007fefe5611000)
/usr/bin/ghostscript: libgs.so.9 => /usr/lib/libgs.so.9 (0x00007fbad0d71000)
/usr/lib/gimp/2.0/plug-ins/file-ps: libgs.so.9 => /usr/lib/libgs.so.9 (0x00007f75f0a51000)