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

静态链接的缺点:

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

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

动态链接的步骤如下:

1.装载可执行文件

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

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

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

 

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

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

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

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

进程都有一个副本。

 

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

 

动态链接的缺点:

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

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

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

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

 

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

上一篇:ValueError: Error when checking : expected input_1 to have 4 dimensions, but got array with shape


下一篇:关于原来pwntools自带格式化字符串漏洞函数而我不知道一个个字节输入地址这件事——axb_2019_fmt32