深入理解计算机系统(第二版) 家庭作业 第七章


7.6
符号
swap.o 条目
符号类型
定义符号的模块
所属的节
buf
Yes
extern
main.o
.data
bufp0
Yes
global
swap.o
.data
bufp1
Yes
local
swap.o
.bss
swap
Yes
global
swap.o
.text
temp
No
-
-
-
incr Yes local swap.o .text
count Yes local swap.o .data

7.7
可以将定义double x;移入f()内部。
也可以在double x前加上static。

7.8
A. 
a)REF(main.1)-->DEF(main.1)
b)REF(main.2)-->DEF(main.2)
B. UNKNOWN
C. ERROR

7.9
p2中的main是弱符号,链接后的引用是foo6.c中的函数main。
main的第一个字节就是0x55(pushl %ebp),所以能打印出0x55。

7.10
A. gcc p.o libx.a p.o
B. gcc p.o libx.a liby.a libx.a
C. gcc p.o liby.a libx.a liby.a libz.a

7.11
未初始化的全局变量在目标文件中是没有分配存储空间,而在加载之后,会需要一些空间。
所以这些空间可能是为.bss中的符号准备的。但具体为什么是0x104和0xe8就不清楚了。

7.12
行号
运行时存储器地址
15(bufp0)
0x080483CB
0x0804945C
16(buf[1])
0x080483D0
0x08049458
18(bufp1)
0x080483D8
0x08049548
18(buf[1])
0x080483DC
0x08049458
23(bufp1)
0x080483E7
0x08049548

7.13
这道题可以推测出来哪些代码需要重定位。
当然,我们假设所有的符号都已经有了运行时地址。
.text中有3个地方有重定位。
第12行是调用p3,返回值被放在了edx中。
14行要将xp的值放入eax。这里的0x0其实应该重定位为xp的地址,所以这应该是一个绝对引用。
接着add (%eax),%edx,也就是完成了*xp + p3()。
然后再push %edx,作为参数压入栈。
第17行是调用p2()。最后返回。
所以.text中有三个地方需要重定位。
是相对或者绝对的话,我不太清楚(猜测的)。
行号 节偏移 重定位类型 符号名字
12 0x12 相对 p3
14 0x19 绝对 xp
17 0x21 相对 p2
在.data节中,第一个x是不需要重定位的,第二个xp的值需要重定位为x的地址。
行号 节偏移 重定位类型 符号名字
12 0x04 绝对 x

7.14
汇编代码其实比较好理解。eax是val,最开始val-100和5比较,如果大于5,就直接到16行去+6。
否则根据跳转表跳到相应的地址(edx*4+0)。
所以,重定位时,需要将所有的ja和jmp指令的目的地修改为对应的地址。
(我不太明白这里该怎么重定位,因为代码中不是四个字节的地址(第7,10,12,15行),所以可能是相对的,如果是相对的就不需要重定位了)
需要注意的是第8行,jmp *0x0(,%edx,4)这一句。
这里的0x0是指.rodata的地址,这是肯定需要重定位的。
行号 节偏移 重定位类型 符号名字
8 0x11 绝对 .rodata
在.rodata中,所有的跳转表都需要重定位到相应代码的位置。
符号名字就不知道了。
行号 节偏移 重定位类型 符号名字
.rodata1 0x0,0x4,0x8,0xc,0x10,0x14 绝对 ?


7.15
用的是windows系统,不太清楚这些怎么用。
好像连LDD都没有。
而且在mingw中也没找到libc.a,倒是有libstdc++。








  • 8
    点赞
  • 67
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值