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 动态加载的流程与实现方法

相关推荐
jrlong9 分钟前
DataWhale大模型基础与量化微调task4学习笔记(第 2 章:高级微调技术_RLHF 技术详解)
笔记·学习
傻小胖28 分钟前
13.BTC-思考-北大肖臻老师客堂笔记
笔记·区块链
風清掦1 小时前
【江科大STM32学习笔记-04】0.96寸OLED显示屏
笔记·stm32·学习
胡西风_foxww1 小时前
ObsidianAI_学习一个陌生知识领域_建立学习路径和知识库框架_写一本书
人工智能·笔记·学习·知识库·obsidian·notebooklm·写一本书
AI视觉网奇2 小时前
huggingface-cli 安装笔记2026
前端·笔记
idontknow2333 小时前
DPDK学习笔记(1):二层转发应用例代码解析
c语言·网络·笔记·学习
求真求知的糖葫芦3 小时前
耦合传输线分析学习笔记(八)对称耦合微带线S参数矩阵推导与应用(上)
笔记·学习·矩阵·射频工程
试试勇气4 小时前
Linux学习笔记(十三)--文件系统
linux·笔记·学习
jrlong4 小时前
DataWhale大模型基础与量化微调task5学习笔记(第 3 章:大模型训练与量化_Deepspeed 框架介绍)
笔记·学习
wdfk_prog4 小时前
[Linux]学习笔记系列 -- [drivers][clk]clk
linux·笔记·学习