动态链接与静态链接介绍;修改了动态库代码,什么时候需要重新链接整个发布件?

1、静态链接:
静态库在编译链接期间被打包copy到了可执行文件中,也就是说静态库其实是在编译期间(Compile time)链接使用的。

2、动态链接:
2.1、load-time dynamic linking(加载时动态链接)

  • 阶段一:链接时,将动态库信息写入可执行文件;
    在编译链接生成可执行文件阶段时需要告诉编译器所依赖的动态库信息
  • 阶段二:加载时,可执行文件依据动态库信息进行动态链接。
    当可执行文件加载(可执行文件复制到内存)完成后,在程序开始运行之前,操作系统就会查找可执行文件依赖的动态库信息,即依据第一阶段给的链接信息进行动态库的查找以及符号决议。 找到该动态库后就将该动态库从磁盘搬到内存,如果这个过程没有问题,那么程序开始运行。

2.2、run-time dynamic linking(运行时动态链接)
运行时动态链接不需要在编译链接时提供动态库信息,也就是说,在可执行文件被启动运行之前,可执行文件对所依赖的动态库信息一无所知,只有当程序运行到需要调用动态库所提供的代码时才会启动动态链接过程。

在动态链接下,可执行文件当中会新增两段,即dynamic段以及GOT(Global offset table)段,这两段内容就是是我们之前所说的动态库信息。 dynamic段中保存了可执行文件依赖哪些动态库,动态链接符号表的位置以及重定位表的位置等信息。
参考资料:彻底理解链接器:三,库与可执行文件

3、数据段与代码段的内容:

  • 代码段:指的是计算机可以执行的机器指令,也就是源文件中定义的所有函数
  • 数据段:源文件中定义的全局变量。
    特例:局部变量是函数私有的,所以函数私有的局部变量被放在了代码段中,作为机器指令的操作数

4、什么时候需要重新链接:
如果我们修改了动态库的代码,我们只需要重新编译动态库就可以了而无需重新新编译我们自己的程序,因为可执行文件当中仅仅保留了动态库的必要信息,重新编译动态库后这些必要都信息是不会改变的(只要不修改动态库的名字和动态库导出的供可执行文件使用的函数), 编译好新的动态库后只需要简单的替换原有动态库,下一次运行程序时就可以使用新的动态库了。

参考链接:编译链接全套学习资料

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值