计算机系统基础 链接器的重定位

考前突击习题复习

你好! 这篇博客主要是介绍的是临时面对考试时,关于链接器的重定位习题的做题思路与步骤,适用于学不完了的同学,可以在考题不难且没什么变试的情况下临时抱一下佛脚。

重定位算法

在这里插入图片描述
图7-10展示了链接器的重定位算法的伪代码,提供了两种方法。

第三行计算的是需要被重定位的4字节引用的数组s中的地址。如果这个引用是PC相对寻址,那么它就用第5~9行来重定位。如果该引用使用的是绝对寻址,那么它就通过第11~13行来重定位。

main.o的反汇编代码

在这里插入图片描述

1.重定位PC相对引用

  1. 首先判断寻址方式
    看反汇编代码的5和7行,R_X86_64_PC32就是重定位PC相对引用,则对应重定位算法第5~9行。
  2. 读代码,将对应的数据附上值。

算法代码中(第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(注意符号)
  1. 带入计算公式
    假设链接器已经确定:
    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.重定位绝对引用

  1. 首先判断寻址方式
    看反汇编代码的5和7行,R_X86_64_32就是重定位绝对引用,则对应重定位算法第11~13行。
  2. 读代码,将对应的数据附上值。

算法代码中(第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
  1. 带入计算公式
    假设链接器已经确定:
    ADDR(r.symbol) = ADDR(array) = 0x601018
    则有
    *refptr = (unsigned)(ADDR(r.symbol) + r.addend)
    = (unsigned)(0x601018 + 0)
    = (unsigned)(0x601018)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值