共享库链接和加载时的路径搜索优先级

共享库链接和加载时的路径搜索优先级

移步至https://paw5zx.github.io/cpp-shared-lib-search-priority/观看效果更佳

前言

在开发一个新项目时遇到了共享库冲突的问题,因此在这里记录一下共享库的链接和加载过程中库路径的搜索优先级的相关知识。

共享库的链接

现在有一个main.o可重定位目标文件,其中需要用到开源库log4cpp。在链接的时候,我们可以这样链接:

g++ main.o -o a.out -L/path/to/libs -llog4cpp

其中:
-L/path/to/libs表示链接器去哪个目录下查找库文件。
注意:通过-L指定的路径的搜索优先级是要高于系统默认的库文件路径的。

编译时库搜索优先级:
-L指定的路径> LIBRARY_PATH>默认库路径

-llog4cpp表示要链接的库,在链接阶段,链接器一般会按照搜索优先级,从库路径中查找名为liblog4cpp.soliblog4cpp.a的文件进行链接。若不特殊说明,默认优先链接共享库。

共享库的加载

在程序开始运行前的加载阶段,动态链接器会读取可执行文件,查找并加载所有必须的共享库。注意此时的搜索路径并不包含/path/to/libs,因为它只作用于链接阶段。链接器搜索的路径有:LD_LIBRARY_PATH环境变量,/etc/ld.so.cache文件,默认库路径(/usr/lib,/lib等)。

如果需要从指定的路径加载共享库,则可以使用下述方法:

  • 手动设置LD_LIBRARY_PATH环境变量:在程序运行前设置环境变量,指定共享库的搜索路径:
    export LD_LIBRARY_PATH=/path/to/runtime_libs:$LD_LIBRARY_PATH
    
    注意,此方法设置环境变量是临时的,一旦终端关闭设置就会失效。若想使其持久化,需要特殊设置,方法包括但不限于:修改.bashrc文件,修改rc.loacl文件。
  • 修改/etc/ld.so.conf/etc/ld.so.conf.d/*配置:
    这些文件提供了系统级别的库搜索路径。系统管理员可以在这些文件中定义默认的库搜索路径,这些设置对所有用户和应用程序都有效。
  • 在链接阶段使用-rpath:
    在链接阶段,设置RPATH或RUNPATH,将库路径硬编码到可执行文件中
    g++ main.o -o a.out -L/path/to/libs -llog4cpp -Wl,-rpath,/path/to/runtime_libs
    
    注意若可执行文件中同时包含RPATH和RUNPATH,那么RPATH将会被动态链接器忽略。

共享库的搜索优先级为:
RPATH>LD_LIBRARY_PATH>RUNPATH>/etc/ld.so.conf/etc/ld.so.conf.d/*>默认库路径

Linux 动态库搜索路径是指在 Linux 系统下,动态链接器(ld)搜索加载共享库(.so),按照一定的优先级搜索路径去查找目标共享库的过程。 在 Linux 中,系统动态共享库的存放路径一般有如下几个: 1. /usr/lib:系统提供的共享库路径,一些常用的共享库会被安装在该目录下。 2. /lib:系统提供的另一个共享库路径,类似于 /usr/lib,但一些重要的共享库会被安装在该目录下,这些库通常是系统引导过程中需要的。 3. LD_LIBRARY_PATH 环境变量:如果设置了该环境变量,ld 将会在其所指定的路径中查找共享库,而不是在默认路径中查找。 4. /etc/ld.so.conf 文件:该文件指定了需要搜索共享库路径,如果没有指定,ld 会使用默认路径搜索共享库。 5. /etc/ld.so.cache 文件:该文件记录了系统中已经安装的共享库路径信息,ld 可以通过该文件快速查找共享库,避免搜索的性能损失。 在进行动态共享库链接,系统动态链接器会按照以上搜索路径优先级从上至下查找目标共享库。如果要修改默认的动态库搜索路径,可以在 /etc/ld.so.conf 中添加自定义库路径,并运行 ldconfig 命令更新缓存信息。 总之,动态库搜索路径Linux 下非常重要的概念,对于程序员系统管理员而言,了解动态库搜索路径有助于更好地管理系统共享库,提高应用程序的可用性性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

paw5zx

赛博乞丐,在线要饭

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值