程序员的自我修养(十)动态链接

本文深入探讨了动态链接的概念及其在运行时链接的特点,解释了动态链接如何解决共享目标文件浪费磁盘空间的问题,以及它如何通过动态选择加载程序模块来增强程序的可扩展性和兼容性。文章还详细分析了重定位过程,包括静态链接和装载时的重定位,以及地址无关代码的目的。此外,还讨论了模块中的不同地址引用类型,如模块内部和外部的函数调用、数据访问等,并阐述了动态链接与静态链接相比在全局变量处理上的区别。最后,介绍了延迟绑定的基本思想和优点,即在函数首次使用时进行绑定,以加快程序启动速度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

动态链接其实就是把链接的过程推迟到了运行时再进行。

特点
  • 解决了共享的目标文件多个副本浪费磁盘和空间的问题
  • 可以动态地选择加载各种程序模块【程序可扩展性和兼容性】
重定位
  • 静态链接时的重定位–链接时重定位
  • 装载程序时的重定位–装载时重定位,在Windows中又被称为基址重置
地址无关代码

目的:希望程序模块中共享的指令部分在装载时不需要因为装载地址的改变而改变。

-fPIC-fPIE

模块中的几种地址引用:

  1. 模块内部的函数调用、跳转等【这种不需要重定位】
  2. 模块内部的数据访问,比如模块中定义的全局变量、静态变量【相对寻址】
  3. 模块外部的函数调用、跳转等【GOT,但是保存的是目标函数的地址】
  4. 模块外部的数据访问,比如其他模块中定义的全局变量【全局偏移表(Global Offset Table,GOT)–ELF在数据段里面建立了一个指向和本模块装载地址有关的其他模块的全局变量的指针数组】
    在这里插入图片描述
共享模块的全局变量问题

在这里插入图片描述
在这里插入图片描述

动态链接比静态链接慢,原因?
  1. 动态链接下对于全局和静态的数据访问都要进行复杂的GOT定位,然后间接寻址;对于模块间的调用也要先定位GOT,然后进行间接跳转
  2. 动态链接的链接工作在运行时完成
延迟绑定(PLT)

基本思想:当函数第一次被用到的时候才进行绑定(符号查找、重定位等)

优点:加快程序的启动速度【针对上面原因的第二点】

这种方法使用了一些很精妙的指令序列来完成。
在这里插入图片描述

需要补充了解的知识

1、 指令寻址方式【汇编】

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值