如何显示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的结果,它不是文件系统中的一个库,而是由内核"提供"的。