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

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

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

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

-fPIC-fPIE

模块中的几种地址引用:

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

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

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

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

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

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

需要补充了解的知识

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值