如何计算重定位中的运行时存储地址

发布于 2022-09-04 12:07:02 字数 823 浏览 19 评论 0

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

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

图7-10

图7-19

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

 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是如何求出来的

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

酒绊 2022-09-11 12:07:02

图 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 .

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文