操作系统 - 如何计算重定位中的运行时存储地址

查看:157
本文介绍了操作系统 - 如何计算重定位中的运行时存储地址的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

在看CSAPP第二版的时候看到第七章,有道题的题目是

图7-10中的swap程序包含5个重定位的引用,对于每个重定位的引用,给出他们在7-10中的行数,运行时存储地址和值

在网上看到的答案是(不知道是否正确)

 Line # in Fig. 7.10       Address        Value
      15(bufp0)          0x080483CB    0x0804945c
      16(buf[1])         0x080483D0    0x08049458 
      18(bufp1)          0x080483D8    0x08049548
      18(buf[1])         0x080483DC    0x08049458
      23(bufp1)          0x080483E7    0x08049548
      

书前的例子关于绝对重定位太含糊其词了,关于地址只有关于buf的,但是我没出来和答案中address的联系,想问下,答案中的address是如何求出来的

解决方案

图 7.19 不是已经给出答案了吗?

所谓的重定位是在链接阶段才确定的地址部分,这里重定位是 R_386_32 类型,也就是说不需要进行额外计算,直接把确定后的32位值填入指令对应位置即可。

比如图 7.10 中的第15行的指令: mov 0x0804945c, %edx, 其指令地址(PC)是 80483c9 ~ 80483ce 这6个字节,对应指令的值分别是 8b 15 5c 94 04 08,以上是重定位之后的结果;
重定位之前对应的信息在 7.19 第3行,指令是 mov 0, %edx, 由于这时还不知道bufp0的值,所以指令中包含bufp0地址的部分先填0,这时的指令6字节分别是 8b 15 00 00 00 00, 所以确定了后面4个字节 00 就是填入的重定位值,所以15行的重定位地址就是 指令PC+2字节偏移, 即 80483c9 + 2 = 80483cb ; 对应的值就是后面4个字节的内容 5c 94 04 08,这里的顺序是从低地址到高地址,变成32位数就是 0x0804945c。说明第一项答案是正确的。

同理可以计算验证后面4项的答案。

不知这样说是否明白?

======

下载了原书重新看了一下这道题目,其实很简单,7-19 已经把 5 个 reloc 项和它相对于swap的相对地址给出了,比如 3: R_386_32 bufp0,address 值其实就是 swap 地址 + 3, value 值就是 bufp0 的地址,而 swap 和 bufp0 可以直接从 7-10 中查到,分别是 0x080483c8 和 0x0804945c,所以第一项答案就是 :
Address = swap + 3 = 0x080483cb, Value = 0x0804945c .

这篇关于操作系统 - 如何计算重定位中的运行时存储地址的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆