Linux LD_LIBRARAY_PATH and ldd
场景分析
在Linux SUSE环境中,执行SVN操作时报如下错误
svn:E200029: Couldn't perform atomic initialization
svn:E200030: SQLite compiled for 3.15.1, but running with 3.8.5
已知SVN会通过动态链接的方式使用SQLite的函数库,通过whereis找到svn所在位置,再通过ldd命令查看svn动态链接哪里的sqlite库
$ ldd svn
libsqlite3.so.0 => I-am-a-path-have-high-version-sqlite
链接库所指的位置的SQLite函数库版本比较高,与当前svn版本不符合,而我们知道在usr/local/lib中有合适版本的SQLite,那为什么ldd中的库会链接到那个我们不想要的地方呢?
LD_LIBRARY_PATH
这要从环境变量LD_LIBRARY_PATH说起,LD_LIBRARY_PATH是Linux环境下查找动态链接库位置的环境变量(可以不设置!),Linux动态链接库的查找顺序为
1. LD_LIBRARY_PATH(如果设置了) -> 2.标准款路径 /lib /usr/lib
通过echo $LD_LIBRARY_PATH的值,发现我们那个路径刚好就是这个环境变量的值。问题找到,简单的方法是删除该环境变量的值,问题解决。
但是还有一个问题,删除环境变量之后,sqlite链接的位置是usr/local/lib,也不是标准库位置!原因是什么呢?
动态链接库配置文件 /etc/ld.so.conf
$ cat etc/ld.so.conf
usr/local/lib
动态装入器(Dynamic Loader)负责装入动态链接的可执行程序运行所需的共享库,动态装入器找到共享库要依靠两个文件 /etc/ld.so.conf 和 /etc/ld.so.cache,ld.so.conf 文件包含一些目录(exclude /lib and /usr/lib),动态装入器将在其中查找共享库。但是在动态装入器能“看到”这一信息之前,必须将它转换到 ld.so.cache 文件中。
$ ldconfig
执行 ldconfig后,会把动态库配置文件(/etc/ld.so.conf)和标准库路径(/lib和/usr/lib)中的,所有可以共享的动态库(.lib .so)放入/etc/ld.so.cache文件。动态装入器在寻找共享库时会查看在 /etc/ld.so.conf 中指定的所有新目录。
$ ldconfig -p | less #查看缓冲区中的库
所以,Linux动态链接库的查找顺序为
LD_LIBRARY_PATH(if exist) -> 动态链接库配置文件 /etc/ld.so.conf(if exist) -> /lib and /usr/lib
posted on 2017-05-04 22:26 Dean@cnbolg 阅读(600) 评论(0) 收藏 举报
浙公网安备 33010602011771号