程序的路径

编译时库查找路径

-L指定动态库路径 ,类似于通过-I指定头文件包含路径
-l指定使用的库名,可以在系统默认库路径(/lib、/usr/lib、/usr/local/lib)或者-L指定路径中查找

运行时库查找路径

  • 动态库的查找顺序:
  1. 编译时使用-Wl,-rpath可以为目标程序添加的查找的路径
  2. 通过LD_LIBRARY_PATH 环境变量指定的路径
  3. vim /etc/ld.so.conf 中定义的动态库默认路径,注意该文件修改后,需要使用sudo ldconfig让修改生效

可以使用ldd xxx查看程序的动态库查找结果

修改ELF文件的查找路径

  • 修改编译选项
    编译的时候使用-Wl,-rpath为目标程序添加的查找路径,实际上是在生成的ELF中添加了路径字段
    根据Linux发行版不同,默认添加的路径字段可能是DT_RPATH或者DT_RUNPATH,两者区别是DT_RUNPATH仅作用于直接依赖,而DT_RPATH作用于全部依赖:

Using the directories specified in the DT_RUNPATH dynamic section attribute of the binary if present. Such directories are searched only to find those objects required by DT_NEEDED (direct dependencies) entries and do not apply to those objects’ children, which must themselves have their own DT_RUNPATH entries. This is unlike DT_RPATH, which is applied to searches for all children in the dependency tree.

链接时使用--enable-new-dtags可以固定生成DT_RUNPATH,使用--disable-new-dtags可以固定生成DT_RPATH

  • 使用patchelf修改
    可以安装patchelf可以修改ELF的DT_RPATH或者DT_RUNPATH,安装方法:
    sudo apt install patchelf
    使用方法:
    patchelf --set-rpath $rpath:设置ELF的DT_RUNPATH
    patchelf --force-rpath --set-rpath $rpath:设置ELF的DT_RPATH
    patchelf --set-interpreter $interpreter:设置ELF的动态加载器,通常用于修改ELF使用的libc

绝对和相对路径

当编译的时候,直接指定编译的动态库相对路径,如“./libScanAPI.so”,则程序编译的时候在当前路径查找库,运行的时候也会在当前目录加载
当指定完整路径如“/home/xxx/libScanAPI.so”,则用的是绝对路径查找

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值