26(下).库的理解与加载

把加载后的库映射到A进程地址空间里,A就可以用这个动态库了,加载到B,B也能用了。

所以动态库也叫共享库。动态库是如何与我们的可执行程序(即运行中的进程)建立关联的?答案是:通过进程的虚拟地址空间进行关联的


动态库是如何加载的。

库映射到堆栈之间的共享区。

"动态链接器 (Dynamic Linker) 的核心职责,是在程序运行期间将依赖的动态库加载到内存中。

具体流程是这样的:正如我们刚才所说,程序启动后,它所依赖的动态库也必须被同步加载。这个加载动作是由谁触发的呢?

当操作系统把你的程序跑起来时,最先执行的并不是 main 函数,而是程序的底层入口 _start 函数。在这个启动阶段,程序会自动去调用系统提供的动态加载器(在 Linux 中通常是 ld-linux.so)。由这个加载器接管控制权,去硬盘上找到你程序所需的动态库,并把它们加载映射到进程的虚拟地址空间里。完成这些准备工作后,才会真正开始执行你写的业务代码。"

"好,我们来总结一下。动态库里的函数,其在库内部的编址方式全部都是相对偏移量

这与我们的可执行程序主体 是不同的。传统的可执行程序在加载到虚拟地址空间时,往往有一个固定的加载基址(讲师为了简化模型,比喻为0号地址)。因为它的位置是固定的,所以它内部的函数可以直接使用写死的绝对地址,刚好与虚拟地址直接吻合。

但是,动态库不能固定位置。它会被操作系统动态映射到虚拟地址空间'共享区'的任意空闲位置。> 那么我们怎么访问动态库里的函数呢?非常简单:无论动态库被映射到了哪个位置,它都会获得一个起始虚拟地址(基址) 。我们只需要拿这个起始地址 + 目标方法在库里的偏移量,就能算出这个函数在当前进程中的绝对物理/虚拟地址了。

结论就是:因为使用了偏移量,动态库在地址空间里可以随便映射。只要运行时能获取到它的起始基址,我们就能准确无误地调用库当中的任何方法了。"

可执行程序不是从0开始,静态链接是直接填,动态链接都要算

静态链接之后就不是从零开始,动态链接之后。so还是从0开始

从0开始也就相当于偏移量,映射到物理内存直接加上基地址就是虚拟地址

当前进程加载时候,进程初始化,加载时候 ,把进程代码数据先加载进来,执行------start需要执行动态连接器的方法,识别到程序依赖c标准库,所以要访问c标准库了,就要先找到这个库,肯定能找到,elf内符号表会记录我这个库依赖的路径,所以编译链接 所以要告诉-I -L -l 要告诉编译时库得的路径,在编译时指定,指定之后,程序就知道了,路径也知道了,就能打开库,根据struct file找到dentry inode datablock 把动态库加载到内存,嘉爱进来之后,动态库内的方法也是采用绝对编制的,我们当成库中方法偏移量,库因为有大小,我们现在要映射到内存地址空间,创建vmstruct把这个节点插入链表当中,用库大小初始化start end,库映射到地址空间后,就一定能得到库的虚拟地址,加上所有方法偏移量就能访问库。

vmsttruc内有个指针指向文件,就能通过path找到dentry就有目录结构,就找到inode就鞥能找到iblock找到动态库,就能把动态库加载进来建立起映射关系

库名字用起始地址家偏移量替换掉,就完成了

相关推荐
爱学习的小囧2 小时前
零门槛!VCF 自动化环境登录 vSphere Supervisor 全教程
运维·服务器·算法·自动化·vmware·虚拟化
wbs_scy2 小时前
Linux 动静态库完全指南:制作、使用、原理与实战
linux·运维·服务器
孙同学_2 小时前
【Linux篇】Socket编程TCP
linux·网络·tcp/ip
沃和莱特2 小时前
Copy as fetch + Skill:自动化问题记录分析的实践与思考
运维·ai·自动化·编程·skills
赛博云推-Twitter热门霸屏工具2 小时前
从手动运营到自动化增长:赛博云推让Twitter推广效率提升10倍
运维·自动化·twitter
Crazy CodeCrafter2 小时前
租金要交,但客流为零,要关店了?
大数据·运维·经验分享·自动化·开源软件
zopple2 小时前
Knife4j文档请求异常(基于SpringBoot3,查找原因并解决)
java·服务器·数据库
侯侯Hou2 小时前
Linux系统安装OpenClaw
linux
charlie1145141912 小时前
2026年IMX6ULL正点原子Alpha开发板学习方案——U-Boot完全移植概览:从官方源码到你的自制板,这条路有多远
linux·学习·嵌入式·uboot·嵌入式linux·工程实践·编程指南