加入收藏 | 设为首页 | 会员中心 | 我要投稿 百客网 - 百科网 (https://www.baikewang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

Linux下动态链接库加载路径及搜索路径问题

发布时间:2023-01-12 11:06:34 所属栏目:Linux 来源:
导读:  引子

  近日,服务器迁移后,偷懒未重新编译nginx的,直接./nginx启动,结果遇到如下问题:

  “error while loading shared libraries”

  这是是因为需要的动态库不在动态链接器l
  引子
 
  近日,服务器迁移后,偷懒未重新编译nginx的,直接./nginx启动,结果遇到如下问题:
 
  “error while loading shared libraries”
 
  这是是因为需要的动态库不在动态链接器ld.so的搜索路径导致。
 
  ld.so 动态共享库搜索顺序
 
  1、ELF可执行文件中动态段DT_RPATH指定;gcc加入链接参数“-Wl,-rpath”指定动态库搜索路径;
 
  2、环境变量LD_LIBRARY_PATH指定路径;
 
  3、/etc/ld.so.cache中缓存的动态库路径。可以通过修改配置文件/etc/ld.so.conf 增删路径(修改后需要运行ldconfig命令);
 
  4、默认的 /lib/;
 
  5、默认的 /usr/lib/
 
  与动态链接库相关命令
 
  (1)ld 是gcc的链接程序。
 
  (2)ldd是查看可执行文件中所依赖的库的程序,比如想查main程序用到了那些动态库,可以直接 ?ldd main
 
  (3)ldconfig用来更新文件/etc/ld.so.conf的修改生效。
 
  (4)nm用来查看.so库中的函数名字,标记是T的就是动态库里面生成的名字。如:nm /lib/libc*.so
 
  Linux 下动态链接库搜索路径问题
 
  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目录下创建一个你的程序依赖的配置文件,配置文件内容为程序依赖的动态链接库的路径linux动态库,一个路径一行。
 
  添加完配置文件后执行ldconfig使其生效。
 
  4.默认的动态库搜索路径/lib;
 
  5.默认的动态库搜索路径/usr/lib;
 
  1、可以用 LD_LIBRARY_PATH 环境变量指定,这个类似于 PATH 机制,比较直观,而且,可以放到 bashrc 中固化下来,也可以放到自己的 .bashrc 中只对本用户起作用;
 
  2、如果启用了 ld.so.cache 的话,系统会在 /etc/ld.so.cache 中存储所有可引用的动态链接库。这个文件的内容可以通过 /etc/ld.so.conf 来指定;这个是比较固定的机制,对全局所有用户都有影响;不过更改设置后需要 root 调用 ldconfig 来刷新一下。
 
  3、默认的标准库路径,这个似乎不用设置就可以。包括 /lib 和 /usr/lib。当然,如果是64位系统,还包括 /lib64 和 /usr/lib64。
 
  4、其它情况,如果只想对某一个特定的应用程序起作用的话,可以在编译时指定搜索路径。gcc 的 -Wl 和 -rpath 参数。
 
  奇怪的是, /usr/local/lib 和 /usr/local/lib64 居然不在标准路径之列。
 
  总结
 
  以上所述是小编给大家介绍的Linux下动态链接库加载路径及搜索路径问题,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!
 

(编辑:百客网 - 百科网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!