1.功能简介

objdump 命令是 GNU Binutils 二进制工具集的一员,用于查看目标文件或可执行文件的组成信息,以可读的形式打印二进制文件的内容。

2.命令格式

objdump[OPTIONS]OBJFILES

3.选项说明

-a,--archive-headers

显示档案头信息,展示档案每一个成员的文件格式。效果等同于命令 ar -tv

-b,--target=BFDNAME

指定目标码格式。这不是必须的,objdump 能自动识别许多格式,比如 objdump -b oasys -m vax -h fu.o 显示 fu.o 的头部摘要信息,明确指出该文件是 Vax 系统下用 Oasys 编译器生成的目标文件。objdump -i 将给出这里可以指定的目标码格式列表

-C,--demangle[=STYLE]

目标文件中的符号解码成用户级名称。比如移除符号修饰时在变量与函数名前添加的下划线等。

-d,--disassemble

反汇编目标文件,将机器指令反汇编成汇编代码

-D,--disassemble-all

与-d类似,但反汇编所有段(section)

-z,--disassemble-zeroes

一般反汇编输出将省略零块,该选项使得这些零块也被反汇编

-EB,-EL,--endian={big|little}

指定目标文件的字节序,在目标文件没描述字节序时很有用,例如 S-records。这个选项只影响反汇编

-f,--file-headers

显示每一个目标文件的头信息

-F,--file-offsets

反汇编时,打印每一个符号的偏移地址

--file-start-context

显示源码/汇编代码(假设为-S)时,将上下文扩展到文件的开头

-g,--debugging

显示调试信息。企图解析保存在文件中的调试信息并以 C 语言的语法显示出来。仅仅支持某些类型的调试信息。有些其他的格式被readelf -w支持

-e,--debugging-tags

类似-g选项,但是生成的信息是和ctags工具相兼容的格式

-h,--section-headers,--headers

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

-i,--info

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

-j,--section=NAME

仅显示指定名称的section的信息

-l,--line-numbers

用文件名和行号标注相应的目标代码,仅仅和-d、-D或者-r一起使用

-S,--source

反汇编时尽可能使用源代码表示。隐含了-d参数

-m,--architecture=MACHINE

指定反汇编目标文件时使用的架构,当待反汇编文件本身没描述架构信息的时候(比如S-records),这个选项很有用。可以用-i选项列出这里能够指定的架构

-M,--disassembler-options=OPTIONS

给反汇编程序传递参数,可以指定多个,使用逗号分隔

-p,--private-headers

打印目标文件格式的特定信息。打印的信息取决于目标文件格式,对于某些目标文件格式,不打印任何附加信息。

-P,--private=OPTIONS

打印目标文件格式的特定信息。OPTIONS 是一个逗号分隔的列表。例如对于XCOFF,可用的选项有 header, aout, sections, syms, relocs, lineno, loader, except, typchk, traceback and toc

-r,--reloc

显示文件的重定位入口。如果和-d或者-D一起使用,重定位部分以反汇编后的格式显示出来

-R,--dynamic-reloc

显示文件的动态重定位入口,仅仅对于动态目标文件意义,比如某些共享库

-s,--full-contents

显示section的完整内容。默认所有的非空section都会被显示

-W[lLiaprmfFsoRt],--dwarf=[rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,=frames-interp,=str,=loc,=Ranges,=pubtypes,=trace_info,=trace_abbrev,=trace_aranges,=gdb_index]

显示文件中调试段的内容,如果存在的话

-G,--stabs

显示请求的任何 section 的全部内容。显示段 .stab、.stab.index 和 .stab.excl 的内容

-t,--syms

显示文件的符号表入口。类似于nm -s提供的信息

-T,--dynamic-syms

显示文件的动态符号表入口,仅仅对动态目标文件意义,比如某些共享库。它显示的信息类似于 nm -D,--dynamic 显示的信息

-x,--all-headers

显示所可用的头信息,包括符号表、重定位入口。-x 等价于-a -f -h -p -r -t 同时指定

-w,--wide

为具有超过80列的输出设备格式化某些行。也不要在显示符号名称时截断符号名称

--start-address=ADDRESS

从指定地址开始显示数据,该选项影响-d、-r和-s选项的输出

--stop-address=ADDRESS

显示数据直到指定地址为止,该项影响-d、-r和-s选项的输出

--prefix-addresses

反汇编的时候,显示每一行的完整地址。这是一种比较老的反汇编格式

--no-show-raw-insn

反汇编时,不显示汇编指令的机器码。当使用--prefix-addresses时,这是缺省选项

--adjust-vma=OFFSET

当解析信息时,首先给所有的段添加偏移值offset。当段地址与符号表不符时,这个选项很有用。比如将段放置到特殊地址,因为某个格式无法表示段地址,比如 a.out

--special-syms

显示特殊符号与用户不关心的符号

--prefix=PREFIX

当使用-S时,指定前缀添加到绝对路径中

--prefix-strip=LEVEL

指定剥离绝对路径中多少个前缀目录名。此选项只有在使用了选项--prefix=PREFIX 才有效

--insn-width=WIDTH

指定反汇编后的指令输出的行宽,单位字节

-V,--version

版本信息

-H,--help

帮助信息

4.常用示例

首先给出后面大部分测试所基于的源代码以及编译指令。涉及两个 C++++ 源文件。

objdump.cpp:

main.cpp:

#include

usingnamespacestd;

voidprint();

intmain()

{

print();

}

使用-g选项加入调试信息,分别编译生成目标文件objdump.o与main.o。

g++-c-gobjdump.cpp-oobjdump.o

g++-c-gmain.cpp-omain.o

然后通过ar命令将两个目标文件打包成静态库libobjdump.a。

arcrvlibobjdump.amain.oobjdump.o

(1)查看档案包含的目标文件列表。

[root@TENCENT64~]#objdump-alibobjdump.a

Inarchivelibobjdump.a:

main.o:fileformatelf64-x86-64

rw-r--r--0/018696Mar820:252019main.o

objdump.o:fileformatelf64-x86-64

rw-r--r--0/021352Mar820:252019objdump.o

使用命令ar -tv也可以列出档案中包含的目标文件。

[root@TENCENT64~]#ar-tvlibobjdump.a

rw-r--r--0/018696Mar820:252019main.o

rw-r--r--0/021352Mar820:252019objdump.o

(2)显示目标文件objdump.o的代码段(.text)内容。

[root@TENCENT64~]#objdump--section=.text-sobjdump.o

objdump.o:fileformatelf64-x86-64

Contentsofsection.text:

0000554889e5be00000000bf00000000e800UH..............

0010000000be000000004889c7e800000000........H.......

00205dc3554889e54883ec10897dfc8975f8].UH..H....}..u.

0030837dfc017527817df8ffff0000751ebf.}..u'.}.....u..

004000000000e800000000ba00000000be00................

0050000000bf00000000e800000000c9c355...............U

00604889e5beffff0000bf01000000e8b0ffH...............

0070ffff5dc3..].

注意,不能单独使用-j或者–section选项,一定要加上-s选项。

(3)反汇编objdump.o中的text段内容,并尽可能用源代码形式表示。

[root@TENCENT64~]#objdump--section=.text-Sobjdump.o

objdump.o:fileformatelf64-x86-64

Disassemblyofsection.text:

0000000000000000:

#include

voidprint()

{

0:55push%rbp

1:4889e5mov%rsp,%rbp

std::cout<

9:bf00000000mov$0x0,%edi

e:e800000000callq1313:be00000000mov$0x0,%esi

18:4889c7mov%rax,%rdi

1b:e800000000callq20}

20:5dpop%rbp

21:c3retq

0000000000000022:

22:55push%rbp

23:4889e5mov%rsp,%rbp

26:4883ec10sub$0x10,%rsp

2a:897dfcmov%edi,-0x4(%rbp)

2d:8975f8mov%esi,-0x8(%rbp)

30:837dfc01cmpl$0x1,-0x4(%rbp)

34:7527jne5d36:817df8ffff0000cmpl$0xffff,-0x8(%rbp)

3d:751ejne5dexternwostreamwclog;///Linkedtostandarderror(buffered)

#endif

//@}

//Forconstructionoffilebuffersforcout,cin,cerr,cloget.al.

staticios_base::Init__ioinit;

3f:bf00000000mov$0x0,%edi

44:e800000000callq4949:ba00000000mov$0x0,%edx

4e:be00000000mov$0x0,%esi

53:bf00000000mov$0x0,%edi

58:e800000000callq5d5d:c9leaveq

5e:c3retq

000000000000005f:

5f:55push%rbp

60:4889e5mov%rsp,%rbp

63:beffff0000mov$0xffff,%esi

68:bf01000000mov$0x1,%edi

6d:e8b0ffffffcallq2272:5dpop%rbp

73:c3retq

(3)显示目标文件的符号表入口。

[root@TENCENT64~]#objdump-tobjdump.o

objdump.o:fileformatelf64-x86-64

SYMBOLTABLE:

0000000000000000ldf*ABS*0000000000000000objdump.cpp

0000000000000000ld.text0000000000000000.text

0000000000000000ld.data0000000000000000.data

0000000000000000ld.bss0000000000000000.bss

0000000000000000lO.bss0000000000000001_ZStL8__ioinit

0000000000000000ld.rodata0000000000000000.rodata

0000000000000022lF.text000000000000003d_Z41__static_initialization_and_destruction_0ii

000000000000005flF.text0000000000000015_GLOBAL__sub_I__Z5printv

0000000000000000ld.init_array0000000000000000.init_array

0000000000000000ld.debug_info0000000000000000.debug_info

0000000000000000ld.debug_abbrev0000000000000000.debug_abbrev

0000000000000000ld.debug_aranges0000000000000000.debug_aranges

0000000000000000ld.debug_line0000000000000000.debug_line

0000000000000000ld.debug_str0000000000000000.debug_str

0000000000000000ld.note.GNU-stack0000000000000000.note.GNU-stack

0000000000000000ld.eh_frame0000000000000000.eh_frame

0000000000000000ld.comment0000000000000000.comment

0000000000000000gF.text0000000000000022_Z5printv

0000000000000000*UND*0000000000000000_ZSt4cout

0000000000000000*UND*0000000000000000_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc

0000000000000000*UND*0000000000000000_ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_

0000000000000000*UND*0000000000000000_ZNSolsEPFRSoS_E

0000000000000000*UND*0000000000000000_ZNSt8ios_base4InitC1Ev

0000000000000000*UND*0000000000000000.hidden__dso_handle

0000000000000000*UND*0000000000000000_ZNSt8ios_base4InitD1Ev

0000000000000000*UND*0000000000000000__cxa_atexit

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

[root@TENCENT64~]#nm-sobjdump.o

U__cxa_atexit

U__dso_handle

000000000000005ft_GLOBAL__sub_I__Z5printv

0000000000000022t_Z41__static_initialization_and_destruction_0ii

0000000000000000T_Z5printv

U_ZNSolsEPFRSoS_E

U_ZNSt8ios_base4InitC1Ev

U_ZNSt8ios_base4InitD1Ev

U_ZSt4cout

U_ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_

0000000000000000b_ZStL8__ioinit

U_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc

(4)显示目标文件各个段的头部摘要信息。

[root@TENCENT64~]#objdump-hobjdump.o

objdump.o:fileformatelf64-x86-64

Sections:

IdxNameSizeVMALMAFileoffAlgn

0.text0000007400000000000000000000000000000000000000402**2

CONTENTS,ALLOC,LOAD,RELOC,READONLY,CODE

1.data0000000000000000000000000000000000000000000000b42**2

CONTENTS,ALLOC,LOAD,DATA

2.bss0000000100000000000000000000000000000000000000b42**2

ALLOC

3.rodata0000000800000000000000000000000000000000000000b42**0

CONTENTS,ALLOC,LOAD,READONLY,DATA

4.init_array0000000800000000000000000000000000000000000000c02**3

CONTENTS,ALLOC,LOAD,RELOC,DATA

5.debug_info000014f900000000000000000000000000000000000000c82**0

CONTENTS,RELOC,READONLY,DEBUGGING

6.debug_abbrev0000039f00000000000000000000000000000000000015c12**0

CONTENTS,READONLY,DEBUGGING

7.debug_aranges0000003000000000000000000000000000000000000019602**0

CONTENTS,RELOC,READONLY,DEBUGGING

8.debug_line0000024400000000000000000000000000000000000019902**0

CONTENTS,RELOC,READONLY,DEBUGGING

9.debug_str00000e4c0000000000000000000000000000000000001bd42**0

CONTENTS,READONLY,DEBUGGING

10.comment0000002d0000000000000000000000000000000000002a202**0

CONTENTS,READONLY

11.note.GNU-stack000000000000000000000000000000000000000000002a4d2**0

CONTENTS,READONLY

12.eh_frame000000780000000000000000000000000000000000002a502**3

CONTENTS,ALLOC,LOAD,RELOC,READONLY,DATA

参考文献

[1] objdump manual

[2] objdump命令.Linux命令大全

[3] GNU Binutils

linux 反汇编目标文件,用于查看目标文件或可执行文件的组成信息的命令:objdump命令...相关推荐

  1. Linux文件目录管理、文件内容查看以及文件内容查询命令(详细命令)

    文章目录 文件目录管理 文件内容查看 文件内容查询 文件目录管理 1.绝对路径.相对路径 绝对路径:全称,都是以 / 开头的 相对路径:根据当前目录确定 cd :切换目录命令 cd . : 当前目录 ...

  2. 查询目标服务器系统,查看目标服务器的操作系统

    查看目标服务器的操作系统 内容精选 换一换 可以.可以通过以下小实验证明云备份可以将数据恢复至任意备份点. 当服务器中的磁盘发生故障.或者由于人为误操作导致服务器数据丢失时,可以使用已经创建成功的备份 ...

  3. Linux下根据进程ID查看进程文件的路径

    1.执行命令:pwdx  PID 命令,就得到进程jar包所在的位置 2.执行命令:ll /proc/PID/cwd 命令,也能得到进程jar包所在的位置 https://blog.csdn.net/ ...

  4. 如何打开.pkl文件,查看.pkl文件里的内容(Python3.6)

     1. show_pkl.py: #show_pkl.pyimport pickle path='aus_openface.pkl' #path='/root/--/aus_openface.pkl' ...

  5. wgt文件怎么打开|wgt文件怎么查看内部文件|apk怎么查看内部文件

    1. 怎么打开 把后缀名.wgt,.apk改成.zip就能打开使用 2. 什么是wgt文件 wgt文件称为使用浏览器作为一个小型的Web应用程序部件,这些文件包含有关部件配置,图像,索引,样式表,Ja ...

  6. Linux/ubuntu深度学习,查看cuda、cudnn、显卡、驱动的版本的命令

    查看Linux/ubuntu深度学习的cuda.cudnn.显卡.驱动的版本 1.查看cudnn版本: 法一: nvcc -V 注意:V是大写的. 法二: cat /usr/local/cuda/ve ...

  7. linux怎么看网卡日志,查看网卡信息及状态和网卡日志信息

    查看网卡信息 1-mii-tool [-v/w] em1/em2/l0 em1: negotiated 100baseTx-FD, link ok product info: vendor 00:aa ...

  8. Linux中查看日志文件的正确姿势,求你别tail走天下了!

    作为一个后端开发工程师,在Linux中查看查看文件内容是基本操作了.尤其是通常要分析日志文件排查问题,那么我们应该如何正确打开日志文件呢?对于我这种小菜鸡来说,第一反应就是 cat,tail,vi(或 ...

  9. linux zcat 使用方法,使用linux的zcat命令查看压缩文件的内容

    服务器 本篇文章和大家了解一下使用linux的zcat命令查看压缩文件的内容.有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助. zcat命令用于不真正解压缩文件,就能显示压缩包中文件的 ...

最新文章

  1. C++基于TCP/IP简单的客户端、服务器通信程序实例
  2. 2017-2018-2 『网络对抗技术』Exp1:PC平台逆向破解 20165335
  3. python计算最大回撤_Python进阶量化交易场外篇3——最大回撤评价策略风险
  4. 大剑无锋之HashMap全考点
  5. c语言时间错误的是什么意思,C语言中,如何验证输入日期的正确性!~
  6. OpenJudge NOI 1.5 08:多边形内角和
  7. mysql 如何选择2行_MYSQL – 从大表中的第二行中选择数据
  8. 面向对象及软件工程——团队作业3
  9. Caffe学习1-图像识别与数据可视化
  10. protues仿真8086常见问题
  11. 路由器温度测试软件,[折腾] 夏天别热晕了!自制光猫/路由器散热支架(更新温度测试)...
  12. maxon电机/步科电机 CANOpen协议指令速度模式
  13. 扒开现象看本质:大数据应用初成气候
  14. 易语言安卓模拟器adb模块制作查看模拟器设备adb devices
  15. 【渝粤教育】电大中专Windows操作系统 (2)作业 题库
  16. 如何活跃社群,提高转化
  17. H264/AVC 视频编解码一些基本知识
  18. 2021年全球指拨开关收入大约420.8百万美元,预计2028年达到519.8百万美元
  19. 微信小程序实战须知2:详解数据API所需网络配置域名、Https、备案、SSL
  20. 软考-软件设计师 - 第2章 程序设计语言基础知识【附补充常考知识点】

热门文章

  1. 顺丰快递员私自截留口罩贩卖?官方回应来了:口罩微商搞的鬼!
  2. 三星Galaxy S20 5G版跑分曝光 骁龙865配12GB内存
  3. 7月国内手机出货量3419.9万部 5G手机果然还是很少!
  4. 支付宝上线“老年版相互宝”:爸妈终于可以加入了
  5. 拼多多回应“刷单泛滥”一事:对此零容忍 呼吁全社会共同治理
  6. 三星S10+真机上手视频流出:屏下指纹让强迫症不忍直视
  7. 构建嵌入式LINUX的NFS【ZT】
  8. 「十年老测试」测试员的职场之路
  9. TCP是如何保证数据的可靠传输的
  10. mysql设置空值显示null_mysql的空值与NULL的区别