如何在Linux中显示所有可执行文件使用的共享库?

15 浏览
0 Comments

如何在Linux中显示所有可执行文件使用的共享库?

我想知道我的系统上的可执行文件使用了哪些库。更具体地说,我想排名使用最多的库,以及使用它们的二进制文件。我该如何做到这一点?

0
0 Comments

如何在Linux中显示所有可执行文件使用的共享库?

问题的出现原因:用户想要查看一个给定进程的所有共享库。

解决方法:使用命令lsof -P -T -p Application_PID来实现。这个命令比ldd更好用,特别适用于可执行文件使用非默认加载器的情况。通过这个命令,用户可以找到特定进程的共享库。此外,用户还提到了ldd和objdump -p的不同输出,指出lsof在特定情况下比ldd更好用。在这个问题的回答中,还有其他用户的评论提到了对错答案的误解,但是这不影响问题的解决方法。

0
0 Comments

在Linux中,有时我们需要查看可执行文件所使用的所有共享库。然而,某些情况下,我们可能无法使用ldd命令来实现这个目标。一种替代方法是使用objdump命令。

objdump命令的使用方法如下:

$(CROSS_COMPILE)objdump -p

例如:

objdump -p /usr/bin/python:
Dynamic Section:
  NEEDED               libpthread.so.0
  NEEDED               libdl.so.2
  NEEDED               libutil.so.1
  NEEDED               libssl.so.1.0.0
  NEEDED               libcrypto.so.1.0.0
  NEEDED               libz.so.1
  NEEDED               libm.so.6
  NEEDED               libc.so.6
  INIT                 0x0000000000416a98
  FINI                 0x000000000053c058
  GNU_HASH             0x0000000000400298
  STRTAB               0x000000000040c858
  SYMTAB               0x0000000000402aa8
  STRSZ                0x0000000000006cdb
  SYMENT               0x0000000000000018
  DEBUG                0x0000000000000000
  PLTGOT               0x0000000000832fe8
  PLTRELSZ             0x0000000000002688
  PLTREL               0x0000000000000007
  JMPREL               0x0000000000414410
  RELA                 0x0000000000414398
  RELASZ               0x0000000000000078
  RELAENT              0x0000000000000018
  VERNEED              0x0000000000414258
  VERNEEDNUM           0x0000000000000008
  VERSYM               0x0000000000413534

与ldd命令不同,使用objdump命令可以更安全地查看动态链接库信息,尤其对于不受信任的可执行文件。另外,objdump命令还可以显示其他信息,比如RPATH,对于解决动态链接问题可能会有帮助。

值得注意的是,ldd命令和objdump -p命令输出的结果不同,ldd命令输出的共享库更多。

有时,即使我们有ldd命令,它可能会错误地显示"not a dynamic executable"的信息,而objdump命令可以准确地显示动态链接库信息。

对于在Linux中显示可执行文件使用的所有共享库的问题,可以使用objdump命令来代替ldd命令,并且更加安全可靠。

0
0 Comments

在Linux中,如何显示所有可执行文件使用的共享库?

有时我们需要知道一个可执行文件使用了哪些共享库。在Linux中,我们可以使用ldd命令来列出每个可执行文件使用的共享库。但是,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

上述方法是通过使用一系列的命令来处理ldd的输出结果,以得到更清晰和有序的共享库列表。

需要注意的是,ldd命令实际上会使用一个特殊的环境变量来运行可执行文件,而Linux动态链接器会识别此标志并仅输出库文件,而不会运行可执行文件。因此,在处理不受信任的可执行文件时,不要使用ldd命令。

此外,如果要查找不同系统的可执行文件使用的共享库,需要使用其他工具,例如readelf命令。

需要注意的是,上述方法可能会因系统配置和环境的不同而导致输出为空。

0