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

引子

近日,服务器迁移后,偷懒未重新编译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目录下创建一个你的程序依赖的配置文件,配置文件内容为程序依赖的动态链接库的路径,一个路径一行。

添加完配置文件后执行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下动态链接库加载路径及搜索路径问题,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!

原创文章,作者:BEFZI,如若转载,请注明出处:https://www.wangzhanshi.com/n/6322.html

(0)
BEFZI的头像BEFZI
上一篇 2025年1月1日 16:17:58
下一篇 2025年1月1日 16:20:40

相关推荐

  • Linux下如何调整根目录的空间大小

    一、目的 在使用CentOS6.3版本Linux系统的时候,发现根目录(/)的空间不是很充足,而其他目录空间有很大的空闲,所以本文主要是针对现在已有的空间进行调整。首先,先来查看一…

    Linux 2025年1月1日
  • Linux 系统查看磁盘可用空间的五个命令

    大家好,我是良许。 工作中,经常会遇到磁盘爆满的情况,尤其是一台服务器运行了 N 年之后,里面会充满各种各样垃圾文件,比如:编译产生的中间文件、打包的镜像文件、日志文件,等等。 别…

    2025年1月1日
  • Linux 单个tomcat多实例部署shell脚本详解

    Linux 单个tomcat多实例部署shell脚本详解 步骤: 1. 下载tomcat,解压安装 2.将tomcat下的webapps,conf,temp等目录分别拷至根目录ww…

    Linux 2025年1月1日
  • Linux十个新手命令分享

    Linux对我们的生活有着很大的影响。对于新手来说,头一次入手Linux只会让你觉得不适。因为在Linux上,你通常应该使用终端命令,而不是只要点击启动器图像(就像你在Window…

    Linux 2025年1月1日
  • 教你如何修改Linux远程登录欢迎提示信息

    无论何时登录公司的某些生产系统,你都会看到一些登录消息、警告或关于你将登录或已登录的服务器的信息,如下所示。这些是登录导语login banner。 在本文中,我们将教你如何配置它…

    2025年1月1日
  • 从 Linux 终端打印文件

    使用 lpr 命令在终端中打印文件。 在 Linux 上打印很容易,但有时感觉要做很多工作,比如启动应用程序、打开文件、在菜单中找到打印选项,单击确认按钮等等。当你是一个终端用户时…

    2025年1月1日
  • Linux后台运行jar程序的流程步骤

    准备工作 在开始之前,确保您的Linux系统中已经安装了Java运行环境(JRE 或 JDK)。 步骤一:创建一个可执行的jar文件 首先,确保你已经编写了一个可执行的Java程序…

    Linux 2024年12月17日
  • Xshell实现Windows上传文件到Linux主机的方法

    写在前面,博主本身并没有开始做接口自动化测试,目前刚刚学完postman的教程,了解工具,现在脑海中基本上的框架是已经有了,因为我们知道postman的collection是可以命…

    2025年1月1日
  • linux epoll机制详解

    在linux 没有实现epoll事件驱动机制之前,我们一般选择用select或者poll等io多路复用的方法来实现并发服务程序。在linux新的内核中,有了一种替换它的机制,就是e…

    2025年1月1日
  • linux下system函数的简单分析

    简单分析了linux下system函数的相关内容,具体内容如下 ? int __libc_system (const char *line) {  if (line == NULL…

    Linux 2025年1月1日

发表回复

登录后才能评论