Linux笔记之ldd命令详解
code review!
ldd
是一个用于查看可执行文件或共享库所依赖的共享库的命令。它可以帮助你了解可执行文件或库与系统上安装的共享库之间的依赖关系。下面是ldd
命令的详细解释:
语法:
ldd [选项] [可执行文件或共享库]
常用选项:
-v
:显示详细信息,包括符号版本信息。-u
:显示未使用的直接依赖项。-d
:执行数据重定位并报告缺失的对象。-r
:执行数据和函数重定位,并报告缺失的对象和函数。
用法:
-
查看可执行文件的依赖项:
ldd /bin/ls
这将显示
/bin/ls
可执行文件所依赖的共享库。 -
查看共享库的依赖项:
ldd /usr/lib/libpthread.so.0
这将显示
libpthread.so.0
共享库所依赖的其他共享库。 -
显示详细信息:
ldd -v /bin/ls
这将显示
/bin/ls
可执行文件的依赖项,并包含符号版本信息。
输出解释:
ldd
命令的输出通常包含以下信息:
- 共享库的名称。
- 共享库的绝对路径(如果已找到)。
- 共享库的加载地址(在括号中)。
例如:
linux-vdso.so.1 (0x00007ffd8ebfd000)
libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007f9b4cbcf000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f9b4c7de000)
libpcre2-8.so.0 => /lib/x86_64-linux-gnu/libpcre2-8.so.0 (0x00007f9b4c548000)
/lib64/ld-linux-x86-64.so.2 (0x00007f9b4cf0e000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f9b4c344000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f9b4c123000)
此输出显示了可执行文件或共享库所依赖的共享库,以及它们在系统上的位置和加载地址。
ldd
命令在调试和排查与共享库相关的问题时非常有用。它可以帮助你确定可执行文件或共享库是否正确链接了所需的共享库,以及检查共享库的版本是否匹配。
请注意,ldd
命令依赖于动态链接器的配置和环境变量(如LD_LIBRARY_PATH
)。确保在使用ldd
时考虑这些因素,以获得准确的依赖项信息。
ldd
命令仅显示可执行文件或共享库所依赖的动态链接库(也称为共享库或共享对象)。它不会显示静态链接库的信息。
静态链接库(通常以.a
文件扩展名结尾)在编译时被直接链接到可执行文件或其他库中。静态链接的代码在链接阶段被复制到最终的可执行文件或库中,成为其不可分割的一部分。因此,静态链接库不会在运行时被动态加载,也不会作为单独的文件存在。
另一方面,动态链接库(通常以.so
文件扩展名结尾)在运行时被动态加载和链接。可执行文件或其他库在运行时通过动态链接器(如ld-linux.so
)加载和链接所需的动态链接库。动态链接库作为独立的文件存在,可以在多个可执行文件或库之间共享。
当你使用ldd
命令时,它会显示可执行文件或共享库在运行时所依赖的动态链接库。这包括直接依赖项(可执行文件或库直接链接的动态库)和间接依赖项(直接依赖项所依赖的其他动态库)。
如果你想查看可执行文件或库所链接的静态库,可以使用objdump
命令:
objdump -a /path/to/executable_or_library
这将显示可执行文件或库的详细信息,包括链接的静态库。
总之,ldd
命令专门用于显示动态链接库的依赖关系,而不包括静态链接库。静态链接库在编译时被合并到可执行文件或库中,不会作为单独的依赖项出现在ldd
的输出中。