是否有读头打印由Linux的可执行文件运行所需的动态库的名称中的任何工具?
我需要知道是否有我刚刚从源头上(这是GDB的Python的分支),或者它大多是静态链接建立了一些奇怪的依赖关系(即不是很标准)的二进制文件。 我认为这将是比读的生成文件更容易...
是否有读头打印由Linux的可执行文件运行所需的动态库的名称中的任何工具?
我需要知道是否有我刚刚从源头上(这是GDB的Python的分支),或者它大多是静态链接建立了一些奇怪的依赖关系(即不是很标准)的二进制文件。 我认为这将是比读的生成文件更容易...
/usr/bin/ldd
是你的朋友。 用法:
ldd /bin/ls
输出示例:
linux-vdso.so.1 => (0x00007ffd14f79000)
libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007f2d875fc000)
libacl.so.1 => /lib/x86_64-linux-gnu/libacl.so.1 (0x00007f2d873f4000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f2d8702f000)
libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f2d86df1000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f2d86bed000)
/lib64/ld-linux-x86-64.so.2 (0x00007f2d8781f000)
libattr.so.1 => /lib/x86_64-linux-gnu/libattr.so.1 (0x00007f2d869e8000)
readelf -d $executable | grep 'NEEDED'
可以使用,如果你不能运行可执行文件,例如,如果它是交叉编译,或者如果你不信任它:
在通常情况下,LDD调用标准动态接头(见ld.so(8))与LD_TRACE_LOADED_OBJECTS环境变量设置为1,这导致连接器以显示库的依赖。 请注意,但是,在某些情况下,LDD的某些版本可能会试图通过直接执行程序,以获取相关性信息。 因此,你不应该使用不受信任的可执行LDD,因为这可能导致执行任意代码。
例:
readelf -d /bin/ls | grep 'NEEDED'
样品ouptut:
0x0000000000000001 (NEEDED) Shared library: [libselinux.so.1]
0x0000000000000001 (NEEDED) Shared library: [libacl.so.1]
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
请注意,库可以依赖于其他库,所以你再需要:
$ 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
选择一个,并重复:
readelf -d /lib/x86_64-linux-gnu/libselinux.so.1 | grep 'NEEDED'
输出示例:
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]
等等。
/proc/<pid>/maps
正在运行的进程
这是非常有用找到当前正在使用运行可执行文件的所有库。 例如:
sudo awk '/\.so/{print $6}' /proc/1/maps | sort -u
示出的所有当前加载的动态依赖性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
该方法还示出与库打开dlopen
,与测试该最小设置入侵了一个sleep(1000)
在Ubuntu 18.04。
也可以看看: