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)

相关推荐

  • 怎么编写Prometheus配置文件prometheus.yml

    技术怎么编写Prometheus配置文件prometheus.yml小编给大家分享一下怎么编写Prometheus配置文件prometheus.yml,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!默认情

    攻略 2021年11月21日
  • qq忘记账号怎么办,忘记自己QQ号了,怎办

    技术qq忘记账号怎么办,忘记自己QQ号了,怎办忘记QQ号码是多少确实是个难题。这并不像找回密码那样有官方渠道。所以要通过一些技巧来尝试找到这个忘记的号码qq忘记账号怎么办:
    分为如下几种情况可以尝试找到账号(注:该方法只

    生活 2021年10月24日
  • vue中自定义一个全局指令(vue什么情况使用自定义指令)

    技术vue中有哪些自定义指令这篇文章主要介绍“vue中有哪些自定义指令”,在日常操作中,相信很多人在vue中有哪些自定义指令问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”vue中有哪些自定

    攻略 2021年12月16日
  • 滥竽充数的道理,滥竽充数告诉我们什么道理

    技术滥竽充数的道理,滥竽充数告诉我们什么道理滥竽充数讲的是战国时有个国军齐宣王喜欢听乐队演奏滥竽充数的道理,而且人越多合奏越觉得气派动听。根本不懂音乐的南郭先生了解了齐宣王的喜好,蒙混到合奏队伍之中,假模假式的吹的很卖力

    生活 2021年10月26日
  • jquery如何修改tr的类

    技术jquery如何修改tr的类这篇文章主要介绍“jquery如何修改tr的类”,在日常操作中,相信很多人在jquery如何修改tr的类问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”jqu

    攻略 2021年11月19日
  • 如何使用视图快速获得Flashback Query闪回查询数据

    技术如何使用视图快速获得Flashback Query闪回查询数据这篇文章主要介绍了如何使用视图快速获得Flashback Query闪回查询数据,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有

    攻略 2021年11月11日