ld 和 ld.so命令

参考:
1.What’s the different between -L/libpath and /etc/ld.so.conf configure the libpath that compiling in gcc/g++
2.Where do executables look for shared objects at runtime?
3.Library HOWTO(官方说明)
4.Linux上ld和ld.so命令的区别
5.知乎 gcc编译过程、gcc命令参数、静态库和动态库搜索路径

ld 和 ld.so 命令是什么

ld链接器,它的生命周期是发生在compile-time的,它的一些参数是编译时期gcc给传递的,比如,指定需要链接什么库。

ld.so命令的周期是发生在run-time的,名字叫动态链接器/加载器。它的作用体现在运行时。比如你链接了指定的库,它运行的时候会根据指定的路径去加载指定的库。

编译

编译和运行搜索动态库的时候,是分开的,由不同的指令来搜索需要的动态库。在编译时,由ld来搜索需要的动态库。搜索路径的顺序为:

  1. 编译目标代码时指定的动态库搜索路径(-L指定的);

  2. 环境变量LIBRARY_PATH指定的动态库搜索路径;

  3. 默认动态库搜索路径/lib/

  4. 默认动态库搜索路径/usr/lib/

在使用gcc编译时,gcc将调用ld,将搜索路径传给ld,让ld来链接文件。因此上述搜索路径实际上是gcc的搜索路径,而不是ld的搜索路径。

运行

ld.so负责在运行的时候搜索要链接的动态库,发生在run-time时期。搜索路径为:

  1. 可执行文件中动态段DT_PATH指定;该动态段包含的路径,来自于在编译时,gcc加入连接参数“-Wl,-rpath”指定动态库搜索路径,多个路径之间用冒号分隔;例如gcc -Wl,--rpath -Wl,${LIB_DIR1} ./app

  2. 环境变量LD_LIBRARY_PATH指定路径;

  3. /etc/ld.so.cache中缓存的动态库路径。通过配置文件/etc/ld.so.conf增删路径(修改后需要运行ldconfig命令)。

    /etc/ld/so.conf第一行有个引用命令:include ld.so.conf.d/*.conf;因此最优雅的方式是在ld.so.conf.d目录下创建一个自己的程序依赖的配置文件,配置文件内容为程序依赖的动态库路径,一个路径一行;最后ldconfig更新配置文件;

  4. /lib/

  5. /usr/lib/

注:当elf 可执行程序运行时,会在LD_LIBRARY_PATH 动态库的查找路径 查找,当找到A库时加载,如果其他的文件中存在相同的库函数,若两个库函数不一致,则有可能导致出现undefined symbol。
解决办法: 排查LD_LIBRARY_PATH 的值下的文件中是否存在相同的库文件。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值