Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2089826
  • 博文数量: 361
  • 博客积分: 10828
  • 博客等级: 上将
  • 技术积分: 4161
  • 用 户 组: 普通用户
  • 注册时间: 2010-01-20 14:34
文章分类

全部博文(361)

文章存档

2011年(132)

2010年(229)

分类: LINUX

2011-08-09 15:26:57

From:linuxsir Author: scutan

动态库的查找过程:

 [1]首先查看 .dynamic 段是否包含了一个叫DT_RPATH的项(它是一个以冒号分隔的库文件搜索目录列表)。这个项是在程序被连接器连接时,由命令行开关或者环境变量添加上去的。它常应用于子系统中,比如像数据库应用,我们要装载一些程序集合以及支持库到一个目录中去的时候。

 [2]查看是否存在环境变量 LD_LIBRARY_PATH(它是一个以冒号分隔的库文件搜索目录列表)。这个项可以帮助开发者建立一个新版本的库,把他的路径添加到LD_LIBRARY_PATH中,把它和现存的可连接程序一同使用,用来测试新的库,

 [3]连接器查看库高速缓存文件 /etc/ld.so.conf ,它包含了库名和路径的一个对应列表,如果库名存在,连接器就使用它对应的路径,用这个查找方法能够找到大部分的库(文件名不需要和要求完全符合,这点可以参考接下来的“库的版本”)。

 如果上叙的查找都失败,连接器就查找默认路径 /usr/lib ,如果库文件依旧没有找到,则显示一个错误然后退出。

连接器找到了库文件后,先打开它,然后读取ELF头,找到指向各个段的指针。连接器为库的代码段和数据段分配空间并映射到内存,随后是bss(不分配空间)。.通过库的 .dynamic 段,连接器添加这个库的符号表到符号表
链,如果库所依赖的其它库没有装载的话,则添加那个库到装载队列中。



======================================================================================
  编译程序时如果程序依赖的动态链接库没有安装在系统标准路径:/lib//usr/lib程序运行时往往提示找不到相应的动态链接库文件无法执行,原因就在于动态链接加载器ld的搜索路径列表里没有你的库安装路径。

         Linux动态链接库的搜索路径按优先级排序为:

1.编译目标代码时指定的动态库搜索路径;

在编译时通过gcc 的参数"-Wl,-rpath,"指定。当指定多个动态库搜索路径时,路径之间用冒号":"分隔。

2.环境变量LD_LIBRARY_PATH指定的动态库搜索路径;

3.配置文件/etc/ld.so.conf中指定的动态库搜索路径;

     /etc/ld.so.conf的第一行有个引用命令:include ld.so.conf.d/*.conf

     因此,最优雅的方式是在ld.so.conf.d目录下创建一个你的程序依赖的配置文件,配置文件内容为程序依赖的动态链接库的路径,一个路径一行。

     添加完配置文件后执行ldconfig使其生效。

4.默认的动态库搜索路径/lib;

5.默认的动态库搜索路径/usr/lib;

 

Linux动态链接库有很多相关命令,在此记录下最常用的几个分析命令:

ldd: 查看可执行程序依赖的动态链接库符号,以及引用路径

readelf: 查看可执行程序的ELF头信息,包括动态链接库符号

ldconfig: 加载动态链接库搜索路径

 

可以参考的文章:
1
Linux 动态库剖析http://www.ibm.com/developerworks/cn/linux/l-dynamic-libraries/
2
、剖析共享程序库http://www.ibm.com/developerworks/cn/linux/l-shlibs.html

3ldd命令的原理与使用方法http://hi.baidu.com/wstone_h/blog/item/af67700a80a01e1594ca6b29.html




阅读(1032) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~