【无标题】

4、链接:

现在我们要开始链接了,我们也知道,链接是一个十分复杂的过程,其经历之长,令人不自觉发出感叹,而此时我们要介入的就是这个神秘的领域了:

首先,链接的对象是谁,你不是说了吗,对象吗,hh,也就是说是a.o,b.o这样的.o文件,通过这些文件,链接可以顺利进行,同时,由于.o文件具有多个段,因此第一步就是将他们按照各个段进行合并,如此就可以顺利实现链接第一步了。第一种方法是将各个段剑锋插针,不行,因为段太多了,不好管理,因此我们选择了将相同性质段进行合并的方法,铩羽而归。如何确定段呢,我们通过扫描目标文件,主要是为了得到段是什么段,有多长,在什么位置,之后进行合并就可以了。之后根据信息重定位就是问题的关键了。但是这个vm是os自己分配的,而不是我们分配的,一开始的时候也是没有的,也就是说分配过程是后过程,而非前过程。前边是进行信息的确定,而且由于各个函数具有偏移量,因此结果是偏移量+vm。开始时,目标文件没有vm,因为没有分配,此时不管什么函数,我们都看做是地址为0。总之关键在于,我们通过地址分配得到了结果,得到了偏移量,得到了段长,然后通过地址分配,得到最终连接的结果。所以.o文件没有地址,而连接后可执行文件有地址,而如何进行最后这种vm+offset的重定位?通过段地址表,一种叫做.rel.text的段会保存text段的重定位表,类似如此,举一反三即可。通过objdump -r a.o则可以看到a.o的重定位地址。offset是重定位位置,对可重定位文件是相对于段开始偏移,对可执行文件则是vm。通过readelf -s a.o我们可以查看符号表,

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值