介绍了动态库的加载及使用,再来聊一聊动态库加载的原理;
可执行程序的ELF格式
在Linux中生成可执行程序,格式为ELF格式;
ELF格式可执行程序会存在很多东西,它会把可执行程序划分为:代码区、只读数据区、全局数据区等属性和字段,除此之外它还会包含一个叫符号表的东西;
那变量名、函数名等是否还存在呢? 不存在;
绝对编址 && 相对编址
绝对编址
相对编址
动态库的加载
比如:
后续进程使用时,这些库可能已经被加载到内存中了;这时如果有10个进程同时使用lilbc.so怎么办?
程序的调度执行
先来看一下结构关系图:
CPU调度执行可执行程序,先把可执行程序加载到内存中,这里需要建立这样的认识:
- 物理地址,物理地址是程序在内存中的实际位置;
- 虚拟地址,虚拟地址是程序内部使用的地址,便于开发和维护;
总结梳理一下:
- 虚拟地址:负责程序内部的逻辑调用,提供灵活和隔离的内存管理。
- 物理地址:控制指令和数据在实际内存中的查找,确保CPU可以访问和执行指令;
动态库的管理
当一个动态库被加载到内存中时,操作系统会维护一个共享库的引用计数。当第一个进程加载该动态库时,系统会将该库加载到内存中,并将引用计数设置为1。当其他进程想要使用已经加载到内存的动态库时,系统会增加该库的引用计数,而不会重新加载该库;当所有进程都不再需要该库时,系统会减少引用计数,直到引用计数为0时,系统会释放内存空间;
对多个动态库的管理:
对于加载进来的多个动态库,操作系统会创建动态库对象来表示每个加载的动态库,这些对象通常包含了动态库的基本信息;使用链表进行链接;这样就可以通过基本的链表实现对这些动态库的管理;这个数据结构也叫动态库控制块,属于内核空间(OS);
好了以上便是本文的全部内容,希望对你有所帮助,最后感谢阅读!