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

静态链接的缺点:

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、付费专栏及课程。

余额充值