musl libc ldso 动态加载研究笔记:动态库的加载次序与初始化次序

前言

  • musl ldso 是按照什么次序加载动态链接的应用程序的共享库的?如果共享库之间有依赖, musl ldso 如何处理先初始化哪个 共享库?

  • musl ldso 的代码可以在 musl 官方代码: ldso\dlstart.cldso\dynlink.c,其中动态库加载部分主要在 ldso\dynlink.c 中的 load_library 函数中实现。

动态库加载次序

  • 当前 musl ldso 加载次序 与 readelf -d xx.so 依赖动态库列表显示的一致,这个加载次序是链接时的依赖库的次序。如果想调整这个次序,就调整链接时的各个依赖库的先后次序即可
  • 动态库的加载次序,是按次序把依赖的动态库加载到内存,这个次序依次加载大部分情况下不重要

  • 如果两个没有依赖的共享库需要加载,动态库的初始化有先后的次序关系,建议调整链接时的动态库的先后次序,让需要先初始化的动态库放在前面(左边)

  • 依赖库初始化次序:这个重要,被依赖的先初始化,musl ldso 的设计满足这个要求,比如 A->B->C,则动态库初始化次序是:C->B->A。

库的初始化次序

  • 两个动态库之间是否有依赖关系,在库的依赖列表中体现。
  • 多次库依赖,初始化最后端的依赖库, 如 A->B->C,初始化次序是: C->B->A

  • 如果两个库无依赖,初始化次序按照 应用程序依赖库的列表次序进行初始化

  • 可以库的调整链接次序,调整两个(两组)不相互依赖库的初始化次序

  • 调整链接时的动态库的次序,把 lib1 放在前面,则会先初始化 lib1 依赖的 lib3。所以初始化次序可以调整链接时的动态库的位置调整。

小结

  • 验证 musl ldso 的动态库加载,可以借助 gdb 调试 与 增加 LOG 打印的方式

  • 当前 musl ldso 的动态库加载虽然集成在 musl libc.so 中,但是功能依旧是完整、齐全的

  • 可以通过查看 musl 的代码,熟悉 ldso 动态加载的流程与实现方法

相关推荐
lkbhua莱克瓦2420 小时前
Java基础——常用API2
java·笔记·github·学习方法
丰锋ff20 小时前
英一2016年真题学习笔记
笔记·学习
摇滚侠20 小时前
Spring Boot3零基础教程,Lambda 表达式与函数式接口,笔记95
java·spring boot·笔记
新子y20 小时前
【小白笔记】稀疏数组 (Sparse Array) 在计算机科学中的存储优化问题
笔记
摇滚侠20 小时前
Spring Boot3零基础教程,Lambda 表达式的使用,笔记96
spring boot·笔记
charlie11451419121 小时前
HTML 理论系统笔记2
前端·笔记·学习·html·基础·1024程序员节·原生
Elias不吃糖1 天前
Linux 环境适应 Day 1 全面笔记
linux·c++·笔记
爱奥尼欧1 天前
【Linux笔记】网络部分——传输层协议TCP(1)
linux·运维·网络·笔记·tcp/ip·1024程序员节
Lester_11011 天前
嵌入式学习笔记 - 用泰勒公式解决 tanh函数
笔记·学习·算法
sunshine~~~1 天前
【笔记】macOs arm架构安装虚拟机Ubuntu环境:ROS2 + Python开发
arm开发·笔记·python·macos·ros2