• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

Dean@cnbolg

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

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)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3