【静态链接】第2章---------------------静态链接过程(空间地址分配)


########  该系列博文为书籍《程序员的自我修养》的笔记 ##########

【说明】

              静态链接相对动态链接来说要简单得多,就是把几个输入目标文件加工后并成一个输出文件,但是这中间涉及到很多问题,比如对于符号的引用要如何处理,又比如各个目标文件的内容要如何在可执行文件中排列,这一章就来谈谈这些内容,但是首先我们先要来认识什么是“空间”,以及“地址”的管理。


【相似段合并】

               我们知道,每个目标文件都有很多"段"组成”,那么当把多个目标文件链接成一个可执行文件的时候,这些段要进行合并。如图

               

                      1)好了,现在第一概念就是相同的段到了可执行文件里会合并!

                      2)如果我们就简单得直接合并会出现什么问题呢?

【直接合并后的问题】

                 由于各个目标文件都是独立编译的,所以编译器在编译的时候根本就不知道该目标文件等到链接结束之后,会成为可执行文件的哪一部分,比如它的代码段,在单独的目标文件中,应该说第一条指令的地址是0才对,比如这是一条内存取值指令,取的是数据段的第一个数据的内容,比如这个内容在目标文件中被定为地址0X100,但是当这个目标文件被链接到可执行文件中的时候,这个数据的地址就太可能是0X100了(因为前面可能放了别的目标文件的数据段),所以原来这条指令的0X100取值肯定会出问题!那怎么办呢。。这就是要用到后面讲的符号重定位了。


【空间】

                  我们说的空间其实指的两个概念:

                             1)可执行文件中的空间,也就是实打实的存在文件里边的内容占用了文件的空间。

                             2)可执行文件被加载到虚拟内存中的时候,被加载的内容在内存中的空间。

                             3)比如.bss段,我们说它没有被存储到文件中,因为都是0嘛。所以显然它在文件中所占有的空间和在虚拟内存中是不一样的。

                

【链接的步骤】

                    1)空间和地址分配

                    2)符号解析和重定位,这步才是核心!

                   

 

 符号地址的确定】

                  假如有一变量a 它原来的地址是偏移数据段X的位置,比如说偏移是0X10把,那要如何确定链接之后这个变量a的地址呢(也就是符号a的值)。其实简单,只需要知道这个目标文件的数据段链接后放在哪个地址上不就可以了吗,比如这个目标文件的数据段整段都放在了可执行文件数据段偏移值0X80000000处,那这个a 现在的地址不就是  0x80000010了吗。。静态链接中,符号地址就是这个确定的。

                   原来:目标文件数据段基地址 + a 的偏移值

                   链接后:可执行文件数据段基地址 + 目标文件数据段偏移 +  a的偏移

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值