如何显示Linux中可执行文件使用的所有共享库?
时间:2020-03-05 18:49:29 来源:igfitidea点击:
我想知道系统上的可执行文件使用了哪些库。更具体地说,我想对使用最多的库以及使用它们的二进制文件进行排名。我怎样才能做到这一点?
解决方案
回答
要了解二进制文件使用的库,请使用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\(.* => \)\?\([^ ]*\) (.*//g' | sort | uniq -c
(在这里," sed"会剥离所有不以制表符开头的行,并且仅过滤出实际的库。使用" sort | uniq -c",我们可以获得每个库,并带有一个指示其发生次数的计数。)
我们可能希望在末尾添加sort -g
以按使用顺序获取库。
请注意,使用上述命令我们可能会获得两行非库行。一种是静态可执行文件("不是动态可执行文件"),另一种是没有任何库的。后者是linux-gate.so.1的结果,它不是文件系统中的一个库,而是由内核"提供"的。