【仅供参考】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)       

                                  

  • 4
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值