ldd和ldconfig命令

2013-02-06

有时候我们需要判断linux某条命令需要哪些共享库文件的支持,以确保指定的命令在独立的系统内可以可靠的运行。

1、首先ldd不是一个可执行程序,而只是一个shell脚本

2、ldd能够显示可执行模块的dependency,其原理是通过设置一系列的环境变量,如下:LD_TRACE_LOADED_OBJECTS、LD_WARN、

LD_BIND_NOW、LD_LIBRARY_VERSION、LD_VERBOSE等。当LD_TRACE_LOADED_OBJECTS环境变量不为空时,任何可执行程序在运行时,它都

会只显示模块的dependency,而程序并不真正执行。要不你可以在shell终端测试一下,如下:

  (1) export LD_TRACE_LOADED_OBJECTS=1

  (2) 再执行任何的程序,如ls等,看看程序的运行结果

  $ export LD_TRACE_LOADED_OBJECTS=1

  $ ls

  libc.so.1 =>   /usr/lib/libc.so.1

  libdl.so.1 =>  /usr/lib/libdl.so.1

  $ man

  libgen.so.1 =>  /usr/lib/libgen.so.1

  libc.so.1 =>   /usr/lib/libc.so.1

  libdl.so.1 =>  /usr/lib/libdl.so.1

3、ldd显示可执行模块的dependency的工作原理,其实质是通过ld-linux.so(elf动态库的装载器)来实现的。我们知道,ld-

linux.so模块会先于executable模块程序工作,并获得控制权,因此当上述的那些环境变量被设置时,ld-linux.so选择了显示可执行

模块的dependency。

4、实际上可以直接执行ld-linux.so模块,如: /lib/ld-linux.so.2 --list program(这相当于ldd program)

注意:
  ldd的标准版本与glibc2一起提供。Libc5与老版本以前提供,在一些系统中还存在。在libc5版本中长选项不支持。另一方面,

glibc2版本不支持-V选项,只提供等价的--version选项。

  如果命令行中给定的库名字包含'/',这个程序的libc5版本将使用它作为库名字;否则它将在标准位置搜索库。运行一个当前目录

下的共享库,加前缀"./"。

错误:

  ldd不能工作在a.out格式的共享库上。

  ldd不能工作在一些非常老的a.out程序上,这些程序在支持ldd的编译器发行前已经创建。如果你在这种类型的程序上使用ldd,程

序将尝试argc = 0的运行方式,其结果不可预知。

5、你可用ldd检查文件依赖哪些库文件。

ldd /bin/ls
ldd /usr/local/bin/mysql
ldd /lib/libc.so.6

查看其依赖的库文件。

6、遇到缺少库文件怎么办:

检查 /etc/ld.so.conf 文件,如果其中缺少 /usr/local/lib目录,就添加进去.在修改了 /etc/ld.so.conf 文件或者在系统中安装了

新的函数库之后,就需要运行ldconfig命令.

ldconfig是一个动态链接库管理命令,它用来刷新系统的共享库缓存,即 /etc/ld.so.cache 文件。为了减少共享库系统的库搜索时间

,共享库系统维护了一个共享库 so 名称的缓存文件/etc/ld.so.cache,此文件保存已排好序的动态链接库名字列表。

ldconfig主要是在默认搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下,搜索出可共享的动态链接库(

格式如前介绍,lib*.so*),进而创建出动态装入程序(ld.so)所需的连接和缓存文件/etc/ld.so.cache.

ldconfig通常在系统启动时运行,在安装了一个新的动态链接库时,就需要手工运行这个命令.

ldconfig -v信息量很大哦

分类:Linux操作系统 | 标签: |

相关日志

评论被关闭!