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、操作系统 | 标签: |