LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 2373|回复: 1

如何更改动态链接库的路径优先级?

[复制链接]
发表于 2007-4-20 20:57:00 | 显示全部楼层 |阅读模式
在FC5(2.6.15-1.2054_FC5)上做交叉编译,遇到了动态链接库的路径优先级的问题:

已经在configure之前设置了动态链接库的路径:

  1. TARGET_DIR=/opt/STM/STLinux-2.2/devkit/sh4/target
  2. export LD_LIBRARY_PATH=$TARGET_DIR/usr/local/lib
  3. export LDFLAGS="-L$TARGET_DIR/usr/local/lib -lglib-2.0 -lgobject-2.0 -lgmodule-2.0 -ldl"
复制代码

但是在make的时候会报告出错:

  1. /usr/local/lib/libgobject-2.0.so: could not read symbols: File in wrong format
复制代码


说明链接到了/usr/local/lib/路径下的libgobject-2.0.so

更改了/usr/local/lib/中libgobject-2.0.so的名称,

  1. mv /usr/local/lib/libgobject-2.0.so /usr/local/lib/libgobject-2.0.so.bak
复制代码

发现就可以正确链接到$TARGET_DIR/usr/local/lib中的libgobject-2.0.so,这说明/usr/local/lib/的优先级比$TARGET_DIR/usr/local/lib更高,

请教如何修改动态链接库的路径优先级呢?

而且/usr/local/lib/这个路径是如何出现的呢?(/etc/ld.so.conf中是没有这个路径的)
 楼主| 发表于 2007-4-21 11:57:03 | 显示全部楼层
查找了一点关于路径优先级的知识(From:linuxsir   Author: scutan):
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 段,连接器添加这个库的符号表到符号表链,如果库所依赖的其它库没有装载的话,则添加那个库到装载队列中。


   现在自己指定的共享库路径已经被赋值到[2]LD_LIBRARY_PATH中了,只有[1].dynamic 段中的DT_RPATH的项优先级别更高,这个部分应该如何修改呢?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表