题7.6
解答:
题目分析过程:
buf:符号buf在本段代码中是一个对外部符号的引用,因此有符号表条目,因为是对外部全局变量的引用,所以他的类型是全局符号,不在本模块定义,应该在main.o中定义,处在.data节。
bufp0:符号bufp0是在本模块定义的一个全局变量并且进行了初始化,因此有符号表条目,类型是全局符号,在swap.o中定义,因为进行了初始化,所以是处在.data节。
bufp1:符号bufp1是带有static属性的全局变量,因此是一个本地符号,有符号表条目,类型是本地符号,在swap.o中定义,因为没有进行初始化,所以是处在.bss节。
swap:符号swap是在本模块中定义的一个函数,属于全局符号,有符号表条目,类型是全局符号,在swap.o中进行了定义,所以是处在.text节。
temp:temp是一个局部变量,也不是static类型,只有在引用时才会为他在栈中分配空间,因此在符号表中没有条目,也不需要提前分配空间。因此不属于任何一个节。
incr:符号incr是在本模块中定义的一个static类型的函数,属于本地符号,有符号表条目,类型是本地符号,在swap.o中进行了定义,所以是处在.text节。
count:符号count是在本模块中定义的一个static类型的局部变量,虽然是局部变量,但是是static类型,所以要提前分配空间,有符号表条目,类型是本地符号,在swap.o中进行了定义,因为进行了初始化,但是初始化的值是0,所以是处在.bss节。
符号 swap.o.symtab条目? 符号类型 定义符号的模块 节
buf 是 外部符号(extern) main.o .data
bufp0 是 全局符号(global) swap.o .data
bufp1 是 本地符号(local) swap.o .bss
swap 是 全局符号(global) swap.o .text
temp 否 无 无 无
incr 是 本地符号(local) swap.o .text
count 是 本地符号(local) swap.o .bss
题7.12
解答:
题目分析过程:
这五个重定位的条目为绝对寻址
第1条对应代码中可以找到第15行,可以从已经重定位的text节中找到其中的存储器地址为0x080483CB,此处的值已重定位为0x0804945C,0x0804945C指向的是data节中存储的0x8049454
第2条对应代码中可以找到第16行,可以从已经重定位的text节中找到其中的存储器地址为0x080483D0,此处的值已重定位为0x08049458,0x08049458指向的是data节中存储的0x00000002
第3条对应代码中可以找到第18行,可以从已经重定位的text节中找到其中的存储器地址为0x080483D8,此处的值已重定位为0x08049548,0x08049548指向的是data节中存储的0x8049458
第4条对应代码中可以找到第18行,可以从已经重定位的text节中找到其中的存储器地址为0x080483DC,此处的值已重定位为0x08049458,0x08049458指向的是data节中存储的0x00000002
第5条对应代码中可以找到第23行,可以从已经重定位的text节中找到其中的存储器地址为0x080483E7,此处的值已重定位为0x08049548,0x08049548指向的是data节中存储的0x8049458
行号 运行时存储器地址 值 绝对寻址指向的.data节中的数据值
15 0x080483CB 0x0804945C 0x8049454
16 0x080483D0 0x08049458 0x0000002
18 0x080483D8 0x08049548 0x8049458
18 0x080483DC 0x08049458 0x0000002
23 0x080483E7 0x08049548 0x8049458
题7.13
解答:
题目分析过程:
A:重定位时对于.text中的指令的修改
- p1中对p2和p3的引用以及对xp的引用一共三个部分进行了重定位。对函数的引用部分利用相对寻址,对xp的应用利用绝对寻址。
第一个部分是p2的引用,在第12行,可以看出此处的偏移是0x12,重定位的类型应该是相对寻址,符号的名字是p2
第二个是xp的引用,在第14行,可以看出此处的偏移是0x19,重定位的类型应该是绝对寻址,把xp的地址重定位进来,符号的名字是xp
第二个是p3的引用,在第17行,可以看出此处的偏移是0x21,重定位的类型应该是相对寻址和p2类似,符号的名字是p3
行号 节偏移 重定位类型 符号名字
12 0x12 相对寻址 p3
14 0x19 绝对寻址 xp
17 0x21 相对寻址 p2
B:在.data节中,需要重定位的是xp的值,他在函数p3中引用x的地址,所以xp的值需要通过绝对寻址重定位为x的地址。
在data节的第4行,节偏移是0x4,用绝对寻址定位,因为要重定位到x的地址,所以符号的名字是x
行号 节偏移 重定位类型 符号名字
4 0x4 绝对寻址 x