当前位置: 首页 > news >正文

动态库加载的底层原理

动态库加载的底层原理

1. 动态库加载策略

动态库有两种绑定策略,延迟绑定(Lazy Binding)立即绑定(Eager Binding)。这两种绑定方式在程序编译时确定,决定程序在运行时如何加载动态库。

1.1 延迟绑定

延迟绑定为程序运行过程中,首次调用库函数时再解析符号,进行动态库加载。延迟绑定是 gcc 的默认动态库绑定策略:

gcc -o main main.c -Wl,-z,lazy

-Wl 表示将选项传递给链接器,-z,lazy 表示选择延迟绑定策略。

1.2 立即绑定

立即绑定为在程序启动时,完成所有符号解析,即在程序启动时加载动态库。

gcc -o main main.c -Wl,-z,now

-Wl 表示将选项传递给链接器,-z,now 表示选择立即绑定策略。

1.3 绑定选择策略

立即绑定更适合在程序处于调试阶段中使用,立即绑定在程序启动时对所有符号解析,可以快速检查出库和符号错误,即时修改 BUG。由于一个程序不一定会用到其包含的所有动态库,如果 release 程序也使用立即绑定,程序的启动速度可能就会很慢。所以会使用延迟绑定让库按需加载来提升程序运行速度

2. 动态库的底层

当进程被加载到内存时,其依赖的动态库并不会立即加载进内存,而是由操作系统的动态链接器(如 Linux 下的 ld.so)按需加载。当进程首次调用动态库中的函数或访问其中的符号时,动态链接器会将动态库映射到进程的虚拟地址空间中。动态库的加载主要通过内存映射(mmap)机制实现,这样可以在需要时加载动态库的内容,节省内存资源

在进程的虚拟地址空间中,动态库的代码和数据被映射到特定区域。动态库的代码段通常是只读且可执行的,因此多个进程可以共享相同的物理内存页。而数据段则是私有的,每个进程有自己独立的数据副本。相比之下,静态库在编译时被直接链接进可执行文件,成为程序代码的一部分,加载时与程序一起进入内存。

当其他进程需要使用已加载的动态库时,操作系统会通过内存映射技术共享动态库的物理页,避免重复加载。内核在映射动态库时会检测是否已有相同的文件映射,若存在,则直接共享已加载的物理页,进一步优化内存使用

由于动态库可以被加载到虚拟地址空间的任意位置,为了保证代码的可执行性,动态库通常被编译为位置无关代码PIC,Position Independent Code)。这样,无论动态库被加载到虚拟地址空间的哪个位置,都能正确访问其内部的函数和数据。

PIC 通过相对寻址方式访问数据和函数,主要依赖全局偏移表(GOT,Global Offset Table)和过程链接表(PLT,Procedure Linkage Table)来实现符号解析和函数调用。

相关文章:

  • 10G/25G PCS only mode for CoaXPress Over Fiber
  • 基于ICEEMDAN-SSA-BP的混合预测模型的完整实现过程
  • 【排序算法】冒泡排序详解--附详细流程代码
  • 对WireShark 中的EtherCAT抓包数据进行解析
  • MongoDB 错误处理与调试完全指南:从入门到精通
  • 黑马k8s(十六)
  • 积木高楼
  • 打卡day36
  • 视频剪辑SDK定制开发技术方案与报价书优雅草卓伊凡
  • 《STL--list的使用及其底层实现》
  • systemverilog的单精度浮点和双精度浮点
  • JavaWeb:SpringBoot配置优先级详解
  • 工程师 - Worm Gear
  • NV171NV173美光闪存颗粒NV181NV186
  • 《仿盒马》app开发技术分享-- 地址管理页(端云一体)
  • Spring Security框架全面解析与应用实践
  • FPGA实战项目4——AI 推理加速器
  • 【鸿蒙开发】Hi3861学习笔记-倾斜传感器
  • 微信小程序常用方法
  • C++23 对部分特性的 constexpr 支持
  • 甘肃省建设局网站首页/关键词百度网盘
  • 南昌网站建设品牌/写软文赚钱的平台都有哪些
  • 组织建设是什么意思/seo搜索引擎优化人才
  • 网站后台首页/北京环球影城每日客流怎么看
  • 便宜手机网站建设/seo优化服务公司
  • 网站的主要功能/企业网络推广方式