当前位置: 首页 > ai >正文

linux编译基础知识-库文件标准路径

在Linux系统中,ld(链接器)和ld-linux(动态加载器)的默认搜索路径可通过以下方法查看。二者的作用阶段不同:ld用于​​编译时​​链接库,ld-linux用于​​运行时​​加载动态库。

🔧 一、查看 ld(编译时链接器)的默认搜索路径

ld是编译阶段的链接器,其默认库搜索路径(静态库 .a和动态库 .so)可通过以下方式查看:​​

1. ld --verbose:

ld --verbose | grep SEARCH_DIR

输出路径为链接器的内置搜索目录

SEARCH_DIR("=/usr/x86_64-linux-gnu/lib64"); 
SEARCH_DIR("=/lib/x86_64-linux-gnu");
SEARCH_DIR("=/usr/lib/x86_64-linux-gnu");
SEARCH_DIR("=/usr/local/lib64");
SEARCH_DIR("=/lib64");
SEARCH_DIR("=/usr/lib64");
SEARCH_DIR("=/usr/local/lib");
SEARCH_DIR("=/lib");
SEARCH_DIR("=/usr/lib");

2. ​​gcc -print-search-dirs

gcc -print-search-dirs命令​​查看GCC的完整搜索路径(含库路径):

gcc -print-search-dirs | grep libraries

输出中的 libraries项包含库搜索路径。

3. ​​环境变量 LIBRARY_PATH​​

若设置了 LIBRARY_PATH,链接器会优先搜索其指定的路径(优先级低于 -L参数):

echo $LIBRARY_PATH

🚀 二、查看 ld-linux(运行时动态加载器)的默认搜索路径

ld-linux(如 ld-linux-x86-64.so.2)在程序运行时加载动态库,其路径搜索顺序如下:

1. ​​ldconfig -v

​​ldconfig -v命令​​查看系统缓存的动态库路径(来自 /etc/ld.so.conf和 /etc/ld.so.conf.d/):

ldconfig -v 2>/dev/null | grep -v ^$'\t'

输出示例:

/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu
/usr/local/lib

2. ​​ /etc/ld.so.conf​​:

查看配置文件 /etc/ld.so.conf​​系统级动态库路径配置文件

cat /etc/ld.so.conf

通常包含:

include /etc/ld.so.conf.d/*.conf

再检查子配置:

cat /etc/ld.so.conf.d/*.conf

3. strace

​​strace跟踪库加载过程​​通过系统调用跟踪程序加载库的路径:

strace -e openat ./your_program 2>&1 | grep "\.so"

输出中会显示尝试打开的库文件路径。

4. LD_DEBUG

​​环境变量 LD_DEBUG​​启用调试模式查看详细加载过程:

LD_DEBUG=libs ./your_program

输出包含每一步的库搜索路径和加载结果。

⚙️ 三、路径优先级总结

1. 编译时(ld)搜索顺序:

  • -L指定的路径
  • LIBRARY_PATH环境变量
  • 内置 SEARCH_DIR路径
  • 默认系统路径(/lib, /usr/lib)

2. 运行时(ld-linux)搜索顺序:

  • 可执行文件的 RPATH/RUNPATH(编译时通过 -Wl,-rpath=设置)
  • LD_LIBRARY_PATH环境变量
  • /etc/ld.so.cache缓存(来自 ld.so.conf)
  • 默认路径:/lib→ /usr/lib
http://www.xdnf.cn/news/16810.html

相关文章:

  • Oracle 11g RAC集群部署手册(一)
  • imx6ull-驱动开发篇6——Linux 设备树语法
  • K8S部署ELK(二):部署Kafka消息队列
  • NVIDIA GPU架构
  • 四、Portainer图形化管理实战与Docker镜像原理
  • express-jwt报错:Error: algorithms should be set
  • Ubuntu系统VScode实现opencv(c++)视频及摄像头使用
  • [硬件电路-112]:模拟电路 - 信号处理电路 - 二极管的应用 - 峰值检测电路与波形展示
  • 【网络与爬虫 37】ScrapeFly深度解析:云端爬虫革命,告别复杂部署拥抱一键API
  • C++入门自学Day5-- c++类与对象(面试题)
  • 苹果MAC 安卓模拟器
  • HarmonyOS 开发:基于 ArkUI 实现复杂表单验证的最佳实践
  • CS课程项目设计7:基于Canvas交互友好的五子棋游戏
  • Pyspark的register方法自定义udf函数
  • Mysql在页内是怎么查找数据的?
  • Web 开发 10
  • Redis 核心概念、命令详解与应用实践:从基础到分布式集成
  • pyqt5显示任务栏菜单并隐藏主窗口,环境pyqt5+vscode
  • JVM 03 类加载机制
  • Python打卡Day30 模块和库的导入
  • LeetCode 刷题【26. 删除有序数组中的重复项、27. 移除元素、28. 找出字符串中第一个匹配项的下标】
  • vue2一种快速导入 Element UI(即 Element 2.x)方式
  • ARM Cortex-M异常处理高级特性详解
  • MCP Agent 工程框架Dify初探
  • 【C++】类和对象(2)
  • AI Agent开发学习系列 - LangGraph(4): 有多个输入的Graph(练习解答)
  • 设计模式篇:在前端,我们如何“重构”观察者、策略和装饰器模式
  • Android 运行 deno 的新方法 (3): Termux 胖喵安初
  • vue3pinia
  • 深度学习核心:卷积神经网络 - 原理、实现及在医学影像领域的应用