2.3.1测试

1.编辑并运行2.3.1中的代码,要求在不修改t2.c 和 t1.c中main函数中的代码的情况下,程序运行结果是你的后四位学号。提交代码和运行结果截图。

我的学号后四位为1224,只需将g的值改为1221则满足题目要求。

 

 

 

 

2.网上学习objdump命令,提交不少于5篇博客链接和微信读书上的图书链接,并给出你认为最好的讲解资源的链接或图书名及章节。

https://blog.csdn.net/q2519008/article/details/82349869

https://linux265.com/course/linux-command-objdump.html

http://cxd2014.github.io/2019/12/12/objdump/(讲解较为深刻,从原理)

https://www.cnblogs.com/baiduboy/p/7061365.html

http://man.linuxde.net/objdump

.text:已编译程序的机器代码。
.rodata:只读数据,比如printf语句中的格式串和开关(switch)语句的跳转表。
.data:已初始化的全局C变量。局部C变量在运行时被保存在栈中,既不出现在.data中,也不出现在.bss节中。
.bss:未初始化的全局C变量。在目标文件中这个节不占据实际的空间,它仅仅是一个占位符。目标文件格式区分初始化和未初始化变量是为了空间效率在:在目标文件中,未初始化变量不需要占据任何实际的磁盘空间。
.symtab:一个符号表(symbol table),它存放在程序中被定义和引用的函数和全局变量的信息。一些程序员错误地认为必须通过-g选项来编译一个程序,得到符号表信息。实际上,每个可重定位目标文件在.symtab中都有一张符号表。然而,和编译器中的符号表不同,.symtab符号表不包含局部变量的表目。
.rel.text:当链接噐把这个目标文件和其他文件结合时,.text节中的许多位置都需要修改。一般而言,任何调用外部函数或者引用全局变量的指令都需要修改。另一方面调用本地函数的指令则不需要修改。注意,可执行目标文件中并不需要重定位信息,因此通常省略,除非使用者显式地指示链接器包含这些信息。
.rel.data:被模块定义或引用的任何全局变量的信息。一般而言,任何已初始化全局变量的初始值是全局变量或者外部定义函数的地址都需要被修改。
.debug:一个调试符号表,其有些表目是程序中定义的局部变量和类型定义,有些表目是程序中定义和引用的全局变量,有些是原始的C源文件。只有以-g选项调用编译驱动程序时,才会得到这张表。
.line:原始C源程序中的行号和.text节中机器指令之间的映射。只有以-g选项调用编译驱动程序时,才会得到这张表。
.strtab:一个字符串表,其内容包括.symtab和.debug节中的符号表,以及节头部中的节名字。字符串表
就是以null结尾的字符串序列。

  objdump -f

 

显示objfile中每个文件的整体头部摘要信息

objdump -h

显示目标文件各个section的头部摘要信息。

objdump -S

尽可能反汇编出源代码,尤其当编译的时候指定了-g这种调试参数时,效果比较明显。隐含了-d参数。

 生成t1的汇编代码

 

 文件t1.c反汇编

使用命令:

gcc -c -o t1.o t1.c
objdump -s -d t1.o>t1.o.txt

 

 

 按照相同的办法将t2.c反汇编得到:

 

 使用objdump -d test查看链接情况

 

 main 中callq将musum链接

posted on 2021-10-31 16:31  20191224  阅读(33)  评论(0编辑  收藏  举报

导航