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)

相关推荐

  • 实验二 数组、指针和c++标准库

    技术实验二 数组、指针和c++标准库 实验二 数组、指针和c++标准库实验任务5
    Info.hpp#ifndef INFO_HPP
    #define INFO_hpp#includeiostream
    #i

    礼包 2021年11月1日
  • Linux字符设备控制怎么实现

    技术Linux字符设备控制怎么实现本篇内容介绍了“Linux字符设备控制怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有

    攻略 2021年11月23日
  • Hibernate主键的示例分析

    技术Hibernate主键的示例分析小编给大家分享一下Hibernate主键的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Hiber

    攻略 2021年12月8日
  • 瑜珈教程,怎样能快速掌握瑜伽的动作

    技术瑜珈教程,怎样能快速掌握瑜伽的动作要想快速的掌握瑜伽动作要从两方面入手瑜珈教程。1、了解人体。了解基础的人体结构知识,了解基础的人体运动知识。瑜伽每一个动作都是由人去完成的。所以对人体肌肉、骨骼、关节运动都要有所了解

    生活 2021年10月24日
  • 怎么在生产环境运行Elasticsearch

    技术怎么在生产环境运行Elasticsearch这篇文章主要讲解了“怎么在生产环境运行Elasticsearch”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么在生产环

    攻略 2021年11月4日
  • 互联网中做书的软件有哪些

    技术互联网中做书的软件有哪些小编给大家分享一下互联网中做书的软件有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

    攻略 2021年12月12日