我想知道我的系统上的可执行文件使用了哪些库。更具体地说,我想对使用最多的库以及使用它们的二进制文件进行排名。我该怎么做呢?
当前回答
要了解二进制文件使用的库,请使用LDD
ldd path/to/the/tool
您必须编写一个小shell脚本来处理系统范围的故障。
其他回答
使用ldd列出每个可执行文件的共享库。 清理输出 排序,计算计数,按计数排序
查找“/bin”目录下所有可执行文件的答案:
find /bin -type f -perm /a+x -exec ldd {} \; \
| grep so \
| sed -e '/^[^\t]/ d' \
| sed -e 's/\t//' \
| sed -e 's/.*=..//' \
| sed -e 's/ (0.*)//' \
| sort \
| uniq -c \
| sort -n
将上面的“/bin”修改为“/”,搜索所有目录。
输出(只针对/bin目录)看起来像这样:
1 /lib64/libexpat.so.0
1 /lib64/libgcc_s.so.1
1 /lib64/libnsl.so.1
1 /lib64/libpcre.so.0
1 /lib64/libproc-3.2.7.so
1 /usr/lib64/libbeecrypt.so.6
1 /usr/lib64/libbz2.so.1
1 /usr/lib64/libelf.so.1
1 /usr/lib64/libpopt.so.0
1 /usr/lib64/librpm-4.4.so
1 /usr/lib64/librpmdb-4.4.so
1 /usr/lib64/librpmio-4.4.so
1 /usr/lib64/libsqlite3.so.0
1 /usr/lib64/libstdc++.so.6
1 /usr/lib64/libz.so.1
2 /lib64/libasound.so.2
2 /lib64/libblkid.so.1
2 /lib64/libdevmapper.so.1.02
2 /lib64/libpam_misc.so.0
2 /lib64/libpam.so.0
2 /lib64/libuuid.so.1
3 /lib64/libaudit.so.0
3 /lib64/libcrypt.so.1
3 /lib64/libdbus-1.so.3
4 /lib64/libresolv.so.2
4 /lib64/libtermcap.so.2
5 /lib64/libacl.so.1
5 /lib64/libattr.so.1
5 /lib64/libcap.so.1
6 /lib64/librt.so.1
7 /lib64/libm.so.6
9 /lib64/libpthread.so.0
13 /lib64/libselinux.so.1
13 /lib64/libsepol.so.1
22 /lib64/libdl.so.2
83 /lib64/ld-linux-x86-64.so.2
83 /lib64/libc.so.6
删除“grep - p”
使用ldd,您可以获得工具使用的库。要对一组工具的库使用情况进行排序,您可以使用类似以下命令的东西。
ldd /bin/* /usr/bin/* ... | sed -e '/^[^\t]/ d; s/^\t\(.* => \)\?\([^ ]*\) (.*/\2/g' | sort | uniq -c
(这里sed去掉所有不以制表符开头的行,只过滤掉实际的库。使用排序| uniq -c,您将获得每个库,并显示它出现的次数。)
您可能希望在末尾添加sort -g以按使用顺序获取库。
注意,使用上述命令可能会得到两行非库行。一种静态可执行文件(“不是动态可执行文件”),另一种没有任何库。后者是linux-gate.so的结果。1,它不是文件系统中的库,而是由内核“提供”的库。
在UNIX系统上,假设二进制(可执行)名称为test。然后我们使用下面的命令列出测试中使用的库
ldd test
如果你不关心可执行文件的路径-
ldd `which <executable>` # back quotes, not single quotes
在ubuntu上 打印与可执行文件相关的包
ldd executable_name|awk '{print $3}'|xargs dpkg -S |awk -F ":" '{print $1}'