深入理解计算机系统_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若未能成功 ...
随机推荐
- Velocity(1)——初步入门
1.变量 (1)变量的定义: 1 #set($name = "hello") 说明:velocity中变量是弱类型的. 2 3 当使用#set 指令时,括在双引号中的字面字符串将解 ...
- 非对称加密技术- RSA算法数学原理分析
非对称加密技术,在现在网络中,有非常广泛应用.加密技术更是数字货币的基础. 所谓非对称,就是指该算法需要一对密钥,使用其中一个(公钥)加密,则需要用另一个(私钥)才能解密. 但是对于其原理大部分同学应 ...
- c# 小小备忘录
一.简述 备忘录,相信大家生活中都使用过,比如记笔记.手机备忘录等等,这些都是记录自己灵感时所想.定期内想做的事情,好像跑题了,说说我的备忘录吧,我的备忘录功能上也就是增删改查的操作,另加到时提醒.语 ...
- 在vi按了ctrl+s后
习惯了在windows下写程序,也习惯了按ctrl+s 保存代码,在用vi的时候,也习惯性的按ctrl+s 结果就是如同终端死掉了一样. 原来: ctrl+s 终止屏幕输出(即停止回显),你敲的依然有 ...
- linux平台搭建postfix邮件服务器
一,搭建邮件服务器前准备如下: Centos 7.2 64位Postfix-2.8.12.tar.gz Postfix MTA(邮件传输代理)Dovecot-2.1.8.tar.gz IMAP 和 P ...
- P1879 [USACO06NOV]玉米田Corn Fields
题目描述 Farmer John has purchased a lush new rectangular pasture composed of M by N (1 ≤ M ≤ 12; 1 ≤ N ...
- webapp填坑记录[更新中]
网上也有许多的 webapp 填坑记录了,这几个月,我在公司正好也做了2个,碰到了一些问题,所以我在这里记录一下我所碰到的问题: meta 头部声明在开发的时候,刚刚创建 HTML 文件,再使用浏览器 ...
- Anaconda+linux +opencv+dlib安装
准备文件Anaconda: https://www.anaconda.com/download/ 我下载的时最新的 64-Bit (x86) Installer (524 MB) 然后在下载的anac ...
- H5新增标签
<!DOCTYPE html ><html><head><meta http-equiv="Content-Type" content=& ...
- Gotorch - 多机定时任务管理系统
* { color: #3e3e3e } body { font-family: "Helvetica Neue", Helvetica, "Hiragino Sans ...