动态库的理解

上一篇中主要了解了下软硬链接,静态库和动态库软硬链接及静动态库-CSDN博客

这篇来简单学习下关于动态库的理解.这里主要与加载有关.

从原理上理解动态库(共享库)

动静态库都是文件,都有inode.

库会映射到堆和栈之间的共享区上.进程使用库都是在自己的进程地址空间内完成.在要执行库方法时就跳到共享区上.

多个进程要使用同一个动态库时,动态库不用重复加载,只需要把第一次使用时加载好的动态库加载到新要使用动态库的进程的地址空间中即可.动态库在内存中只需加载一份,可被多个进程共享.(所以叫共享库),节省空间.一起理解

可以结合下图

共享库可以加载到内存的任何地方,也可以映射到进程地址空间的任何地方,只要能找到就行,这就叫与地址无关.

可执行程序的格式

这里还需要了解下可执行程序的格式,在我另一篇博客中写过,如果感兴趣传送门在下

可执行程序的格式-CSDN博客

重谈地址空间(可执行程序加载)

一些问题

1.进程地址空间时操作系统申请并初始化的(因为地址空间时一个结构体对象,所以开始应该要初始化),但是要用谁的数据去初始化它呢?

从可执行程序中来,读取可执行程序中的数据节来初始化代码段数据段.
2.可执行程序(只是编译完,没有加载到内存时)有没有对应的地址?

a.有地址!形成可执行程序就形成了天然的地址(逻辑地址)

b.在ELF的section中的每一行代码都有自己的编址.每个段的编址是统一连续的,采用的时平坦模式(逻辑地址=起始地址+偏移量),平坦模式起始地址为0,所有的编址都是偏移量(从全0~全F)

c.指令也有长度,在平坦模式下,下一条指令的地址-自己指令的地址就是自己指令的长度.

d.只要找到第一个地址,程序从头向后就可以运行了.(指令长度已知).

结论:ELF在没有加载到内存的时候就已经按照从全0~全F进行编址了.这就是虚拟地址,在编译器编译时就形成的.逻辑地址(磁盘)在数字上=虚拟地址(内存).

简单了解动态库的加载

相关推荐
Ivanqhz1 小时前
正余弦位置编码(Sinusoidal Positional Encoding)
java·linux·数据库
H.莓飛1 小时前
【数据结构】队列
linux·数据结构·centos
小此方1 小时前
Linux网络(十九):TCP流量控制与滑动窗口详解,超时重传和快重传到底有什么区别
linux·运维·服务器·网络·网络协议·tcp/ip
码上有光2 小时前
Linux进程通信——共享内存、消息队列和信号量
android·linux·运维·共享内存·通信
沫璃染墨2 小时前
《从零入门Linux系统篇(五十四):线程篇·七——互斥锁底层原理:从原子交换到线程竞争与锁实现》
linux·运维·服务器·开发语言·c++·驱动开发·系统架构
Java后端的Ai之路2 小时前
Python进阶探索24_应用案例_linux系统的监控
linux·开发语言·python·应用·探索
H.莓飛3 小时前
【数据结构】队列_OJ题
linux·数据结构·centos
H.莓飛3 小时前
【数据结构】栈_OJ题
linux·数据结构·算法·centos
Ruiery3 小时前
Linux 6.6内核 CPU 深度解析(一):BSP 拉起 — 从实模式到 kernel_init 的完整旅程
linux·运维·服务器
赵民勇3 小时前
dconf命令详解
linux·运维