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

Ala*_*sek 212 linux shared-libraries

我想知道我的系统上的可执行文件使用了哪些库.更具体地说,我想对使用最多的库以及使用它们的二进制文件进行排序.我怎样才能做到这一点?

Joh*_*eff 257

  1. 使用ldd列出每个可执行文件共享库.
  2. 清理输出
  3. 排序,计算计数,按计数排序

要查找"/ 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
Run Code Online (Sandbox Code Playgroud)

将上面的"/ 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
Run Code Online (Sandbox Code Playgroud)

编辑 - 删除"grep -P"

  • 请注意,`ldd`实际上使用特殊的环境变量运行可执行文件,并且Linux动态链接器识别此标志并仅输出库而不是运行可执行文件.看看`ldd`的来源; 在我的系统上,它是一个bash脚本.如果可执行文件是静态链接并使用系统调用,并指定一个不同的加载器,它可以做任意邪恶的事情.所以不要在你不信任的可执行文件上使用`ldd`. (52认同)
  • 'ldd' 在交叉编译的二进制文件上对我不起作用。问题是关于查找当前系统上的程序使用的库(如措辞所示,这将是本机程序)。这是一个很好的答案。但是,我想我会提到,如果寻找不同系统的程序的共享库,您需要使用其他东西(另一个答案中提到的“readelf”对我有用) (3认同)
  • 这是一个很好的答案(我已投票赞成),但是您可以解释“ grep -P'\ t。* so'”命令吗?据man称,这将模式解释为perl regexp,但是我的grep版本不支持该模式(man表示这是一个普遍问题)。Perl特定于regexp的哪一部分? (2认同)
  • 我想你可能需要使用`ldd -v` (2认同)

smi*_*hak 65

我没有在我的ARM工具链上使用ldd所以我使用了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
Run Code Online (Sandbox Code Playgroud)

  • 这也应该是安全的,与不应该在不受信任的可执行文件上使用的ldd不同。 (2认同)
  • 此外,“obbjdump -p”显示其他信息,例如“RPATH”,这在调查可执行文件的动态链接问题时可能会有所帮助。 (2认同)

pil*_*lif 47

要了解二进制文件使用的库,请使用ldd

ldd path/to/the/tool
Run Code Online (Sandbox Code Playgroud)

您必须编写一个小的shell脚本来进行系统崩溃.


Fab*_*lao 46

在Linux上我使用:

lsof -P -T -p Application_PID
Run Code Online (Sandbox Code Playgroud)

这比ldd可执行文件使用非默认加载器时效果更好

  • 我正在寻找可以显示给定 pid 的 '.so' 的东西。这正是我所需要的。谢谢! (2认同)

kay*_*yle 18

检查程序可执行文件的共享库依赖项

要找出特定可执行文件所依赖的库,可以使用ldd命令.此命令调用动态链接器以查找可执行文件的库依赖项.

> $ ldd/path/to/program

请注意,不建议使用任何不受信任的第三方可执行文件运行ldd,因为某些版本的ldd可能会直接调用可执行文件来识别其库依赖项,这可能存在安全风险.

相反,显示未知应用程序二进制文件的库依赖关系的更安全的方法是使用以下命令.

$ objdump -p/path/to/program | 需要grep

了解更多信息


Cir*_*四事件 9

readelf -d 递归

redelf -d产生类似的输出objdump -p,如下所述:https://stackoverflow.com/a/15520982/895245

但要注意动态库可以依赖于其他动态库,你必须递归.

例:

readelf -d /bin/ls | grep 'NEEDED'
Run Code Online (Sandbox Code Playgroud)

示例ouptut:

 0x0000000000000001 (NEEDED)             Shared library: [libselinux.so.1]
 0x0000000000000001 (NEEDED)             Shared library: [libacl.so.1]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
Run Code Online (Sandbox Code Playgroud)

然后:

$ locate libselinux.so.1
/lib/i386-linux-gnu/libselinux.so.1
/lib/x86_64-linux-gnu/libselinux.so.1
/mnt/debootstrap/lib/x86_64-linux-gnu/libselinux.so.1
Run Code Online (Sandbox Code Playgroud)

选择一个,然后重复:

readelf -d /lib/x86_64-linux-gnu/libselinux.so.1 | grep 'NEEDED'
Run Code Online (Sandbox Code Playgroud)

样本输出:

0x0000000000000001 (NEEDED)             Shared library: [libpcre.so.3]
0x0000000000000001 (NEEDED)             Shared library: [libdl.so.2]
0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
0x0000000000000001 (NEEDED)             Shared library: [ld-linux-x86-64.so.2]
Run Code Online (Sandbox Code Playgroud)

等等.

/proc/<pid>/maps 用于运行进程

这对于查找当前正在运行的可执行文件使用的所有库非常有用.例如:

sudo awk '/\.so/{print $6}' /proc/1/maps | sort -u
Run Code Online (Sandbox Code Playgroud)

显示所有当前加载的init(PID 1)动态依赖项:

/lib/x86_64-linux-gnu/ld-2.23.so
/lib/x86_64-linux-gnu/libapparmor.so.1.4.0
/lib/x86_64-linux-gnu/libaudit.so.1.0.0
/lib/x86_64-linux-gnu/libblkid.so.1.1.0
/lib/x86_64-linux-gnu/libc-2.23.so
/lib/x86_64-linux-gnu/libcap.so.2.24
/lib/x86_64-linux-gnu/libdl-2.23.so
/lib/x86_64-linux-gnu/libkmod.so.2.3.0
/lib/x86_64-linux-gnu/libmount.so.1.1.0
/lib/x86_64-linux-gnu/libpam.so.0.83.1
/lib/x86_64-linux-gnu/libpcre.so.3.13.2
/lib/x86_64-linux-gnu/libpthread-2.23.so
/lib/x86_64-linux-gnu/librt-2.23.so
/lib/x86_64-linux-gnu/libseccomp.so.2.2.3
/lib/x86_64-linux-gnu/libselinux.so.1
/lib/x86_64-linux-gnu/libuuid.so.1.3.0
Run Code Online (Sandbox Code Playgroud)

此方法还示出了具有打开的库dlopen,以测试该最小设置被黑向上sleep(1000)在Ubuntu 18.04.

另见:https://superuser.com/questions/310199/see-currently-loaded-shared-objects-in-linux/1243089


blu*_*dge 7

在OS X上默认情况下没有ldd,objdumplsof.作为替代方案,请尝试otool -L:

$ otool -L `which openssl`
/usr/bin/openssl:
    /usr/lib/libcrypto.0.9.8.dylib (compatibility version 0.9.8, current version 0.9.8)
    /usr/lib/libssl.0.9.8.dylib (compatibility version 0.9.8, current version 0.9.8)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1213.0.0)
Run Code Online (Sandbox Code Playgroud)

在此示例中,使用which openssl填充给定可执行文件和当前用户环境的完全限定路径.


小智 6

在UNIX系统上,假设二进制(可执行)名称是test.然后我们使用以下命令列出测试中使用的库

ldd test
Run Code Online (Sandbox Code Playgroud)


小智 5

另一种选择是读取位于以下位置的文件

/proc/<pid>/maps
Run Code Online (Sandbox Code Playgroud)

例如进程 id 是 2601 那么命令是

cat /proc/2601/maps
Run Code Online (Sandbox Code Playgroud)

输出就像

7fb37a8f2000-7fb37a8f4000 r-xp 00000000 08:06 4065647                    /usr/lib/x86_64-linux-gnu/libproxy/0.4.15/modules/network_networkmanager.so
7fb37a8f4000-7fb37aaf3000 ---p 00002000 08:06 4065647                    /usr/lib/x86_64-linux-gnu/libproxy/0.4.15/modules/network_networkmanager.so
7fb37aaf3000-7fb37aaf4000 r--p 00001000 08:06 4065647                    /usr/lib/x86_64-linux-gnu/libproxy/0.4.15/modules/network_networkmanager.so
7fb37aaf4000-7fb37aaf5000 rw-p 00002000 08:06 4065647                    /usr/lib/x86_64-linux-gnu/libproxy/0.4.15/modules/network_networkmanager.so
7fb37aaf5000-7fb37aafe000 r-xp 00000000 08:06 4065646                    /usr/lib/x86_64-linux-gnu/libproxy/0.4.15/modules/config_gnome3.so
7fb37aafe000-7fb37acfd000 ---p 00009000 08:06 4065646                    /usr/lib/x86_64-linux-gnu/libproxy/0.4.15/modules/config_gnome3.so
7fb37acfd000-7fb37acfe000 r--p 00008000 08:06 4065646                    /usr/lib/x86_64-linux-gnu/libproxy/0.4.15/modules/config_gnome3.so
7fb37acfe000-7fb37acff000 rw-p 00009000 08:06 4065646                    /usr/lib/x86_64-linux-gnu/libproxy/0.4.15/modules/config_gnome3.so
7fb37acff000-7fb37ad1d000 r-xp 00000000 08:06 3416761                    /usr/lib/x86_64-linux-gnu/libproxy.so.1.0.0
7fb37ad1d000-7fb37af1d000 ---p 0001e000 08:06 3416761                    /usr/lib/x86_64-linux-gnu/libproxy.so.1.0.0
7fb37af1d000-7fb37af1e000 r--p 0001e000 08:06 3416761                    /usr/lib/x86_64-linux-gnu/libproxy.so.1.0.0
7fb37af1e000-7fb37af1f000 rw-p 0001f000 08:06 3416761                    /usr/lib/x86_64-linux-gnu/libproxy.so.1.0.0
7fb37af1f000-7fb37af21000 r-xp 00000000 08:06 4065186                    /usr/lib/x86_64-linux-gnu/gio/modules/libgiolibproxy.so
7fb37af21000-7fb37b121000 ---p 00002000 08:06 4065186                    /usr/lib/x86_64-linux-gnu/gio/modules/libgiolibproxy.so
7fb37b121000-7fb37b122000 r--p 00002000 08:06 4065186                    /usr/lib/x86_64-linux-gnu/gio/modules/libgiolibproxy.so
7fb37b122000-7fb37b123000 rw-p 00003000 08:06 4065186                    /usr/lib/x86_64-linux-gnu/gio/modules/libgiolibproxy.so
Run Code Online (Sandbox Code Playgroud)