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

本文探讨了符号表、重定位项及链接过程中的关键概念。通过实例分析,详细解释了不同类型的符号如何被定义与引用,以及在.text和.data段中如何进行重定位。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


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++。








评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值