基于GCC的工具objdump实现反汇编

一:objdump介绍

        在 Linux中,一切皆文件。 Linux 编程实际上是编写处理各种文件的代码。系统由许多类型的文件组成,但目标文件具有一种特殊的设计,提供了灵活和多样的用途。

        目标文件是包含带有附加地址和值的助记符号的路线图。这些符号可以用来对各种代码段和数据段进行命名,包括经过初始化的和未初始化的。它们也可以用来定位嵌入的调试信息,就像语义 Web,非常适合由程序进行阅读。

        objdump命令是Linux下的反汇编目标文件或者可执行文件的命令,它以一种可阅读的格式让你更多地了解二进制文件可能带有的附加信息。

        另外需要讲一下符号表,后面会用到。我们平时无论是在Linux上还是windows上用到的可执行程序。可执行程序的生成并不是一蹴而就而是代码经过预处理,编译,汇编和链接而成。编译只是将我们自己写的代码变成了二进制形式,它还需要和系统组件(比如标准库、动态链接库等)结合起来,这些组件都是程序运行所必须的。链接(Link)其实就是一个“打包”的过程,它将所有二进制形式的目标文件和系统组件组合成一个可执行文件。完成链接的过程也需要一个特殊的软件,叫做链接器(Linker)。经过编译链接后,代码中的各种符号都被分配了地址,并将各种信息记录在符号表中。

        符号表用来体现作用域可见性信息,符号表中语言符号可分为关键字符号操作符符号标识符符号。

符号表的作用:

  •  收集符号属性;(词法分析)
  • 上下文语义的合法性检查的依据;(语法分析)
  • 作为目标代码生成阶段地址分配的依据;(语义分析)

符号表中的标识符一般设置的属性项目有:

  • 符号名
  • 符号的类型
  • 符号的存储类别
  • 符号的作用域及可视性
  • 符号变量的存储分配信息
  • 符号的其它属性

二:objdump参数

选项详细选项描述
-a--archive-headers显示档案库的成员信息,类似 ls -l 将 lib*.a 的信息列出。
-b bfdname--target=bfdname指定目标码格式。这不是必须的,objdump 能自动识别许多格式,比如: objdump -b oasys -m vax -h fu.o 显示 fu.o 的头部摘要信息,明确指出该文件是 Vax 系统下用 Oasys 编译器生成的目标文件。objdump -i 将给出这里可以指定的目标码格式列表。
-C--demangle将底层的符号名解码成用户级名字,除了去掉所开头的下划线之外,还使得C++函数名以可理解的方式显示出来。
-g--debugging显示调试信息。企图解析保存在文件中的调试信息并以 C 语言的语法显示出来。仅仅支持某些类型的调试信息。有些其他的格式被 readelf -w 支持。
-e--debugging-tags类似 -g 选项,但是生成的信息是和 ctags 工具相兼容的格式。
-d--disassemble从 objfile 中反汇编那些特定指令机器码的 section。
-D--disassemble-all与 -d 类似,但反汇编所有 section.
--prefix-addresses反汇编的时候,显示每一行的完整地址。这是一种比较老的反汇编格式。
-EB
-EL--endian={big|little}指定目标文件的小端。这个项将影响反汇编出来的指令。在反汇编的文件没描述小端信息的时候用。例如 S-records.
-f--file-headers显示 objfile 中每个文件的整体头部摘要信息。
-h--section-headers --headers显示目标文件各个section的头部摘要信息。
-H--help简短的帮助信息。
-i--info显示对于 -b 或者 -m 选项可用的架构和目标格式列表。
-j name--section=name仅仅显示指定名称为 name 的 section 的信息
-l--line-numbers用文件名和行号标注相应的目标代码,仅仅和 -d、-D 或者 -r 一起使用使用 -ld 和使用 -d 的区别不是很大,在源码级调试的时候有用,要求编译时使用了 -g 之类的调试编译选项。
-m machine--architecture=machine指定反汇编目标文件时使用的架构,当待反汇编文件本身没描述架构信息的时候(比如 S-records),这个选项很有用。可以用 -i 选项列出这里能够指定的架构.
-r--reloc显示文件的重定位入口。如果和 -d 或者 -D 一起使用,重定位部分以反汇编后的格式显示出来。
-R--dynamic-reloc显示文件的动态重定位入口,仅仅对于动态目标文件意义,比如某些共享库。
-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一般反汇编输出将省略大块的零,该选项使得这些零块也被反汇编。
@file可以将选项集中到一个文件中,然后使用这个 @file 选项载入

 三:实践

1. 查看C程序的汇编代码和源代码

 创建一个test.c并生成可执行文件test

gcc -g test.c -o test
#include <stdio.h>int add(int a, int b)
{return a+b;
}
int sub(int a, int b)
{return a-b;
}int main()
{int a = 88;int b = 66;int sum = add(a, b);printf("a=%d, b=%d, a+b=%d\n", a, b, sum);int dif = sub(a, b);printf("a=%d, b=%d, a-b=%d\n", a, b, dif);
}
objdump -D test | less
objdump -S test | less

objdump -D命令来查看test的汇编代码。

objdump -S命令来以汇编和源代码的形式查看test的代码。

2. 查看可执行文件中函数调用的地址

可以使用以下命令来查看可执行文件中的函数调用地址:

objdump -d -j .plt test

3. 查看共享库中函数的地址

可以使用以下命令来查看共享库中函数的地址:

objdump -T /lib/libc.so.6

上述命令将显示共享库libc.so.6中所有函数的地址。

4. 查看可执行文件中的符号表

可以使用以下命令来查看可执行文件中的符号表:

objdump -t test

可以在符号表中找到sub,add的地址 

[root@localhost testEg]# objdump -t testtest:     file format elf64-x86-64SYMBOL TABLE:
0000000000400238 l    d  .interp        0000000000000000              .interp
0000000000400254 l    d  .note.ABI-tag  0000000000000000              .note.ABI-tag
0000000000400274 l    d  .note.gnu.build-id     0000000000000000              .note.gnu.build-id
0000000000400298 l    d  .gnu.hash      0000000000000000              .gnu.hash
00000000004002b8 l    d  .dynsym        0000000000000000              .dynsym
0000000000400318 l    d  .dynstr        0000000000000000              .dynstr
0000000000400358 l    d  .gnu.version   0000000000000000              .gnu.version
0000000000400360 l    d  .gnu.version_r 0000000000000000              .gnu.version_r
0000000000400380 l    d  .rela.dyn      0000000000000000              .rela.dyn
0000000000400398 l    d  .rela.plt      0000000000000000              .rela.plt
00000000004003c8 l    d  .init  0000000000000000              .init
00000000004003f0 l    d  .plt   0000000000000000              .plt
0000000000400420 l    d  .plt.got       0000000000000000              .plt.got
0000000000400430 l    d  .text  0000000000000000              .text
0000000000400634 l    d  .fini  0000000000000000              .fini
0000000000400640 l    d  .rodata        0000000000000000              .rodata
0000000000400678 l    d  .eh_frame_hdr  0000000000000000              .eh_frame_hdr
00000000004006c0 l    d  .eh_frame      0000000000000000              .eh_frame
0000000000600e10 l    d  .init_array    0000000000000000              .init_array
0000000000600e18 l    d  .fini_array    0000000000000000              .fini_array
0000000000600e20 l    d  .jcr   0000000000000000              .jcr
0000000000600e28 l    d  .dynamic       0000000000000000              .dynamic
0000000000600ff8 l    d  .got   0000000000000000              .got
0000000000601000 l    d  .got.plt       0000000000000000              .got.plt
0000000000601028 l    d  .data  0000000000000000              .data
000000000060102c l    d  .bss   0000000000000000              .bss
0000000000000000 l    d  .comment       0000000000000000              .comment
0000000000000000 l    df *ABS*  0000000000000000              crtstuff.c
0000000000600e20 l     O .jcr   0000000000000000              __JCR_LIST__
0000000000400460 l     F .text  0000000000000000              deregister_tm_clones
0000000000400490 l     F .text  0000000000000000              register_tm_clones
00000000004004d0 l     F .text  0000000000000000              __do_global_dtors_aux
000000000060102c l     O .bss   0000000000000001              completed.6355
0000000000600e18 l     O .fini_array    0000000000000000              __do_global_dtors_aux_fini_array_entry
00000000004004f0 l     F .text  0000000000000000              frame_dummy
0000000000600e10 l     O .init_array    0000000000000000              __frame_dummy_init_array_entry
0000000000000000 l    df *ABS*  0000000000000000              test.c
0000000000000000 l    df *ABS*  0000000000000000              crtstuff.c
00000000004007f0 l     O .eh_frame      0000000000000000              __FRAME_END__
0000000000600e20 l     O .jcr   0000000000000000              __JCR_END__
0000000000000000 l    df *ABS*  0000000000000000
0000000000600e18 l       .init_array    0000000000000000              __init_array_end
0000000000600e28 l     O .dynamic       0000000000000000              _DYNAMIC
0000000000600e10 l       .init_array    0000000000000000              __init_array_start
0000000000400678 l       .eh_frame_hdr  0000000000000000              __GNU_EH_FRAME_HDR
0000000000601000 l     O .got.plt       0000000000000000              _GLOBAL_OFFSET_TABLE_
0000000000400630 g     F .text  0000000000000002              __libc_csu_fini
0000000000601028  w      .data  0000000000000000              data_start
000000000040051d g     F .text  0000000000000014              add
000000000060102c g       .data  0000000000000000              _edata
0000000000400634 g     F .fini  0000000000000000              _fini
0000000000000000       F *UND*  0000000000000000              printf@@GLIBC_2.2.5
0000000000000000       F *UND*  0000000000000000              __libc_start_main@@GLIBC_2.2.5
0000000000601028 g       .data  0000000000000000              __data_start
0000000000000000  w      *UND*  0000000000000000              __gmon_start__
0000000000400648 g     O .rodata        0000000000000000              .hidden __dso_handle
0000000000400640 g     O .rodata        0000000000000004              _IO_stdin_used
00000000004005c0 g     F .text  0000000000000065              __libc_csu_init
0000000000601030 g       .bss   0000000000000000              _end
0000000000400430 g     F .text  0000000000000000              _start
000000000060102c g       .bss   0000000000000000              __bss_start
0000000000400547 g     F .text  0000000000000070              main
0000000000601030 g     O .data  0000000000000000              .hidden __TMC_END__
0000000000400531 g     F .text  0000000000000016              sub
00000000004003c8 g     F .init  0000000000000000              _init

5. 查看.o文件的信息

objdump -h test.o

紧接着可以用nm查看函数和全局变量,静态变量

[root@localhost testEg]# nm test.o
0000000000000000 T add
000000000000002a T mainU printf
0000000000000014 T sub

局部变量不会生成符号,最终是分配在栈内存中,不会在函数外部被引用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/135180.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

kubernetes集群编排(7)

目录 k8s认证授权 pod绑定sa 认证 授权 k8s认证授权 pod绑定sa [rootk8s2 ~]# kubectl create sa admin //在当前 Kubernetes 集群中创建一个名为 "admin" 的新服务账户[rootk8s2 secret]# vim pod3.yaml apiVersion: v1 kind: Pod metadata:name: mypod spec…

Paste v4.1.2(Mac剪切板)

Paste for Mac是一款运行在Mac OS平台上的剪切板小工具&#xff0c;拥有华丽的界面效果&#xff0c;剪切板每一条记录可显示&#xff08;预览&#xff09;文本&#xff0c;图片等记录的完整内容&#xff0c;可以记录最近指定条数的剪切板信息&#xff0c;方便用户随时调用&…

软件测试入门之接口测试

首先&#xff0c;什么是接口呢&#xff1f; 接口一般来说有两种&#xff0c;一种是程序内部的接口&#xff0c;一种是系统对外的接口。 系统对外的接口&#xff1a;比如你要从别的网站或服务器上获取资源或信息&#xff0c;别人肯定不会把数据库共享给你&#xff0c;他只能给你…

思维模型 首因效应

本系列文章 主要是 分享 思维模型&#xff0c;涉及各个领域&#xff0c;重在提升认知。先入为主&#xff0c;一见钟情。 1 首因效应的应用 1.1 面试中的首因效应 小李是一名应届毕业生&#xff0c;他准备参加一家知名互联网公司的面试。在面试前&#xff0c;他做了充分的准备…

NIO 笔记(一)基础内容

【笔记来自&#xff1a;it白马】 NIO基础 **注意&#xff1a;**推荐完成JavaSE篇、JavaWeb篇的学习再开启这一部分的学习&#xff0c;如果在这之前完成了JVM篇&#xff0c;那么看起来就会比较轻松了。 在JavaSE的学习中&#xff0c;我们了解了如何使用IO进行数据传输&#xf…

使用Plsql+oracle client 连接 Oracle数据库

2011年入职老东家X煤集团的时候&#xff0c;在csnd上写了一篇blog&#xff0c;题目叫“什么是ERP”&#xff0c;从此跳入DBA了这个烂坑&#xff0c;目前公司的数据库一部分是Oracle&#xff0c;另一部分是MySQL的&#xff0c;少量MSSQL&#xff0c;还需要捡起来一部分&#xff…

【JAVA学习笔记】65 - 文件类,IO流--节点流、处理流、对象流、转换流、打印流

项目代码 https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_Chapter19/src/com/yinhai 文件 一、文件&#xff0c;流 文件,对我们并不陌生&#xff0c;文件是保存数据的地方,比如大家经常使用的word文档,txt文件,excel文件..都是文件。它既可以保存一张图片…

【MongoDB】索引 - 数组字段的多键索引

数组字段创建索引时&#xff0c;MongoDB会为数组中的每个元素创建索引键&#xff08;多键索引&#xff09;&#xff0c;多键索引支持数组字段的高效查询。 一、准备工作 这里准备一些数据 db.shop.insertMany([{_id: 1, name: "水果店1", fruits: ["apple&qu…

Python测试框架之pytest快速入门

pytest是一种流行的Python测试框架&#xff0c;支持创建简单的单元测试&#xff0c;也支持创建复杂的功能和集成测试。它提供了一系列有用的功能&#xff0c;能够方便地编写&#xff0c;组织和运行测试用例&#xff0c;并生成丰富的测试报告。 pytest的主要特点包括&#xff1…

智能网联汽车有哪些信息安全场景

目录 1.车内安全通信 2.车云安全通信 3.安全启动 4.车载应用程序保护 5.入侵检测防御与日志管理系统 在聊完车载信息安全需求之后&#xff0c;势必要去看看​应用场景有哪些。根据之前的开发经验简单聊一下我知道的&#xff0c;还有很多没有讲&#xff0c;比如说车云之间具…

基于springboot+vue开发的教师工作量管理系

教师工作量管理系 springboot31 源码合集&#xff1a;www.yuque.com/mick-hanyi/javaweb 源码下载&#xff1a;博主私 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了教师工作量管理系统的开发全过程。通过…

基于Qt窗口文件新建_编辑_打开_保存_另存_剪切和复制和粘贴项目(文件操作直接套源码)

# .pro文件 QT += widgetsrequires(qtConfig(filedialog))​HEADERS = mainwindow.hSOURCES = main.cpp \ mainwindow.cppRESOURCES = sdi.qrc​# installtarget.path = $$[QT_INSTALL_EXAMPLES]/widgets/mainwindows/sdiINSTALLS += target​…

元宇宙是否为噱头?若不是,什么是元宇宙?他的概念、技术、应用和影响是什么?

文章来源&#xff1a;元宇宙的概念、技术、应用与影响——一项系统性文献综述 - 中国知网 (cnki.net) 摘要 [目的/意义]系统综述与分析当前国内外的元宇宙研究现状&#xff0c;有利于准确把握元宇宙发展方向&#xff0c;强化元宇宙基础研究&#xff0c;争取元宇宙建构权。[方法…

SpringBoot案例学习(黑马程序员day10,day11)

1 环境准备&#xff1a; 1.idea 创建spring项目&#xff0c;选择springweb,mybatis framework ,sql drive框架 2.添加pom.xml依赖&#xff1a; <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependen…

SQL SERVER Inregration Services-OLE DB、Oracle和ODBC操作

OLE DB链接器 OLE DB插件下载&#xff1a;https://learn.microsoft.com/zh-cn/sql/connect/oledb/download-oledb-driver-for-sql-server?viewsql-server-ver16 配置OLE DB Connection Manager 在点击“新建”时&#xff0c;会弹出警告信息“不支持指定的提供程序&#xff0…

【mysql】CommunicationsException: Communications link failure

CommunicationsException: Communications link failure The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. 通信异常&#xff1a;通信链路故障 最后一个成功发送到服务器的数据包是0毫秒前…

数据结构-双向链表

目录 1.带头双向循环链表&#xff1a; 2. 带头双向循环链表的实现&#xff1a; 双向链表初始化&#xff1a; 双向链表打印&#xff1a; 开辟节点函数&#xff1a; 双向链表头插&#xff1a; 双向链表尾插&#xff1a; 双向链表头删&#xff1a; 双向链表尾删&#xff…

HMM与LTP词性标注之马尔科夫模型(HMM原理剖析)

文章目录 问题描述viterbi算法联合概率与条件概率维特比算法实例 问题描述 viterbi算法 联合概率与条件概率 维特比算法实例

界面控件DevExpress WPF PDF Viewer,更快实现应用的PDF文档浏览

DevExpress WPF PDF Viewer控件可以轻松地直接在Windows应用程序中显示PDF文档&#xff0c;而无需在最终用户的机器上安装外部PDF查看器。 P.S&#xff1a;DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress…

【寒武纪(3)】媒体处理系统的系统控制、视频输入和后处理子系统

系统控制 文章目录 系统控制1、配置视频缓存池Video Pool2、配置硬件IP为在线工作&#xff08;不通过DDR数据交互&#xff09;/ 离线工作&#xff08;写入DDR&#xff09;模式3、硬IP可以使用 非Video Block &#xff08;VB&#xff09;内存4、配置是否启动内存传递的压缩 视频…