7.7.1 重定位条目
要解释第一段,先解释一下图7-11

每个冒号前面的数字计算如下(除了两个重定位条目):
0: 第一条指令起始偏移
4: 第一条指令占4字节,下一条指令偏移为4
9: 第二条指令占5字节,下一条指令偏移为9
e: 第三条指令占5字节,下一条指令偏移为e(十六进制14)
13: 第四条指令占5字节,下一条指令偏移为13(十六进制19)
17: 第五条指令占4字节,下一条指令偏移为17(十六进制23)
那么重定位条目是怎么出来的?比如a:我们知道在汇编代码第4行的起始地址是9,这一行指令的第一个字节是操作码bf,剩下四个00是占位符(占位符就是在可重定位目标文件中用00代替,在链接器重定位形成的可执行目标文件中,00就被真正的地址给替代了,可以看图7-12),于是9加上一个字节(这一个字节是操作码的大小)就是a,表示从地址a开始修改指令
然后我们来看第一段:在汇编代码第三行,是一个常数2,这里就不需要重定位;而第四行,是一个指针array,如果只看这一个文件(也就是main.c),那么可以知道这个array是一个全局数组,而全局变量是需要放在内存的另一个地方的,所以汇编器是不知道指针array的具体位置的,于是只能添加上重定位条目(汇编代码第五行),告诉链接器,汇编代码第四行需要重定位,00和0x0都是用来占位的,链接器要修改。重定位条目具体的解读见下一节blog
offset也就是a和f;symbol就是一个引用

浙公网安备 33010602011771号