linux运维命令:ldd详解 (列出程序依赖的共享库的命令 ldd的使用和原理介绍)

linux运维命令:ldd详解 (列出程序依赖的共享库的命令 ldd的使用和原理介绍)ldd 是 Linux 和 unix 系统中的一个命令行工具 用于列出可执行文件或共享库所依赖的共享库

大家好,欢迎来到IT知识分享网。

目录

一、命令概述

二、基本语法

1、ldd帮助信息

2、ldd语法解释

(1)基本语法

(2)常用选项

三、示例:

1、实例

2、命令执行说明

3、命令输出解释

(1)逐行解释

(2)总结

四、工作原理

1、读取可执行文件或共享库

2、解析依赖关系

3、搜索共享库

4、输出依赖关系

5、说明

五、注意事项


一、命令概述

        ldd(List Dynamic Dependencies)是Linux系统中的一个命令行工具,用于列出可执行文件或共享库所依赖的共享库。当你运行一个程序时,Linux 动态链接器会负责加载程序所需的一个或多个共享库(例如 libc.so.6libm.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 是安全增强型LinuxSELinux)库。它提供了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

(0)
上一篇 2025-10-31 19:10
下一篇 2025-10-31 19:15

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信