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

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.lryc.cn/news/607756.html

相关文章:

  • 3D,对比2D孰优孰劣?
  • SEA-RAFT:更简单、更高效、更准确的RAFT架构
  • 重生之我在暑假学习微服务第八天《OpenFeign篇》
  • 【C语言】内存函数与数据在内存中的存储
  • 推荐系统学习笔记(六)自监督学习
  • Kubernetes 构建高可用、高性能 Redis 集群实战指南
  • Ubuntu系统VScode实现opencv(c++)视频及摄像头使用
  • ffmpeg命令和ffplay命令详解
  • 垃圾收集器ParNewCMS与底层三色标记算法详解
  • 【云计算】云主机的亲和性策略(四):云主机组
  • VAST视频广告技术实现:从零开始搭建视频广告投放系统
  • 【20min 急速入门】使用Demucs进行音轨分离
  • 【云计算】云主机的亲和性策略(三):云主机 宿主机
  • 【Android】RecyclerView实现新闻列表布局(1)适配器使用相关问题
  • MySQL 运算符
  • 【Android】使用 Intent 传递对象的两种序列化方式
  • 【Android】进度条ProgressBar 可拖拽进度条Seekbar
  • Javaweb————Apache Tomcat服务器介绍及Windows,Linux,MAC三种系统搭建Apache Tomcat
  • Vue 详情模块 4
  • 分布式微服务--Nacos作为配置中心(二)
  • Text2SQL:如何通过自然语言直接获取数据,打破技术壁垒?
  • opencv自定义滤波
  • 入门MicroPython+ESP32:开启科技新旅程
  • 云原生三剑客:Kubernetes + Docker + Spring Cloud 实战指南与深度整合
  • Diffusion模型生产化指南:用LoRA技术快速定制企业专属AI画师
  • 电商API接口的优势、数据采集方法及功能说明
  • AIDL当Parcelable序列化的数据类通信时报“Class not found when unmarshalling“找不到该类时的解决方案
  • 存储成本深度优化:冷热分层与生命周期管理——从视频平台年省200万实践解析智能存储架构
  • Linux网络编程【UDP网络通信demon】
  • 编程与数学 03-002 计算机网络 19_网络新技术研究