深入理解计算机系统_3e 第七章家庭作业 CS:APP3e chapter 7 homework
**7.6**
+-----------------------------------------------------------------------+
|Symbol entry? Symbol type Module where defined Section |
| |
| buf Y extern m.o .data |
| |
| bufp0 Y global swap.o .data |
| |
| bufp1 Y local swap.o .bss |
| |
| swap Y global swap.o .text |
| |
| temp N ---- ---- ---- |
| |
| incr Y local swap.o .text |
| |
+-----------------------------------------------------------------------+
temp是普通局部变量,由编译器安排,和链接无关。
7.7
在bar5.c中声明x的时候使用static ,使其链接为内部链接:
/* bar5.c */
static double x;
void f()
{
x = -0.0;
}
7.8
A.
(a) REF(main.1) -> DEF(main.1)
(b) REF(main.2) -> DEF(main.2)
B.
(a) REF(x.1) -> DEF(unkown)
(b) REF(x.2) -> DEF(unkown)
C.
(a) REF(x.1) -> DEF(ERROR)
(b) REF(x.2) -> DEF(ERROR)
7.9
在我的机器上输出的是0x55,反汇编:
0000000000400526 <main>:
400526: 55 push %rbp
400527: 48 89 e5 mov %rsp,%rbp
40052a: 48 83 ec 10 sub $0x10,%rsp
40052e: 89 7d fc mov %edi,-0x4(%rbp)
400531: 48 89 75 f0 mov %rsi,-0x10(%rbp)
400535: e8 07 00 00 00 callq 400541 <p2>
40053a: b8 00 00 00 00 mov $0x0,%eax
40053f: c9 leaveq
400540: c3 retq
0000000000400541 <p2>:
400541: 55 push %rbp
400542: 48 89 e5 mov %rsp,%rbp
400545: be 26 05 40 00 mov $0x400526,%esi
40054a: bf e4 05 40 00 mov $0x4005e4,%edi
40054f: b8 00 00 00 00 mov $0x0,%eax
400554: e8 a7 fe ff ff callq 400400 <printf@plt>
400559: 90 nop
40055a: 5d pop %rbp
40055b: c3 retq
40055c: 0f 1f 40 00 nopl 0x0(%rax)
我们要关注printf的第二个参数,即%esi ,可以看到mov $0x400526,%esi ,其中0x400526就是main函数的地址 ,所以printf会默认输出开头的一个字节(char类型),即push的机器码55.
所以原因在于bar6.c中的main是一个weak类型链接的变量,而foo6.c中的main是一个strong类型的,所以再链接的时候bar6.o中的main会解析到foo6.o中的main,从而一直输入0x55.
这里要特别说明一点,在C中,函数名和数组名一样都是“二等公民”,是一个内存块的标识符,在进行算术运算的时候会“退化”为一个指针常量。这里链接的时候就没有发生退化(链接器不管编译器的事情)。如果我们将printf("0x%x\n", main);这句话放到foo6.o中则会输出400526。
7.10
注意链接器看到.o文件会直接更新E,U,D(书上有定义),后面即使有依赖也不用包含。
A.
gcc p.o libx.a
B.
gcc p.o libx.a liby.a libx.a
C.
gcc p.o libx.a liby.a libx.a libz.a
7.11
借用书上的原话:
The remaining 8 bytes in the segment correspond to .bss data that will be initialized to zero at run time.
7.12
由r.type = R_X86_64_PC32知为PC相对寻址。
A.
0x4004f8 + -4 - (0xa + 0x4004e0) = 0xa
B.
0x400500 + -4 - (0xa + 0x4004d0) = 0x22
7.13
A.


B.
不一样:

C.

深入理解计算机系统_3e 第七章家庭作业 CS:APP3e chapter 7 homework的更多相关文章
- 深入理解计算机系统_3e 第六章家庭作业 CS:APP3e chapter 6 homework
6.22 假设磁道沿半径均匀分布,即总磁道数和(1-x)r成正比,设磁道数为(1-x)rk: 由题单个磁道的位数和周长成正比,即和半径xr成正比,设单个磁道的位数为xrz: 其中r.k.z均为常数. ...
- 深入理解计算机系统_3e 第五章家庭作业 CS:APP3e chapter 5 homework
5.13 A. B. 由浮点数加法的延迟,CPE的下界应该是3. C. 由整数加法的延迟,CPE的下界应该是1. D. 由A中的数据流图,虽然浮点数乘法需要5个周期,但是它没有"数据依赖&q ...
- 深入理解计算机系统_3e 第三章家庭作业 CS:APP3e chapter 3 homework
3.58 long decode2(long x, long y, long z) { int result = x * (y - z); if((y - z) & 1) result = ~ ...
- 深入理解计算机系统_3e 第十一章家庭作业 CS:APP3e chapter 11 homework
注:tiny.c csapp.c csapp.h等示例代码均可在Code Examples获取 11.6 A. 书上写的示例代码已经完成了大部分工作:doit函数中的printf("%s&q ...
- 深入理解计算机系统_3e 第九章家庭作业 CS:APP3e chapter 9 homework
9.11 A. 00001001 111100 B. +----------------------------+ | Parameter Value | +--------------------- ...
- 深入理解计算机系统_3e 第二章家庭作业 CS:APP3e chapter 2 homework
初始完成日期:2017.9.26 许可:除2.55对应代码外(如需使用请联系 randy.bryant@cs.cmu.edu),任何人可以自由的使用,修改,分发本文档的代码. 本机环境: (有一些需要 ...
- 深入理解计算机系统_3e 第四章家庭作业(部分) CS:APP3e chapter 4 homework
4.52以后的题目中的代码大多是书上的,如需使用请联系 randy.bryant@cs.cmu.edu 更新:关于编译Y86-64中遇到的问题,可以参考一下CS:APP3e 深入理解计算机系统_3e ...
- 深入理解计算机系统_3e 第八章家庭作业 CS:APP3e chapter 8 homework
8.9 关于并行的定义我之前写过一篇文章,参考: 并发与并行的区别 The differences between Concurrency and Parallel +---------------- ...
- 深入理解计算机系统_3e 第十章家庭作业 CS:APP3e chapter 10 homework
10.6 1.若成功打开"foo.txt": -->1.1若成功打开"baz.txt": 输出"4\n" -->1.2若未能成功 ...
随机推荐
- 基于 Aspose.Cells与XML导入excel 数据----操作类封装
前言 导入excel数据, 在每个项目中基本上都会遇到,第三方插件或者基于微软office,用的最多的就是npoi,aspose.cells和c#基于office这三种方式,其中各有各的优缺点,在这也 ...
- python基础(一)------Python基础语法与介绍
编程语言的历史和Python开发 一.编程语言 1.编程语言也是"语言"与英语,汉语等类似,掌握其语法结构,灵活 的运用其语法规则为之重要. 编程语言实现的是程序 ...
- netty(三) 组件介绍
netty各组件说明:channel ----- SocketEventLoop -------控制流,多线程处理,并发channelFuture ------- 异步通知 channel:主要是实现 ...
- springboot使用i18n时properties文件中文乱码
在springboot使用i18n进行国际化文件配置时,文件名为messages_zh_CN.properties的文件中填写中文信息,当使用浏览器进行访问时,出现中文乱码,此时在idea中进行修改s ...
- mysql数据库的安装与基本配置
目录 绿色版下载 mysql绿色版(5.7版本的安装与配置) 绿色版下载: mysql官网下载地址:https://www.oracle.com/index.html mysql绿色版(5.7版本的安 ...
- nomad的简易集群
启动服务器 第一步是为服务器创建配置文件.无论是从下载的文件github,或粘贴到一个名为server.hcl: vim server.hcl # Increase log verbosity log ...
- Tomcat 日志分割
一.前言 随着每天业务的增长,Tomcat 的catalina.out日志 变得越来越大,占用磁盘空间不说.要查看某个时候的日志的时候,庞大的日志让你顿时无从下手,所以日志的切割的变得刻不容缓.而且, ...
- Javascript 数组(Array)相关内容总结
创建数组 var colors = new Array(); //创建新数组 var num = new Array(3); //创建包含三项的新数组 var names = new Array(&q ...
- HTTP / 1.1 RFC from W3C
这是一篇关于http协议的学习资料: HTTP / 1.1 RFC: https://www.w3.org/Protocols/rfc2616/rfc2616.html HTTP协议的完整资料,请参考 ...
- POJ 2828 Buy Tickets 线段树 倒序插入 节点空位预留(思路巧妙)
Buy Tickets Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 19725 Accepted: 9756 Desc ...