如何计算重定位中的运行时存储地址
在看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是如何求出来的
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
图 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 .