是否有任何读取头文件的工具会打印出Linux可执行文件运行所需的动态库的名称?如何知道ELF需要哪些动态库?
我需要它来知道在我刚刚从源代码构建的二进制文件(它是GDB的Python分支)中还是存在一些奇怪的依赖关系(即不是非常标准的),或者它大多是静态链接的。我认为这会比阅读makefile更容易...
是否有任何读取头文件的工具会打印出Linux可执行文件运行所需的动态库的名称?如何知道ELF需要哪些动态库?
我需要它来知道在我刚刚从源代码构建的二进制文件(它是GDB的Python分支)中还是存在一些奇怪的依赖关系(即不是非常标准的),或者它大多是静态链接的。我认为这会比阅读makefile更容易...
/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
代替。从ldd
手册页:
在通常情况下,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]
等。
参见:
的[显示在Linux上使用的可执行文件的所有库]可能的复制(http://stackoverflow.com/questions/50159 /显示-所有的库使用的逐可执行-上的Linux) – 2017-03-26 08:58:07