liuweinn 2012-04-10
6.查看可执行文件的依赖库
ldd命令可以查看一个可执行程序依赖的共享库,
# ldd./main
linux-gate.so.1=> (0x00ec1000)
libtest.so=> ./libtest.so (0x00967000)
libc.so.6=> /lib/tls/i686/cmov/libc.so.6 (0x0025b000)
/lib/ld-linux.so.2(0x00471000)
7.可执行程序定位共享库
当系统加载可执行代码时候,能够知道其所依赖的库的名字,但是还需要知道绝对路径
此时就需要系统动态载入器(dynamiclinker/loader)对于elf格式的可执行程序,是由ld-linux.so*来完成的,它先后搜索
elf文件的DT_RPATH段,
LD_LIBRARY_PATH指定的路径,
/etc/ld.so.cache文件列表,
/lib/,/usr/lib,目录
找到库文件后将其载入内存。
8.指定库路径
如果安装在/lib或者/usr/lib下,那么ld默认能够找到。
方法1
如果安装在其他目录,需要将其添加到/etc/ld.so.cache文件中,步骤如下
编辑/etc/ld.so.conf文件,加入库文件所在目录的路径
运行ldconfig,该命令会重建/etc/ld.so.cache文件
方法2:(临时指定)
#export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/libpath
9.库的题外话
库文件在连接(静态库和共享库)和运行(仅限于使用共享库的程序)时被使用,其搜索路径是在系统中进行设置的。一般Linux系统把 /lib和 /usr/lib两个目录作为默认的库搜索路径,所以使用这两个目录中的库时不需要进行设置搜索路径即可直接使用。对于处于默认库搜索路径之外的库,需要将库的位置添加到库的搜索路径之中。设置库文件的搜索路径有下列两种方式:
在环境变量 LD_LIBRARY_PATH中指明库的搜索路径。
在 /etc/ld.so.conf文件中添加库的搜索路径。
将自己可能存放库文件的路径都加入到/etc/ld.so.conf
添加方法也极其简单,将库文件的绝对路径直接写进去就OK,一行一个。例如:
/usr/local/lib
/opt/lib
我的机是Ubuntu10.4系统/etc/ld.so.conf的内容如下:
#cat/etc/ld.so.conf
include/etc/ld.so.conf.d/*.conf
为了加快程序执行时对共享库的定位速度,避免使用搜索路径查找共享库的低效率,linux是直接读取库列表文件/etc/ld.so.cache从中进行搜索的。
/etc/ld.so.cache是一个非文本的数据文件,不能直接编辑,它是根据/etc/ld.so.conf中设置的搜索路径由/sbin/ldconfig命令将这些搜索路径下的共享库文件集中在一起而生成的。
因此,为了保证程序执行时对库的定位,在/etc/ld.so.conf中进行了库搜索路径的设置之后,还必须要运行/sbin/ldconfig命令更新/etc/ld.so.cache 文件之后才可以。
ldconfig,简单的说,它的作用就是将/etc/ld.so.conf列出的路径下的库文件缓存到/etc/ld.so.cache以供使用。因此当安装完一些库文件,(例如刚安装好glib),或者修改ld.so.conf增加新的库路径后,需要运行一下/sbin/ldconfig使所有的库文件都被缓存到ld.so.cache中,如果没做,即使库文件明明就在/usr/lib下的,也是不会被使用的,结果编译过程中抱错,缺少xxx库。
在程序连接时(不是运行),对于库文件(静态库和共享库)的搜索路径,除了上面的设置方式之外,还可以通过-L参数显式指定。因为用-L设置的路径将被优先搜索,所以在连接的时候通常都会以这种方式直接指定要连接的库的路径。