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我们可以查看符号表,