深入理解计算机系统——课程作业7

深入理解计算机系统——课程作业7

简介

正准备做buflab突然发现了新的课程作业,先做简单的。

题一

题目描述

现有两段代码(分别是两个.c文件),如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
//main.c
#include <stdio.h>
int d = 100;
int x;
void p();

int main() {
x = 100;
p();
printf("d=%d\n", d);
printf("x=%d\n", x);
return 0;
}
1
2
3
4
5
6
//pl.c
double x = 0.0;

void p() {
x = 1.0;
}

请问通过分离编译、链接后,屏幕打印输出是什么(请贴图为证)?

结合链接一章所学相关知识,请分析解释为什么会有这个结果,可结合 objdump, readelf, nm 等工具辅助分析(请呈现你的分析过程)。

题解

输出结果如下

image-20210602093820902

我们想知道到底输出了什么,使用objdump查看反汇编代码,查看p和main函数的指令

image-20210602115531512

发现最后输出0x804a020地址的内容,于是我们使用gdb调试下断点在*main+24,就是输出之前的位置,然后运行调试

image-20210602123845576

我们发现0x804a020地址的内容,在运行之前是0x00000000 0x00000000,运行到断点处是0x00000000 0x3ff00000

所以最后输出的是0x00000000也就是0

分析原因:double类型是8字节的,按照%d输出四个字节的话,不会输出0x3ff0000000000000(double 1.0)而是它的后四个字节0x00000000(int 0)

题二

题目描述

现有两段代码(分别是两个.c文件),如下:

1
2
3
4
5
6
7
8
9
10
11
//main.c
#include <stdio.h>
int d = 100;
int x = 200;
void p();

int main() {
p( );
printf("d = % d, x = % d\n", d, x);
return 0;
}
1
2
3
4
5
6
//p.c
double d;

void p( ) {
d = 1.0;
}

请问通过分离编译、链接后,屏幕打印输出是什么(请贴图为证)?

结合链接一章所学相关知识,请分析解释为什么会有这个结果,可结合 objdump, readelf, nm 等工具辅助分析(请呈现你的分析过程)。

题解

输出结果如下
image-20210602130523997

image-20210602130414470

分析原因:从汇编代码中我们可以知道,函数p还是赋给d一个0x3ff0000000000000(double 1.0),调试验证确实是double 1.0,然后先输出0x804a014地址的值0x00000000(int 0),然后输出0x804a018地址的值0x3ff00000(int 1072693248)
image-20210602134224920

题三:P476 家庭作业7.12

图7-10中的行号 地址
15(bufp0) 0x080483cb 0x0804945c
16(buf[1]) 0x080483d0 0x08049458
18(bufp1) 0x080483d8 0x08049548
18(buf[1]) 0x080483dc 0x08049458
23(bufp1) 0x080483e7 0x08049548

题四:P478 家庭作业7.14

A、.text节重定位修改的指令

.text存放的是已编译程序的机器代码

第7,10,12,13,15行的指令,因为不是32位的地址,不需要重定位。

节偏移 重定位类型 符号名字
0x11 R_386_32 .rodata

B、.rodata节修改的数据

.rodata在这里存放的是switch语句的跳转表。

节偏移 重定位类型 符号名字
0x0 R_386_32 relo3
0x4 R_386_32 relo3
0x8 R_386_32 relo3
0xc R_386_32 relo3
0x10 R_386_32 relo3
0x14 R_386_32 relo3

题五:P479 家庭作业7.15

A、libc.a和libm.a的版本中包含多少目标文件?

在Ubuntu12.04.5系统下进行

先使用locate命令寻找.a文件

image-20210602083937856

image-20210602084001274

然后查看文件,发现:

image-20210612221510633

B、gcc -O2产生的可执行代码和gcc -O2 -g产生的不同?

-g选项生成的可执行目标文件多两个节

.debug:一个调试符号表。包括局部变量、全局变量以及原始的C源文件。

.line:原始C源程序中的行号和.text节中机器指令之间的映射。

C、GCC驱动程序使用的是什么共享库?

libc.so共享库

  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.
  • Copyrights © 2021 Sung
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信