7.6
【答案】
符号 | swap.o.symtab条目? | 符号类型 | 定义符号的模块 | 节 |
buf | 是 | 外部 | m.o | .data |
bufp0 | 是 | 全局 | swap.o | .data |
bufp1 | 是 | 局部 | swap.o | .bss |
swap | 是 | 全局 | swap.o | .text |
temp | 否 | —— | —— | —— |
incr | 是 | 局部 | swap.o | .text |
count | 是 | 局部 | swap.o | .bss |
【解释】
全局符号:非静态的C函数和全局变量
外部符号:其他模块定义的非静态的C函数和全局变量
局部符号:带static属性的C函数和全局变量(其他模块中不可引用)
.data:已初始化的全局和静态C变量
.text:已编译好的机器代码
.bss:未初始化的全局和静态C变量,以及初始化为0的全局或静态变量
7.7
【答案】删去
7.8
【答案】
A.main.1
main.2
B.未知 未知
C.错误 错误
【解释】
A.模块2中的main被定义为静态全局变量,static没有强弱之分,所以我们就看作不是一个东西。
B.两个弱符号,随机选择。
C.两个强符号,违反了规则1.
7.9
【答案】
因为不初始化main,在模块foo6.c中,main为函数名是强符号,而在bar6.c中为弱符号,所以链接会选择main为函数名,那么打印出来的就是main函数的起始地址。
7.10
【答案】
A. Linux> gcc p.o libx.a p.o
B. Linux> gcc p.o libx.a liby.a libx.a
C. Linux> gcc p.o libx.a liby.a libx.a libz.a
7.11
【答案】因为在可执行文件中,.bss中的节不占据实际的空间,只有在运行时,内存为其分配空间
7.12
【答案】
A. ADDR(s) = ADDR(.text) = 0x4004e0 和 ADDR(r.symbol) = ADDR(swap) = 0x4004f8
refaddr = ADDR(s) + r.offset = 0x4004e0 + 0xa = 0x4004ea
*refptr = (unsigned) ( ADDR(r.symbol) + r.addend - refaddr)
= (unsigned) ( 0x4004f8 + (-4) - 0x4004ea)
= (unsigned) (0xa)
B. ADDR(s) = ADDR(.text) = 0x4004d0 和 ADDR(r.symbol) = ADDR(swap) = 0x400500
refaddr = ADDR(s) + r.offset = 0x4004d0 + 0xa = 0x4004da
*refptr = (unsigned) ( ADDR(r.symbol) + r.addend - refaddr)
= (unsigned) ( 0x400500 + (-4) - 0x4004da)
= (unsigned) (0x22)