动态链接与静态链接的区别——程序员的自我修养

静态链接的缺点:

1.每次链接都是将所有的目标文件打包在一起成为可执行文件,所以文件和内存中都有一个副本,浪费空间

2.版本升级的时候会有问题,假如程序A依赖于库A,如何库A升级,那么所有都需要重新编译一遍,所以引用动态链接

动态链接的步骤如下:

1.装载可执行文件

2.加载动态链接器(有个段存放动态链接器的软连接地址)

3.加载程序所依赖的共享库映射到程序的地址空间。

4.符号引用绑定与重定位。

将共享文件映射到进程的内存空间的时候会有一个问题,采用的是随机分配,也就是说共享文件在每个进程的地址空间中可能是不一样的

所以重定位的时候会出现问题,也就是不能多个进程共享该指令代码,因为在进程的地址空间中不同,所以共享文件中对变量和函数的引用地址可能不同。

但这违背了动态链接的初心(实现共享),所以引入了地址无关代码,其中一个关键是引入了全局偏移表(GOT),全局偏移表的作用是对变量或者函数

引用的地址在这里面(由动态链接器进行填写)。全局偏移表存放在数据段,因为数据段每个进程有一个副本,所以每个进程的全局偏移表可以不同,这样就做到了共享代码段,数据段每个

进程都有一个副本。

动态链接器:是静态链接的,可以是与地址无关代码,也可以不是

动态链接的缺点:

1.每次运行时都需要加载共享库然后进行动态链接,所以程序启动速度比较慢

:有一个优化方法就是延迟绑定,因为在程序中很多函数比如错误处理函数这些可能是不会被调用的,所以

一开始进行绑定会浪费时间,只要在需要访问函数的时候才进行绑定,全局偏移表分为两个:.GOT   .GOT.PLT

分别存放对数据访问的地址,和对函数访问的地址

2.访问全局变量的时候都需要定位GOT表,然后进行间接引用,会浪费时间。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值