首页 > 其他分享 >共享库搜索路径

共享库搜索路径

时间:2023-06-18 22:45:20浏览次数:35  
标签:LD lib 路径 LIBRARY 搜索 设置 test PATH 共享

基本原理

-L编译选项是编译期间使用

LD_LIBRARY_PATH环境变量是运行期间使用,可以用来指定so的加载路径,并且优先级高于系统默认的。

RPATHRUNPATH是ELF格式里面的一个数据,rpath编译选项实际上是在可执行文件中加入了RUNPATH或者RPATH

小结一下一个ELF文件自身加载so的情况(不可信,仅供参考):

其实这三者的关系概括起来没有几点:

  1. LD_LIBRARY_PATH是个环境变量,优先级高于系统默认的。
  2. RPATH是ELF格式里面的一个数据,他的优先级比LD_LIBRARY_PATH还要高
  3. RUNPATH很特殊,如果他出现了RPATH就躲起来了,LD_LIBRARY_PATH 又成了首选??
ELF 中 RPATH ELF 中 RUNPATH LD_LIBRARY_PATH 变量 尝试加载目录的顺序
未设置 未设置 未设置 /lib => /usr/lib
未设置 未设置 设置 ${LD_LIBRARY_PATH} => /lib => /usr/lib
设置 未设置 未设置 ${RPATH} => /lib => /usr/lib
设置 未设置 设置 ${RPATH} => ${LD_LIBRARY_PATH} => /lib => /usr/lib
设置 或 未设置 设置 设置 ${LD_LIBRARY_PATH} => ${RUN_PATH} => /lib => /usr/lib
设置 或 未设置 设置 未设置 ${RUN_PATH} => /lib => /usr/lib

LD_LIBRARY_PATH 例子

// a.c
#include <stdio.h>

extern void test_b();
void test_a()
{
    test_b();
}

int main()
{
    test_a();
    return 0;
}

// b.c
#include <stdio.h>

void test_b()
{
}
root@ubuntu:/usr1/tmp/2# gcc b.c -shared -fPIC -o lib/libmyb.so
root@ubuntu:/usr1/tmp/2# gcc -o a a.c -Llib -lmyb
root@ubuntu:/usr1/tmp/2# 
root@ubuntu:/usr1/tmp/2# ./a
./a: error while loading shared libraries: libmyb.so: cannot open shared object file: No such file or directory
root@ubuntu:/usr1/tmp/2# 
root@ubuntu:/usr1/tmp/2# export LD_LIBRARY_PATH=lib
root@ubuntu:/usr1/tmp/2# ./a
root@ubuntu:/usr1/tmp/2# 
root@ubuntu:/usr1/tmp/2# tree

RPATH和RUNPATH 例子

// a.c
#include <stdio.h>

extern void test_b();
void test_a()
{
    test_b();
}

int main()
{
    test_a();
    return 0;
}

// b1.c, b2.c
#include <stdio.h>

void test_b()
{
    printf("test_b in: %s\n", __FILE__);
}
unset LD_LIBRARY_PATH
gcc b1.c -shared -fPIC -o lib1/libmyb.so
gcc b2.c -shared -fPIC -o lib2/libmyb.so
gcc -o a a.c -Llib1 -lmyb -Wl,-rpath=lib2
tree

ldd ./a
readelf -d ./a | grep PATH

export LD_LIBRARY_PATH=lib1
ldd ./a
readelf -d ./a | grep PATH

参考文档

RPATH和RUNPATH区别 - 简书 (jianshu.com)

RPATH RUNPATH 和 LD_LIBRARY_PATH_pkpkpk的专栏-CSDN博客

标签:LD,lib,路径,LIBRARY,搜索,设置,test,PATH,共享
From: https://www.cnblogs.com/devin1024/p/17489916.html

相关文章

  • 【10篇热门博客文章】语音搜索技术在人工智能中的应用与发展趋势
    目录语音搜索技术在人工智能中的应用与发展趋势摘要:随着语音交互技术的不断发展,语音搜索技术在人工智能中的应用越来越广泛。本文从语音搜索技术的原理、实现步骤、应用示例和优化改进等方面进行论述,旨在为读者提供更深入、更全面的理解。文章还总结了语音搜索技术在人工智能领......
  • 路径之谜(DFS)-2016年蓝桥杯国赛
    路径之谜-2016年国赛1、题目描述2、解题思路3、代码实现1、题目描述  小明冒充X星球的骑士,进入了一个奇怪的城堡。  城堡里边什么都没有,只有方形石头铺成的地面。  假设城堡地面是n×n*个方格。如下图所示。  按习俗,骑士要从西北角走到东南角。可以横向或纵向移动,但......
  • wsl 安装的Ubuntu 和windows 里面的文件如何共享
    原文:oucanalsoaccessyourlocalmachine’sfilesystemfromwithintheLinuxBashshell–you’llfindyourlocaldrivesmountedunderthe /mnt folder.Forexample,your C: driveismountedunder /mnt/c:意思就是直接在Ubuntu里面cd到/mnt/c就可以了......
  • 【路径规划】基于A星算法结合floyd和动态窗口法实现机器人栅格地图路径规划附matlab代
    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。......
  • java——微服务——spring cloud——Nacos——Nacos配置共享
       ......
  • 主流文件共享平台的传输加密秘密
    加密对于安全可靠的文件传输至关重要。在最基本的情况下,文件加密通过对数据进行加扰的算法将消息或文件转换为不可读的代码(加密的数据称为密文,而未加密的数据称为明文)。这些算法可以使用唯一的加密密钥进行解密。在E2EE下,只有发送方和接收方可以访问加密密钥,而其他类型的加密通......
  • 主流文件共享平台的传输加密秘密
    加密对于安全可靠的文件传输至关重要。在最基本的情况下,文件加密通过对数据进行加扰的算法将消息或文件转换为不可读的代码(加密的数据称为密文,而未加密的数据称为明文)。这些算法可以使用唯一的加密密钥进行解密。在E2EE下,只有发送方和接收方可以访问加密密钥,而其他类型的加密......
  • 图解LeetCode——437. 路径总和 III
    一、题目给定一个二叉树的根节点root ,和一个整数targetSum,求该二叉树里节点值之和等于targetSum的路径的数目。路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。二、示例2.1>示例1:【输入】root=[10,5,-3,3,2,null......
  • 前端新手学习入门路径推荐
    背景目的方便新手学习前端技术,整理了一些资源和教程帮助大家更好的入门。基础知识了解一遍有个印象即可,不懂暂时不必深究,在后续实践中会融会贯通。大家重点关注“训战结合”的部分,动手练习并解决问题进步最有效。 Vue学习顺序https://zhuanlan.zhihu.com/p/23134551起......
  • 人工智能飞速发展,数智人力共享技术东风
    随着ChatGPT的爆火,人工智能生成内容(AIGC)正迅速成为搜索引擎、聊天机器人等领域的新宠。AIGC不仅能够提高搜索结果的准确性,还能为用户提供更为个性化和定制化的服务。目前,AIGC在招聘面试、共享服务中心等人力资源场景方面,也有着大量应用。从资效到智效:人工智能时代的个人能力和组织......