如何在Linux中显示所有可执行文件使用的共享库?
在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命令,并且更加安全可靠。
在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命令。
需要注意的是,上述方法可能会因系统配置和环境的不同而导致输出为空。