程序员的自我修养——7、动态链接

7.1 为什么要动态链接


1)内存和磁盘空间浪费

静态链接的方式对于计算机内存和磁盘的空间浪费非常严重。(特别是多进程操作系统下)




在静态链接的情况下,Program1和Program2都用到了Lib.o这个模块,所以它们同时在链接输出的可执行文件Program1和Program2有两个副本。


在静态链接中,C语言静态库是很典型的浪费空间的例子。


2)程序开发和发布

静态链接对程序的更新、部署和发布也会带来很多麻烦。一旦程序中有任何模块更新,整个程序就要重新链接、发布给用户。



3)动态链接


动态链接:就是不对那些组成程序的目标文件进行链接,等到程序要运行时才进行链接


优点:

1、共享模块的好处不仅仅是节省内存,还可以减少物理页面的换入换出,还可以增加CPU缓存的命中率,因为不同进程间的数据和指令访问都集中在了同一个共享模块上。


2、动态链接使得程序的升级更加容易;使得开发过程中各个模块更加独立,耦合度更小便于不同开发者和开发组织之间独立进行开发和测试


3、在程序运行时,可以动态地选择加载各种程序模块,(被称为 插件(Plug-in))


缺点:

当程序所依赖的某个模块更新后,由于新的模块与旧的模块之间接口不兼容,导致了原有的程序无法运行。



动态链接的基本实现:

Linux中,动态链接文件被称为动态共享对象(DSO,Dynamic Shared Objects),共享对象。【.so】

windows中,动态链接文件被称为动态链接库(Dynamic Linking Library)。【.dll】


从本质上来讲,普通可执行程序和动态链接库中都包含指令和数据


程序与动态链接库之间真正的链接工作是由动态链接器完成的。(之前静态链接器 ld)


动态链接会导致程序在性能的一些损失,可以通过 延迟绑定 (Lazy Binding)等方法,使得动态链接的性能损失尽可能减少。


7.2 简单的动态链接例子












7.3 地址无关代码






7.4 延迟绑定(PLT)











7.5 动态链接的相关结构






7.6 动态链接的步骤和实现




7.7 显式运行时链接






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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值