**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的更多相关文章

  1. 深入理解计算机系统_3e 第六章家庭作业 CS:APP3e chapter 6 homework

    6.22 假设磁道沿半径均匀分布,即总磁道数和(1-x)r成正比,设磁道数为(1-x)rk: 由题单个磁道的位数和周长成正比,即和半径xr成正比,设单个磁道的位数为xrz: 其中r.k.z均为常数. ...

  2. 深入理解计算机系统_3e 第五章家庭作业 CS:APP3e chapter 5 homework

    5.13 A. B. 由浮点数加法的延迟,CPE的下界应该是3. C. 由整数加法的延迟,CPE的下界应该是1. D. 由A中的数据流图,虽然浮点数乘法需要5个周期,但是它没有"数据依赖&q ...

  3. 深入理解计算机系统_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 = ~ ...

  4. 深入理解计算机系统_3e 第十一章家庭作业 CS:APP3e chapter 11 homework

    注:tiny.c csapp.c csapp.h等示例代码均可在Code Examples获取 11.6 A. 书上写的示例代码已经完成了大部分工作:doit函数中的printf("%s&q ...

  5. 深入理解计算机系统_3e 第九章家庭作业 CS:APP3e chapter 9 homework

    9.11 A. 00001001 111100 B. +----------------------------+ | Parameter Value | +--------------------- ...

  6. 深入理解计算机系统_3e 第二章家庭作业 CS:APP3e chapter 2 homework

    初始完成日期:2017.9.26 许可:除2.55对应代码外(如需使用请联系 randy.bryant@cs.cmu.edu),任何人可以自由的使用,修改,分发本文档的代码. 本机环境: (有一些需要 ...

  7. 深入理解计算机系统_3e 第四章家庭作业(部分) CS:APP3e chapter 4 homework

    4.52以后的题目中的代码大多是书上的,如需使用请联系 randy.bryant@cs.cmu.edu 更新:关于编译Y86-64中遇到的问题,可以参考一下CS:APP3e 深入理解计算机系统_3e ...

  8. 深入理解计算机系统_3e 第八章家庭作业 CS:APP3e chapter 8 homework

    8.9 关于并行的定义我之前写过一篇文章,参考: 并发与并行的区别 The differences between Concurrency and Parallel +---------------- ...

  9. 深入理解计算机系统_3e 第十章家庭作业 CS:APP3e chapter 10 homework

    10.6 1.若成功打开"foo.txt": -->1.1若成功打开"baz.txt": 输出"4\n" -->1.2若未能成功 ...

随机推荐

  1. nginx的5个特点

    nginx的5个特点(2017/11/16 白杨整理) 1.动静分离 Nginx是一种轻量级,高性能,多进程的Web服务器,非常适合作为静态资源的服务器使用,而动态的访问操作可以使用稳定的Apache ...

  2. EF错误

    The model backing the 'XXXXDBContext' context has changed since the database was created. Either man ...

  3. Dubbo源码学习--环境搭建及基础准备(ServiceLoader、ExtensionLoader)

    环境搭建 Github上下载Dubbo最新发布版本,楼主下载版本为2.5.7. cd到源码解压目录,maven编译,命令为: mvn clean install -Dmaven.test.skip 生 ...

  4. 从编辑距离、BK树到文本纠错

    搜索引擎里有一个很重要的话题,就是文本纠错,主要有两种做法,一是从词典纠错,一是分析用户搜索日志,今天我们探讨使用基于词典的方式纠错,核心思想就是基于编辑距离,使用BK树.下面我们来逐一探讨: 编辑距 ...

  5. iOS开发经验总结

    总结了几个月的东西终于能和大家分享了,不多说,直接看东西! 1.禁止手机睡眠 1 [UIApplication sharedApplication].idleTimerDisabled = YES; ...

  6. 5分钟搞定iOS抓包Charles,让数据一清二楚

    Charles安装 HTTP抓包 HTTPS抓包   1. Charles安装 官网下载安装Charles:https://www.charlesproxy.com/download/ 2. HTTP ...

  7. CathyCMS-后台管理v1.0

    摘要: 最近开发CathyCMS系统作为练手项目,后台管理部分v1.0暂时告一段落.目前只包含了基本的登录.权限管理.频道管理.文章管理功能. 项目地址: https://github.com/cat ...

  8. Process Doppelgänging

    Process Doppelgänging -- 新的代码注入技术,通杀windows系统的所有版本,并且能绕过绝大多数的安全软件. 介绍 今天(2017-12-07),在伦敦举行的2017年黑帽欧洲 ...

  9. linux端口开放指定端口的两种方法

    重要的事情说三遍,强烈建议使用第二种方法!第二种方法!第二!; 开放端口的方法: 方法一:命令行方式                1. 开放端口命令: /sbin/iptables -I INPUT ...

  10. 360提供的php防注入代码

    <?php //Code By Safe3 function customError($errno, $errstr, $errfile, $errline) { echo "< ...