ldd

用于打印程序或者库文件所依赖的共享库列表

选项

–version:打印指令版本号;
-v:详细信息模式,打印所有相关信息;
-u:打印未使用的直接依赖;
-d:执行重定位和报告任何丢失的对象;
-r:执行数据对象和函数的重定位,并且报告任何丢失的对象和函数;
–help:显示帮助信息。

实战

查看php的动态依赖:ldd /usr/local/php/bin/php

[root@iz2zecj7a5r32f2axsctb9z shell]# ldd /usr/local/php/bin/php
    linux-vdso.so.1 =>  (0x00007ffc463c5000)
    libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007fbc67be2000)
    libz.so.1 => /lib64/libz.so.1 (0x00007fbc679cc000)
    libresolv.so.2 => /lib64/libresolv.so.2 (0x00007fbc677b2000)
    librt.so.1 => /lib64/librt.so.1 (0x00007fbc675aa000)
    libpng15.so.15 => /lib64/libpng15.so.15 (0x00007fbc6737f000)
    libjpeg.so.62 => /lib64/libjpeg.so.62 (0x00007fbc6712a000)
    libcurl.so.4 => /lib64/libcurl.so.4 (0x00007fbc66ec0000)
    libbz2.so.1 => /lib64/libbz2.so.1 (0x00007fbc66cb0000)
    libm.so.6 => /lib64/libm.so.6 (0x00007fbc669ae000)
    libdl.so.2 => /lib64/libdl.so.2 (0x00007fbc667aa000)
    libnsl.so.1 => /lib64/libnsl.so.1 (0x00007fbc66590000)
    libxml2.so.2 => /lib64/libxml2.so.2 (0x00007fbc66226000)
    libssl.so.10 => /lib64/libssl.so.10 (0x00007fbc65fb4000)
    libcrypto.so.10 => /lib64/libcrypto.so.10 (0x00007fbc65b51000)

注意:

  • ldd不是一个可执行程序,而只是一个shell脚本, ldd能够显示可执行模块的dependency(所属)(所属),其原理是通过设置一系列的环境变量,如下:LD_TRACE_LOADED_OBJECTS、LD_WARN、LD_BIND_NOW、LD_LIBRARY_VERSION、LD_VERBOSE等。当LD_TRACE_LOADED_OBJECTS环境变量不为空时,任何可执行程序在运行时,它都会只显示模块的dependency(所属),而程序并不真正执行。要不你可以在shell终端测试一下,如下: export LD_TRACE_LOADED_OBJECTS=1 再执行任何的程序,如ls等,看看程序的运行结果。

  • ldd显示可执行模块的dependency(所属)的工作原理,其实质是通过ld-linux.so(elf动态库的装载器)来实现的。我们知道,ld-linux.so模块会先于executable模块程序工作,并获得控制权,因此当上述的那些环境变量被设置时,ld-linux.so选择了显示可执行模块的dependency(所属)。 实际上可以直接执行ld-linux.so模块,如:/lib/ld-linux.so.2 –list program(这相当于ldd program)

  • 如果使用 ldd 命令时没有找到对应的共享库文件和其具体位置,可能是两种情况引起的:

    • 共享库没有安装在该系统中;
    • 共享库保存在 /etc/ld.so.conf 文件列出的搜索路径之外的位置。
  • 通常情况下,许多开放源代码的程序或函数库都会默认将自己安装到 /usr/local 目录下的相应位置(如:/usr/local/bin/usr/local/lib),以便与系统自身的程序或函数库相区别。而许多 Linux 系统的 /etc/ld.so.conf 文件中默认又不包含 /usr/local/lib。因此,往往会出现已经安装了共享库,但是却无法找到共享库的情况。具体解决办法如下:

    • 检查 /etc/ld.so.conf 文件,如果其中缺少 /usr/local/lib 目录,就添加进去;注意:在修改了 /etc/ld.so.conf文件或者在系统中安装了新的函数库之后,需要运行一个命令:ldconfig ,该命令用来刷新系统的共享库缓存,即 /etc/ld.so.cache 文件。为了减少共享库系统的库搜索时间,共享库系统维护了一个共享库 so 名称的缓存文件/etc/ld.so.cache。因此,在安装新的共享库之后,一定要运行ldconfig 刷新该缓存。
文档更新时间: 2021-03-05 19:36   作者:周国强