00. 目录

文章目录

  • 00. 目录
  • 01. 命令概述
  • 02. 命令格式
  • 03. 常用选项
  • 04. 参考示例
  • 05. 附录

01. 命令概述

objdump命令是用查看目标文件或者可执行的目标文件的构成的gcc工具。

objdump有点像快速查看之类的工具,就是以一种可阅读的格式让你更多地了解二进制文件可能带有的附加信息。

02. 命令格式

用法:objdump <选项> <文件>

03. 常用选项


-l
--line-numbers
用文件名和行号标注相应的目标代码,仅仅和-d、-D或者-r一起使用使用-ld和使用-d的区别不是很大,在源码级调试的时候有用,要求编译时使用了-g之类的调试编译选项。 -m machine
--architecture=machine
指定反汇编目标文件时使用的架构,当待反汇编文件本身没描述架构信息的时候(比如S-records),这个选项很有用。可以用-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
一般反汇编输出将省略大块的零,该选项使得这些零块也被反汇编。 @file 可以将选项集中到一个文件中,然后使用这个@file选项载入。

04. 参考示例

4.1 查看当前使用的objdump的版本号

[deng@localhost 5share_lib]$ objdump -V
GNU objdump version 2.27-27.base.el7
Copyright (C) 2016 Free Software Foundation, Inc.
这个程序是自由软件;您可以遵循 GNU 通用公共授权版本 3 或
(您自行选择的) 稍后版本再发布它。
这个程序不含任何担保。
[deng@localhost 5share_lib]$

4.2 查看档案库文件中的信息

[deng@localhost 3static_lib]$ objdump -a libtest.a
在归档文件 libtest.a 中:add.o:     文件格式 elf64-x86-64
rw-r--r-- 0/0   1232 Jan  1 08:00 1970 add.osub.o:     文件格式 elf64-x86-64
rw-r--r-- 0/0   1224 Jan  1 08:00 1970 sub.omul.o:     文件格式 elf64-x86-64
rw-r--r-- 0/0   1224 Jan  1 08:00 1970 mul.o[deng@localhost 3static_lib]$
[deng@localhost 3static_lib]$ ar -tv libtest.a
rw-r--r-- 0/0   1232 Jan  1 08:00 1970 add.o
rw-r--r-- 0/0   1224 Jan  1 08:00 1970 sub.o
rw-r--r-- 0/0   1224 Jan  1 08:00 1970 mul.o
[deng@localhost 3static_lib]$ 

4.3 显示可用的架构和目标结构列表

[deng@localhost 3static_lib]$ objdump -i
BFD 头文件版本 version 2.27-27.base.el7
elf64-x86-64(header 小端序, data 小端序)i386
elf32-i386(header 小端序, data 小端序)i386
elf32-iamcu(header 小端序, data 小端序)iamcu
elf32-x86-64(header 小端序, data 小端序)i386
a.out-i386-linux(header 小端序, data 小端序)i386
pei-i386(header 小端序, data 小端序)i386
pei-x86-64(header 小端序, data 小端序)i386
elf64-l1om(header 小端序, data 小端序)l1om
elf64-k1om(header 小端序, data 小端序)k1om
elf64-little(header 小端序, data 小端序)i386l1omk1omiamcuplugin
elf64-big(header 大端序, data 大端序)i386l1omk1omiamcuplugin
elf32-little(header 小端序, data 小端序)i386l1omk1omiamcuplugin
elf32-big(header 大端序, data 大端序)i386l1omk1omiamcuplugin
plugin(header 小端序, data 小端序)
srec(header 未知的端序, data 未知的端序)i386l1omk1omiamcuplugin
symbolsrec(header 未知的端序, data 未知的端序)i386l1omk1omiamcuplugin
verilog(header 未知的端序, data 未知的端序)i386l1omk1omiamcuplugin
tekhex(header 未知的端序, data 未知的端序)i386l1omk1omiamcuplugin
binary(header 未知的端序, data 未知的端序)i386l1omk1omiamcuplugin
ihex(header 未知的端序, data 未知的端序)i386l1omk1omiamcupluginelf64-x86-64 elf32-i386 elf32-iamcu elf32-x86-64 i386 elf64-x86-64 elf32-i386 ----------- elf32-x86-64 l1om ------------ ---------- ----------- ------------ k1om ------------ ---------- ----------- ------------ iamcu ------------ ---------- elf32-iamcu ------------ plugin ------------ ---------- ----------- ------------ a.out-i386-linux pei-i386 pei-x86-64 elf64-l1om elf64-k1om i386 a.out-i386-linux pei-i386 pei-x86-64 ---------- ---------- l1om ---------------- -------- ---------- elf64-l1om ---------- k1om ---------------- -------- ---------- ---------- elf64-k1om iamcu ---------------- -------- ---------- ---------- ---------- plugin ---------------- -------- ---------- ---------- ---------- elf64-little elf64-big elf32-little elf32-big plugin srec i386 elf64-little elf64-big elf32-little elf32-big ------ srec l1om elf64-little elf64-big elf32-little elf32-big ------ srec k1om elf64-little elf64-big elf32-little elf32-big ------ srec iamcu elf64-little elf64-big elf32-little elf32-big ------ srec plugin elf64-little elf64-big elf32-little elf32-big ------ srec symbolsrec verilog tekhex binary ihex i386 symbolsrec verilog tekhex binary ihex l1om symbolsrec verilog tekhex binary ihex k1om symbolsrec verilog tekhex binary ihex iamcu symbolsrec verilog tekhex binary ihex plugin symbolsrec verilog tekhex binary ihex
[deng@localhost 3static_lib]$

这里,显示的信息是相对于 -b 或者 -m 选项可用的架构和目标格式列表。

4.4 示test.o文件中的text段的内容

[deng@localhost 1gcc]$ objdump --section=.text -s test.otest.o:     文件格式 elf64-x86-64Contents of section .text:0000 554889e5 bf000000 00e80000 0000b800  UH..............0010 0000005d c3                          ...].
[deng@localhost 1gcc]$

这里注意,不能单独使用-j或者–section,例如objdump --section=.text mytest.o是不会运行成功的。

4.5 反汇编test.o中的text段内容,并尽可能用源代码形式表示

[deng@localhost 1gcc]$ objdump -j .text -S test.otest.o:     文件格式 elf64-x86-64Disassembly of section .text:0000000000000000 <main>:0:   55                      push   %rbp1:   48 89 e5                mov    %rsp,%rbp4:   bf 00 00 00 00          mov    $0x0,%edi9:   e8 00 00 00 00          callq  e <main+0xe>e:   b8 00 00 00 00          mov    $0x0,%eax13:   5d                      pop    %rbp14:   c3                      retq
[deng@localhost 1gcc]$

这里注意,不能单独使用-j或者–section,例如objdump -j .text test.o是不会运行成功的。另外-S命令对于包含调试信息的目标文件,显示的效果比较好,如果编译时没有指定g++的-g选项,那么目标文件就不包含调试信息,那么显示效果就差多了。

4.6 反汇编出test.o的源代码

[deng@localhost 1gcc]$ objdump -S test.otest.o:     文件格式 elf64-x86-64Disassembly of section .text:0000000000000000 <main>:0:   55                      push   %rbp1:   48 89 e5                mov    %rsp,%rbp4:   bf 00 00 00 00          mov    $0x0,%edi9:   e8 00 00 00 00          callq  e <main+0xe>e:   b8 00 00 00 00          mov    $0x0,%eax13:   5d                      pop    %rbp14:   c3                      retq
[deng@localhost 1gcc]$

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

4.7 显示文件的符号表入口

[deng@localhost 1gcc]$ objdump -t test.otest.o:     文件格式 elf64-x86-64SYMBOL TABLE:
0000000000000000 l    df *ABS*  0000000000000000 test.c
0000000000000000 l    d  .text  0000000000000000 .text
0000000000000000 l    d  .data  0000000000000000 .data
0000000000000000 l    d  .bss   0000000000000000 .bss
0000000000000000 l    d  .rodata        0000000000000000 .rodata
0000000000000000 l    d  .note.GNU-stack        0000000000000000 .note.GNU-stack
0000000000000000 l    d  .eh_frame      0000000000000000 .eh_frame
0000000000000000 l    d  .comment       0000000000000000 .comment
0000000000000000 g     F .text  0000000000000015 main
0000000000000000         *UND*  0000000000000000 puts[deng@localhost 1gcc]$

输出的信息类似nm -s命令的输出,相比较之下,nm命令的输出如下:

[deng@localhost 1gcc]$ nm -s test.o
0000000000000000 T mainU puts
[deng@localhost 1gcc]$ 

4.8 显示文件的符号表入口,将底层符号解码并表示成用户级别

[deng@localhost 1gcc]$ objdump -t -C test.otest.o:     文件格式 elf64-x86-64SYMBOL TABLE:
0000000000000000 l    df *ABS*  0000000000000000 test.c
0000000000000000 l    d  .text  0000000000000000 .text
0000000000000000 l    d  .data  0000000000000000 .data
0000000000000000 l    d  .bss   0000000000000000 .bss
0000000000000000 l    d  .rodata        0000000000000000 .rodata
0000000000000000 l    d  .note.GNU-stack        0000000000000000 .note.GNU-stack
0000000000000000 l    d  .eh_frame      0000000000000000 .eh_frame
0000000000000000 l    d  .comment       0000000000000000 .comment
0000000000000000 g     F .text  0000000000000015 main
0000000000000000         *UND*  0000000000000000 puts[deng@localhost 1gcc]$

4.9 反汇编目标文件

[deng@localhost 1gcc]$ objdump -d test.otest.o:     文件格式 elf64-x86-64Disassembly of section .text:0000000000000000 <main>:0:   55                      push   %rbp1:   48 89 e5                mov    %rsp,%rbp4:   bf 00 00 00 00          mov    $0x0,%edi9:   e8 00 00 00 00          callq  e <main+0xe>e:   b8 00 00 00 00          mov    $0x0,%eax13:   5d                      pop    %rbp14:   c3                      retq
[deng@localhost 1gcc]$

对text段的内容进行了反汇编。

4.10 反汇编特定段,并将汇编代码对应的文件名称和行号对应上

[deng@localhost 1gcc]$ objdump -d -l test.otest.o:     文件格式 elf64-x86-64Disassembly of section .text:0000000000000000 <main>:
main():0:   55                      push   %rbp1:   48 89 e5                mov    %rsp,%rbp4:   bf 00 00 00 00          mov    $0x0,%edi9:   e8 00 00 00 00          callq  e <main+0xe>e:   b8 00 00 00 00          mov    $0x0,%eax13:   5d                      pop    %rbp14:   c3                      retq
[deng@localhost 1gcc]$ 

这里,项"-d"从objfile中反汇编那些特定指令机器码的section,而使用"-l"指定用文件名和行号标注相应的目标代码,仅仅和-d、-D或者-r一起使用,使用-ld和使用-d的区别不是很大,在源码级调试的时候有用,要求编译时使用了-g之类的调试编译选项。

4.11 显示目标文件各个段的头部摘要信息

[deng@localhost 1gcc]$ objdump -h test.o test.o:     文件格式 elf64-x86-64节:
Idx Name          Size      VMA               LMA               File off  Algn0 .text         00000015  0000000000000000  0000000000000000  00000040  2**0CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE1 .data         00000000  0000000000000000  0000000000000000  00000055  2**0CONTENTS, ALLOC, LOAD, DATA2 .bss          00000000  0000000000000000  0000000000000000  00000055  2**0ALLOC3 .rodata       0000000d  0000000000000000  0000000000000000  00000055  2**0CONTENTS, ALLOC, LOAD, READONLY, DATA4 .comment      0000002e  0000000000000000  0000000000000000  00000062  2**0CONTENTS, READONLY5 .note.GNU-stack 00000000  0000000000000000  0000000000000000  00000090  2**0CONTENTS, READONLY6 .eh_frame     00000038  0000000000000000  0000000000000000  00000090  2**3CONTENTS, ALLOC, LOAD, RELOC, READONLY, DATA
[deng@localhost 1gcc]$ 

4.12 反汇编所有

[deng@localhost 1gcc]$ objdump -D test.o test.o:     文件格式 elf64-x86-64Disassembly of section .text:0000000000000000 <main>:0:   55                      push   %rbp1:   48 89 e5                mov    %rsp,%rbp4:   bf 00 00 00 00          mov    $0x0,%edi9:   e8 00 00 00 00          callq  e <main+0xe>e:   b8 00 00 00 00          mov    $0x0,%eax13:   5d                      pop    %rbp14:   c3                      retq   Disassembly of section .rodata:0000000000000000 <.rodata>:0:   68 65 6c 6c 6f          pushq  $0x6f6c6c655:   20 69 74                and    %ch,0x74(%rcx)8:   63 61 73                movslq 0x73(%rcx),%espb:   74 00                   je     d <main+0xd>Disassembly of section .comment:0000000000000000 <.comment>:0:   00 47 43                add    %al,0x43(%rdi)3:   43 3a 20                rex.XB cmp (%r8),%spl6:   28 47 4e                sub    %al,0x4e(%rdi)9:   55                      push   %rbpa:   29 20                   sub    %esp,(%rax)c:   34 2e                   xor    $0x2e,%ale:   38 2e                   cmp    %ch,(%rsi)10:   35 20 32 30 31          xor    $0x31303220,%eax15:   35 30 36 32 33          xor    $0x33323630,%eax1a:   20 28                   and    %ch,(%rax)1c:   52                      push   %rdx1d:   65 64 20 48 61          gs and %cl,%fs:0x61(%rax)22:   74 20                   je     44 <main+0x44>24:   34 2e                   xor    $0x2e,%al26:   38 2e                   cmp    %ch,(%rsi)28:   35 2d 32 38 29          xor    $0x2938322d,%eax...Disassembly of section .eh_frame:0000000000000000 <.eh_frame>:0:   14 00                   adc    $0x0,%al2:   00 00                   add    %al,(%rax)4:   00 00                   add    %al,(%rax)6:   00 00                   add    %al,(%rax)8:   01 7a 52                add    %edi,0x52(%rdx)b:   00 01                   add    %al,(%rcx)d:   78 10                   js     1f <.eh_frame+0x1f>f:   01 1b                   add    %ebx,(%rbx)11:   0c 07                   or     $0x7,%al13:   08 90 01 00 00 1c       or     %dl,0x1c000001(%rax)19:   00 00                   add    %al,(%rax)1b:   00 1c 00                add    %bl,(%rax,%rax,1)1e:   00 00                   add    %al,(%rax)20:   00 00                   add    %al,(%rax)22:   00 00                   add    %al,(%rax)24:   15 00 00 00 00          adc    $0x0,%eax29:   41 0e                   rex.B (bad) 2b:   10 86 02 43 0d 06       adc    %al,0x60d4302(%rsi)31:   50                      push   %rax32:   0c 07                   or     $0x7,%al34:   08 00                   or     %al,(%rax)...
[deng@localhost 1gcc]$

05. 附录

参考:【Linux】一步一步学Linux系列教程汇总

【Linux】一步一步学Linux——objdump命令(254)相关推荐

  1. 学linux作用,linux有必要学吗?学linux有什么作用,学linux能干什么

    Linux是一种自由和开放源码的类UNIX操作系统.Linux有必要学吗?学Linux有什么作用,学Linux能干什么?Linux最大的作用就是提高效率.当你习惯在Linux命令行下工作,再回到win ...

  2. LINUX学习之路(学LINUX必看)

    很多同学接触Linux不多,对Linux平台的开发更是一无所知.而现在的趋势越来越表明,作为一 个优秀的软件开发人员,或计算机IT行业从业人员,掌握Linux是一种很重要的谋生资源与手段.下来我将会结 ...

  3. linux学习需要什么基础,学linux需要什么基础?

    近几年来,随着计算机网络的发展,越来越多的人学习 linux.对于想要从事运维工作或者从事智能开发方面的同学来说,学习 linux 是必要的.linux 的学习并不简单,那么这篇文章 w3cschoo ...

  4. 分享--linux 学习之路(学linux必看)

    很多同学接触Linux不多,对Linux平台的开发更是一无所知. 而现在的趋势越来越表明,作为一个优秀的软件开发人员,或计算机IT行业从业人员, 掌握Linux是一种很重要的谋生资源与手段. 下来我将 ...

  5. 英语不好学linux运维难吗,学Linux系统难吗?学好Linux运维需要多久

    随着近年来经济的快速发展,企业对Linux人才的需求也越来越高.许多人认为,Linux是一个非常简单的行业,然而,Linux行业是一个综合了云计算.Linux运维.Linux开发.Linux编程等多方 ...

  6. 不会linux的php难找工作,学linux系统难吗

    这是 Linux初学者经常会问的问题,其实Linux和Windows一样都属于操作系统,对于大部分人来说,对Windows操作系统十分熟悉,而对Linux操作系统没有使用过,所以觉得很难,其实,只要熟 ...

  7. linux lamp实验报告,新手学Linux--构建lamp

    本人前不久开始学习Linux,俗话说得好,好记性不如烂笔头,于是决定将平日所学所做实验,记录下来,以备回顾.由于本人是个初学者,所以借鉴了很多网上的资料,但在此处写出来的都是经过本人思考和多次实验的记 ...

  8. Linux其实没那么难学

    互联网技术总是更新迭代的,因为2020年的一场疫情,影响着中国乃至整个世界,就在这一年,网络直播,远程办公,在线教育等等的互联网产物进入了众多人的世界,当然,这其中离不开程序员的功劳. 李开复曾经说过 ...

  9. 大学生为什么要学Linux?Linux有什么优点?

    前言 Linux是一种自由和开放源码的类UNIX操作系统.Linux有必要学吗?学Linux有什么作用,学Linux能干什么?Linux最大的作用就是提高效率.当你习惯在Linux命令行下工作,再回到 ...

最新文章

  1. Java多线程可以分组,还能这样玩!
  2. tag+标签+php,ZBLOG PHP代码实现侧栏彩色标签TAG关键字样式方法
  3. 配置DispatcherServlet
  4. Photoshop显示RGB值问题
  5. Oracle RAC更改VIP IP地址_2节点的实验
  6. (转)详解JS位置、宽高属性之一:offset系列
  7. 监控某个dll被修改_浅谈动力环境监控系统技术标准
  8. java nio oio_(三:NIO系列) Java NIO Channel
  9. EPM连接显示服务器不可用,EPM问题汇总之-SmartView没法链接Essbase
  10. IE8卸载再回到IE6
  11. 【工具使用篇】Visual Studio KeyMap
  12. 玩转pandas取数_下
  13. php implode explode,[PHP源码阅读]explode和implode函数
  14. 解决浏览器被好123劫持主页的问题。
  15. Alibaba Cloud 3 (Soaring Falcon) x86_64(Py3.7.8) 系统 YUM源
  16. new(创建)一个对象时都发生了什么?
  17. java数字时钟_Java实现动态数字时钟
  18. 赛博朋克版特效shader
  19. web开发学习过程,一个合格的初级前端工程师需要掌握的模块笔记
  20. 使用Vue+vue-router+路由守卫实现路由鉴权功能实战

热门文章

  1. 基于SOA的体系架构设计
  2. 未定义标识符 stringc/c++(20)_Python 标识符命名规则
  3. C语言学习之输出10个整数中的最大值及其下标、最小值及其下标
  4. pg多线程更新会发生死锁_何时用多线程?多线程需要加锁吗?线程数多少最合理?...
  5. S2SH框架入门之使用struts2
  6. Google2012.9.24校园招聘会笔试题
  7. 网站如何从http升级成https
  8. 学习windows编程 day6 之模拟记事本
  9. 1.常用字符对象方法
  10. Writing for Myself.part2