计算机系统基础 链接器的重定位
考前突击习题复习
你好! 这篇博客主要是介绍的是临时面对考试时,关于链接器的重定位习题的做题思路与步骤,适用于学不完了的同学,可以在考题不难且没什么变试的情况下临时抱一下佛脚。
重定位算法
图7-10展示了链接器的重定位算法的伪代码,提供了两种方法。
第三行计算的是需要被重定位的4字节引用的数组s中的地址。如果这个引用是PC相对寻址,那么它就用第5~9行来重定位。如果该引用使用的是绝对寻址,那么它就通过第11~13行来重定位。
main.o的反汇编代码
1.重定位PC相对引用
- 首先判断寻址方式
看反汇编代码的5和7行,R_X86_64_PC32就是重定位PC相对引用,则对应重定位算法第5~9行。 - 读代码,将对应的数据附上值。
算法代码中(第5~9行):
- refaddr:引用的运行时地址(需要算)
- ADDR(s):符号地址(题目给出)
- r.offset:偏移量(重定位入口)
- *refptr:更新该引用,运行时指向sum程序(需要算)
- ADDR(r.symbol):机器分配的 (题目给出)
- r.addend:在反汇编代码里可读出
反汇编代码中(第7行)
- r.offset = 0xf
- r.symbol = sum
- r.type = R_X86_64_PC32
- r.addend = -4(注意符号)
- 带入计算公式
假设链接器已经确定:
ADDR(s) = 0x4004d0
ADDR(r.symbol) = ADDR(sum) = 0x4004e8
则有
refaddr = ADDR(s) + r.offset = 0x4004d0 + 0xf = 0x4004df
*refptr = (unsigned)(ADDR(r.symbol) + r.addend - refaddr)
= (unsigned)(0x4004e8 + (-4) - 0x4004df)
= (unsigned)(0x5)
2.重定位绝对引用
- 首先判断寻址方式
看反汇编代码的5和7行,R_X86_64_32就是重定位绝对引用,则对应重定位算法第11~13行。 - 读代码,将对应的数据附上值。
算法代码中(第11~13行):
- *refptr:更新该引用,运行时指向array程序(需要算)
- ADDR(r.symbol):机器分配的 (题目给出)
- r.addend:在反汇编代码里可读出
反汇编代码中(第5行)
- r.offset = 0xa
- r.symbol = array
- r.type = R_X86_64_32
- r.addend = 0
- 带入计算公式
假设链接器已经确定:
ADDR(r.symbol) = ADDR(array) = 0x601018
则有
*refptr = (unsigned)(ADDR(r.symbol) + r.addend)
= (unsigned)(0x601018 + 0)
= (unsigned)(0x601018)