2.3.1测试----objdump学习

技术2.3.1测试----objdump学习 2.3.1测试----objdump学习2.3.1测试
20191331 lyx
测试要求
0 推荐在OpenEuler系统中实现
1 编辑并运行2.3.1

2.3.1测试- objdump学习。

2.3.1测试

20191331 lyx

测试要求

建议在OpenEuler系统中实现0。

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

在线学习objdump命令,在微信阅读上提交不少于5个博客链接和书籍链接,给你最好的讲解资源或书籍名称和章节的链接。

使用objdump分析步骤1中的可执行文件和目标文件,提交您的分析截图以及它们与教材的对应方式,例如obj文件的头、代码段和数据段,以及可执行文件如何链接mysum。

0.实验准备

实验环境

本实验使用的是OpenEuler 20.03LTS操作系统。

1.编辑并运行

实验代码

* * * * * * * * * * * * * * * * * * t1 . c * * * * * * * * * * * * * * * * * * * *

#包含stdio.h

int g=100

int h;

静态int s;

main(int argc,char * argv[]){ 0

int a=1;int b;

静态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){ 0

返回1229 * x y g;

}

实验截图:

2.objdump学习

objdump命令是一个gcc工具,用于查看对象文件或可执行对象文件的组成。

-存档-标题

构成动植物的古名或拉丁化的现代名

根据档案的成员信息,像ls -l,lib*的信息。列出了一个。

-b bfdname

- target=bfdname

指定目标代码格式。这是没有必要的。objdump可以自动识别许多格式,例如:

objdump -b oasys -m vax -h fu.o

显示fu.o的表头汇总信息,明确指出该文件是Vax系统下Oasys编译器生成的目标文件。我将给出一个可以在这里指定的目标代码格式的列表。

-丙

-德曼格

将底部的符号名解码为用户级名称不仅消除了初始下划线,还使C函数名以可理解的方式显示。

-调试

g

显示调试信息。尝试解析存储在文件中的调试信息,并用C语言语法显示它。仅支持特定类型的调试信息。readelf -w支持其他格式.

-e

-调试-标签

类似于-g选项,但生成的信息格式与ctags工具兼容。

-拆卸

-d

从objfile中反汇编那些特定的指令机器码部分。

-丁

-全部拆解

类似于-d,但分解所有部分。

-前缀-地址

拆解时,显示每行的完整地址。这是一种旧的反汇编格式。

-EB

极小的

- endian={big|little}

指定目标文件的小结尾。该项目将影响拆卸说明。当分解的文件没有描述小端信息时使用。例如安全记录。

-f

-文件头

显示objfile中每个文件的总体标题摘要信息。

-h

-部分-标题

-标题

显示目标文件每个部分的标题摘要信息。

-H

救命

的简短帮助信息。

构成来自拉丁语、结尾为-us的名词的复数

-信息

显示-b或-m选项可用的架构和目标格式列表。

-j名字

- section=name

仅显示具有指定名称的部分的信息。

-我

行号

用文件名和行号标记对应的目标代码,只能和-d、-d或-r一起使用,使用-ld和使用-D没有太大区别,在源代码级调试时很有用。编译时需要调试和编译选项,如-g。

-m机器

-架构=机器

指定反汇编目标文件时要使用的架构。当要分解的文件本身不描述模式信息(如S记录)时,此选项很有用。您可以使用-i选项列出可以在此指定的模式。

- reloc

-r

显示文件的重定位条目。如果与-d或-D一起使用,则重新定位部分反向。

汇编后的格式显示出来。
--dynamic-reloc
-R
显示文件的动态重定位入口,仅仅对于动态目标文件意义,比如某些共享库。
-s
--full-contents
显示指定section的完整内容。默认所有的非空section都会被显示。
-S
--source
尽可能反汇编出源代码,尤其当编译的时候指定了-g这种调试参数时,效果比较明显。隐含了-d参数。
--show-raw-insn
反汇编的时候,显示每条汇编指令对应的机器码,如不指定--prefix-addresses,这将是缺省选项。
--no-show-raw-insn
反汇编时,不显示汇编指令的机器码,如不指定--prefix-addresses,这将是缺省选项。
--start-address=address
从指定地址开始显示数据,该选项影响-d、-r和-s选项的输出。
--stop-address=address
显示数据直到指定地址为止,该项影响-d、-r和-s选项的输出。
-t
--syms
显示文件的符号表入口。类似于nm -s提供的信息
-T
--dynamic-syms
显示文件的动态符号表入口,仅仅对动态目标文件意义,比如某些共享库。它显示的信息类似于 nm -D|--dynamic 显示的信息。
-V
--version
版本信息
--all-headers
-x
显示所可用的头信息,包括符号表、重定位入口。-x 等价于-a -f -h -r -t 同时指定。
-z
--disassemble-zeroes
一般反汇编输出将省略大块的零,该选项使得这些零块也被反汇编。

对目标文件.o的反汇编:

gcc -c -o main.o main.c
objdump -s -d main.o  main.o.txt

对可执行文件.exe.elf的反汇编:

gcc -o main main.c
objdump -s -d main  main.txt

我认为学习objdump最好的两篇博客:

  • Linux下C程序的反汇编【转】 https://www.cnblogs.com/sky-heaven/p/8547950.html
  • objdump反汇编代码阅读 http://cxd2014.github.io/2019/12/12/objdump/

知识补充

每个.0文件都包含:

  • 一个文件头,包含代码段、数据段和BSS段的大小
  • 一个代码段,包含机器指令
  • 一个数据段,包含初始化全局变量和初始化静态局部变量
  • 一个BSS段,包含未初始化全局变量和未初始化静态局部变量
  • 代码中的指针以及数据和BSS中的偏移量的重定位信息
  • 一个符号表,包含非静态全局变量、函数名称及其属性

可执行文件包含以下部分:

  • 文件头:文件头包含可执行文件的加载信息和大小,其中
    • tsize=代码段大小
    • dsize=包含初始化全局变量和初始化静态局部变量的数据段大小
    • bsize=包含未初始化全局变量和未初始化静态局部变量的bss段大小
    • total_size=加载的可执行文件的总大小
  • 代码段:也称为正文段,其包含程序的可执行代码。代码段从标准C启动代码zrt0.o开始,该代码调用main()函数。
  • 数据段:数据段包含初始化全局变量和初始化静态数据
  • 符号表:可选,仅位运行调试所需。

参考资料:

  • 怎么将二进制代码转换为中间代码(IR) https://www.zhihu.com/question/36734147/answer/80345324
  • 为何.o文件Objdump反汇编看不到函数名,二进制反汇编能看到 https://bbs.csdn.net/topics/392027741
  • objdump反汇编代码阅读 http://cxd2014.github.io/2019/12/12/objdump/
  • Linux下C程序的反汇编【转】 https://www.cnblogs.com/sky-heaven/p/8547950.html
  • 反汇编工具 objdump的使用简介 https://www.cnblogs.com/yygsj/p/5023789.html
  • objdump命令 https://man.linuxde.net/objdump
  • objdump命令的使用 https://blog.csdn.net/beyondioi/article/details/7796414
  • objdump(Linux)反汇编命令使用指南 https://zhuanlan.zhihu.com/p/335550245

3.使用objdump分析可执行文件和目标文件

使用objdump分析目标文件:

使用objdump分析可执行文件:

由于我在t1.c中引用了stdio.h标准库 这就导致我的可执行程序反汇编后会包含所调用的stdio.h库中的内容,使反编译文件分析难度加大。

数据段:初始化的全局变量和初始化的静态局部变量

main函数:

mysum函数引用:

显示所可用的头信息,包括符号表、重定位入口:

可执行程序和目标文件的联系:

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/61486.html

(0)

相关推荐

  • CF1167G Low Budget Inception 题解

    技术CF1167G Low Budget Inception 题解 CF1167G Low Budget Inception 题解Link.
    Codeforces
    Luogu
    Description.

    礼包 2021年10月28日
  • 龙虾怎么洗简单又干净,怎样杀小龙虾,洗小龙虾

    技术龙虾怎么洗简单又干净,怎样杀小龙虾,洗小龙虾小龙虾清洗起来很麻烦,特别是那两个大钳子很具有威慑力,让人都不知道该怎么拿捏清洗龙虾怎么洗简单又干净。 步骤如下:
    1、先盐水养半小时很多龙虾生存的水域都不太干净,而且龙

    生活 2021年10月30日
  • 恩格斯名言,有关资本主义经济制度的名人名言

    技术恩格斯名言,有关资本主义经济制度的名人名言在资本主义生产的基础上恩格斯名言,历时较长范围较广的事业,要求在较长时间内预付较大量的货币资本。所以,这一类领域里的生产取决于单个资本家拥有的货币资本的界限。这个限制被信用制

    生活 2021年10月25日
  • 【转载】EXCEL VBA 自定义排序的三种方法

    技术【转载】EXCEL VBA 自定义排序的三种方法 【转载】EXCEL VBA 自定义排序的三种方法何谓自定义排序,就是按指定的顺序对数据源进行排序呗。共分享了三种方法:
    第1种方法是系统自带的Ord

    礼包 2021年11月13日
  • 三戒是哪三戒,柳宗元的\”三戒\”是什么?

    技术三戒是哪三戒,柳宗元的\三戒\是什么?柳宗元的《三戒》包括《临江之麋》三戒是哪三戒、《永某氏之鼠》和 《黔之驴》 这一组三篇寓言,是作者贬谪永州时所写。题名“三戒”,可能是取《论语》“君子有三戒”之意。文前的小序,已

    生活 2021年10月22日
  • 怎样用Mysql show processlist 排查问题

    技术怎样用Mysql show processlist 排查问题怎样用Mysql show processlist 排查问题,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可

    攻略 2021年10月25日