【仅供参考】csapp第七章课后习题答案(欢迎批评指正)

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)       

                                  

你可能感兴趣的:(c#)