7.7.1 重定位条目

要解释第一段,先解释一下图7-11
image
每个冒号前面的数字计算如下(除了两个重定位条目):

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的具体位置的,于是只能添加上重定位条目(汇编代码第五行),告诉链接器,汇编代码第四行需要重定位,000x0都是用来占位的,链接器要修改。重定位条目具体的解读见下一节blog

offset也就是afsymbol就是一个引用

posted @ 2025-08-05 18:19  最爱丁珰  阅读(11)  评论(0)    收藏  举报