20191315 2.3.1测试
2.3.1测试
1.编辑并运行2.3.1中的代码,要求在不修改t2.c 和 t1.c中main函数中的代码的情况下,程序运行结果是你的后四位学号。提交代码和运行结果截图。
2.网上学习objdump命令,提交不少于5篇博客链接和微信读书上的图书链接,并给出你认为最好的讲解资源的链接或图书名及章节。
3.用objdump分析第1步中的可执行文件和目标文件,提交你的分析截图以及如何和教材讲解内容对应的,比如obj文件的文件头,代码段,数据段等,可执行文件如何链接mysum的。
编辑并运行2.3.1中的代码,要求在不修改t2.c和t1.c中main函数中的代码的情况下,程序运行结果是你的后四位学号。提交代码和运行结果截图
代码
//t1.c
#include <stdio.h>
int mysum(int x, int y);
int g = 1312;
int h;
static int s;
main(int argc, char *argv[ ])
{
int a = 1;int b;
static int c = 3;
b = 2;
c = mysum(a,b) ;
printf("sum=%d\n", c) ;
}
//t2.c
extern int g;
int mysum(int x, int y)
{
return x+y+g;
}
运行结果
网上学习objdump命令,提交不少于5篇博客链接和微信读书上的图书链接,并给出你认为最好的讲解资源的链接或图书名及章节
man
objdump命令
objdump命令是Linux下的反汇编目标文件或者可执行文件的命令,它以一种可阅读的格式让你更多地了解二进制文件可能带有的附加信息。
常用参数
-f:显示文件头信息
-d:从objfile中反汇编那些特定指令机器码的section
-D:反汇编所有section
-h:显示目标文件各个section的头部摘要信息
-x:显示所有可用的头信息,包括符号表、重定位入口。-x 等价于 -a -f -h -r -t 同时指定
-i:显示对于 -b 或者 -m 选项可用的架构和目标格式列表
-j name:仅仅显示指定名称为name的section的信息,需与-s一起用
-l:用文件名和行号标注相应的目标代码,仅仅和-d、-D或者-r一起使用使用-ld和使用-d的区别不是很大,在源码级调试的时候有用,要求编译时使用了-g之类的调试编译选项
-r:显示文件的重定位入口。如果和-d或者-D一起使用,重定位部分以反汇编后的格式显示出来
-R:显示文件的动态重定位入口,仅仅对于动态目标文件有意义,比如某些共享库
-s:显示指定section的完整内容。默认所有的非空section都会被显示
-S:尽可能反汇编出源代码,尤其当编译的时候指定了-g这种调试参数时,效果比较明显。隐含了-d参数。
-t:显示文件的符号表入口。类似于nm -s提供的信息
学习链接
比较好的
用objdump分析第1步中的可执行文件和目标文件,提交你的分析截图以及如何和教材讲解内容对应的
-
-f 显示objfile中每个文件的整体头部摘要信息
-
-h 显示目标文件各个section的头部摘要信息
-
显示.o文件中的代码段数据段的内容
汇编语言为具体的机器编写程序。汇编器是将汇编代码转换为二进制形式机器代码的程序生成的.o文件称为目标代码。每个.o文件都包含
- 一个文件头,包含代码段、数据段和 BSS 段的大小。
- 一个代码段,包含机器指令。
- 一个数据段,包含初始化全局变量和初始化静态局部变量。
- 一个BSS段,包含未初始化全局变量和未初始化静态局部变量。
- 代码中的指针以及数据和BSS中的偏移量的重定位信息。
- 一个符号表,包含非静态全局变量、函数名称及其属性。
- -t 显示文件的符号表入口。
链接。一个程序可能包含多个.o文件,这些文件相互依赖。连接器将所有.o文件和必要的库函数组合成单一的二进制可执行文件。链接器执行以下操作:
- 将.o文件的所有代码段组合成单一代码段。对于C语言程序,组合代码段从默认的 C启动代码cr0.o开始,该代码调用main函数。
显示文件的符号表入口>+ 将所有数据段组合成单一数据段。组合的数据段仅包含初始化全局变量和初始化静态局部变量。- 将所有BSS段组合成单一bss段。
- 用.o文件中的重定位信息调整组合代码段中的指针以及组合数据段、bss段中的偏移量。
- 用符号表来解析各个.0 文件之间的交叉引用。比如,当编译器在t1.c中发现c mysum(a,b)时,它并不知道mysum在何处。所以,它在t1.o中留下一个空白(0)作为mysum的入口地址,但是在符号表的记录中,必须用mysum的入口地址替换空白。链接器将t1.o与t2.o合并时,它知道mysum在组合代码段中的位置。链接器只是用mysum的入口地址替换t1.o中的空白。对于其他交叉引用符号也是如此。由于静态全局变量不在符号表中,因此不能提供给链接器。从不同文件中引用静态全后变量的任何尝试都会产生交叉引用错误。同样,如果.o文件涉及任何未定义的符号或函数名称,链接器也会产生交叉引用错误。如果所有交叉引用都能够成功分辨,链接器会将产生的组合文件写为a.out,这是二进制可执行文件。