大家好,欢迎来到IT知识分享网。
目录
一、命令概述
ldd(List Dynamic Dependencies)是Linux系统中的一个命令行工具,用于列出可执行文件或共享库所依赖的共享库。当你运行一个程序时,Linux 动态链接器会负责加载程序所需的一个或多个共享库(例如 libc.so.6、libm.so.6 等)。
ldd 命令可以帮助我们识别这些依赖项,也就是说ldd 命令提供了查看这些动态链接信息的方法。
二、基本语法
1、ldd帮助信息
在命令行输入命令
ldd –help
得出如下结果:
[root@ecs-52a1 home]# ldd --help
Usage: ldd [OPTION]... FILE...
--help print this help and exit
--version print version information and exit
-d, --data-relocs process data relocations
-r, --function-relocs process data and function relocations
-u, --unused print unused direct dependencies
-v, --verbose print all information
For bug reporting instructions, please see:
<http://www.gnu.org/software/libc/bugs.html>.
[root@ecs-52a1 home]#
[root@ecs-52a1 home]#
2、ldd语法解释
(1)基本语法
ldd 命令的基本语法如下:
ldd [options] file
其中 file 是要检查的可执行文件或库文件的路径。ldd 命令会输出该文件运行时所需的所有共享库及其版本信息。
(2)常用选项
ldd 命令的一些常用选项包括:
-u:显示不可用的共享库。
-v:显示详细的版本信息。
-d, –data-relocs 处理数据重定位
-r, –function-relocs 处理数据和函数重定位
-f:输出以库名为关键字的数据库文件。
-o:输出到指定的文件中。
三、示例:
1、实例
在命令行中输入如下命令:
ldd /usr/bin/ls
这个命令会列出 /usr/bin/ls 可执行文件运行时需要的所有共享库。
输出通常包括以下信息:
– 共享库的名称。
– 共享库的版本。
– 是否为调试符号。
– 共享库的路径。
2、命令执行说明
命令实际执行情况如下:
[root@ecs-52a1 home]# ldd /usr/bin/ls linux-vdso.so.1 (0x00007ffd86bfa000) libselinux.so.1 => /usr/lib64/libselinux.so.1 (0x00007fba30e7e000) libcap.so.2 => /usr/lib64/libcap.so.2 (0x00007fba30c78000) libc.so.6 => /usr/lib64/libc.so.6 (0x00007fba308b5000) libpcre2-8.so.0 => /usr/lib64/libpcre2-8.so.0 (0x00007fba) libdl.so.2 => /usr/lib64/libdl.so.2 (0x00007fba3042d000) /lib64/ld-linux-x86-64.so.2 (0x00007fba312cb000) libpthread.so.0 => /usr/lib64/libpthread.so.0 (0x00007fba3020d000) [root@ecs-52a1 home]#
这显示了 ls 程序依赖于上述列出的共享库。如果系统中没有某个列出的共享库,那么 ldd 命令的输出将显示 not found。
ldd 命令对于确保程序能够找到和链接到正确的共享库版本非常有用,特别是在软件迁移或调试时。
3、命令输出解释
(1)逐行解释
以下是每个输出行含义的详细解释:
linux-vdso.so.1 (0x00007ffd86bfa000)
– linux-vdso.so.1 是包含操作系统提供的地址空间布局随机化(ASLR)支持和其他底层接口函数的虚拟共享对象。它是特定于Linux内核的,用于ASLR支持。
libselinux.so.1 => /usr/lib64/libselinux.so.1 (0x00007fba30e7e000)
– libselinux.so.1 是安全增强型Linux(SELinux)库。它提供了SELinux安全策略和功能。=> 表示库在指定路径找到。
libcap.so.2 => /usr/lib64/libcap.so.2 (0x00007fba30c78000)
– libcap.so.2 是POSIX能力库,提供进程权限控制。
libc.so.6 => /usr/lib64/libc.so.6 (0x00007fba308b5000)
– libc.so.6 是标准C库,提供基本操作(如输入/输出、字符串操作和进程控制)所需的功能。
libpcre2-8.so.0 => /usr/lib64/libpcre2-8.so.0 (0x00007fba)
– libpcre2-8.so.0 是PCRE2正则表达式库,用于基于这些模式的串模式匹配和操作。
libdl.so.2 => /usr/lib64/libdl.so.2 (0x00007fba3042d000)
– libdl.so.2 是动态链接器库,负责在运行时加载和卸载共享库。
/lib64/ld-linux-x86-64.so.2 (0x00007fba312cb000)
– /lib64/ld-linux-x86-64.so.2 本身是动态链接器,负责在运行时查找和加载程序需要的共享库。它是特定于x86-64架构的。
libpthread.so.0 => /usr/lib64/libpthread.so.0 (0x00007fba3020d000)
– libpthread.so.0 是POSIX线程库,提供多线程功能。
ldd 命令用于确定程序是否有所有必要的共享库,以便在系统中正确运行。如果找不到任何所需的库,程序可能无法运行或产生错误的结果。
(2)总结
ldd 的输出列出了可执行文件或共享库所依赖的共享库,以及这些共享库在系统中的实际路径。
- 依赖的共享库:每个依赖的共享库都会以 libxxx.so.y 的形式列出,其中 xxx 是库的名字,y 是库的版本号或链接器版本。
- 路径:每个依赖的共享库后面都跟着它在文件系统中的实际路径。
- 未找到的库:如果某个依赖的库在系统上未找到,ldd 会显示 not found。这通常意味着你可能需要安装或重新安装该库。
四、工作原理
ldd命令对于调试链接问题、理解程序的依赖关系或分析潜在的安全问题非常有用。ldd的工作原理主要基于动态链接器(dynamic linker)和动态链接的信息。以下简要概述:
1、读取可执行文件或共享库
(1)ldd首先读取你指定的可执行文件或共享库。
(2)它查找这些文件中记录的动态链接信息。这些信息通常存储在ELF(Executable and Linkable Format)文件的动态段(.dynamic section)中。
2、解析依赖关系
(1)动态链接信息中包含了该可执行文件或共享库所依赖的其他共享库(也称为动态链接库或DLLs)的名称和路径。
(2)ldd会解析这些依赖关系,并尝试找到它们所指向的共享库文件。
3、搜索共享库
(1)当ldd找到一个依赖的共享库名称时,它会按照特定的搜索路径来查找该库的实际文件。这些搜索路径可以包括标准的库路径(如/lib、/usr/lib等),以及环境变量(如LD_LIBRARY_PATH)中指定的路径。
(2)如果ldd在搜索路径中找到了匹配的共享库文件,它会将其添加到输出列表中。
(3)个依赖的共享库,它会报告一个错误。
4、输出依赖关系
ldd会输出一个列表,列出指定文件所依赖的所有共享库及其路径。这个列表对于了解程序的依赖关系和潜在的依赖问题非常有用。
5、说明
虽然ldd对于了解程序的依赖关系非常有用,但它并不能保证程序在运行时能够成功加载所有的依赖库。这是因为ldd只是模拟了动态链接器的行为,而并没有实际执行程序。有些依赖问题可能在程序运行时才会暴露出来,因此最好还是在真实环境中测试程序。
五、注意事项
1. 运行时依赖
ldd 显示的是运行时依赖,而不是链接时依赖。这意味着它只显示程序在运行时实际需要的库,而不是在链接阶段链接的库。
2. 动态链接
ldd 主要用于检查动态链接的可执行文件和共享库。静态链接的可执行文件不包含对共享库的依赖,因此 ldd 可能不会显示任何输出或显示“not a dynamic executable”之类的消息。
3. 间接依赖
ldd 通常只显示直接依赖的库,而不显示这些库所依赖的其他库(即间接依赖)。但是,你可以通过递归地运行 ldd 来查找间接依赖。
4. 版本问题
即使 ldd 显示了一个库,但如果你的程序需要的是该库的特定版本(而系统上安装的是不同版本),程序仍然可能无法正常运行。
5. 安全性
由于 ldd 需要读取可执行文件或共享库的内容以获取依赖信息,因此它可能受到某些安全限制或策略的影响。
6. 替代工具
除了 ldd 之外,还有一些其他工具(如 objdump、readelf 等)也可以用来检查可执行文件或共享库的依赖关系。这些工具提供了更详细的信息和更多的选项。
文章正下方可以看到我的联系方式:鼠标“点击” 下面的 “威迪斯特-就是video system 微信名片”字样,就会出现我的二维码,欢迎沟通探讨。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/120127.html