objdump

Emiter0 2011-07-13

objdump[选项]objfile...

[功能]

显示二进制文件信息

[描述](待整理)

objdump用来显示一个或者多个目标文件的信息。使用选项控制具体显示哪些信息。参数objfile...可以是静态库归档文件。

下面是一些常见的选项:

--archive-headers

-a

显示档案库的成员信息,类似ls-l将lib*.a的信息列出。

-bbfdname

--target=bfdname

指定目标码格式。这不是必须的,objdump能自动识别许多格式,比如:

objdump-boasys-mvax-hfu.o

显示fu.o的头部摘要信息,明确指出该文件是Vax系统下用Oasys编译器生成的目标文件。objdump-i将给出这里可以指定的目标码格式列表。

-C

--demangle

将底层的符号名解码成用户级名字,除了去掉所有开头的下划线之外,还使得C++函数名以可理解的方式显示出来。

--debugging

-g

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

-e

--debugging-tags

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

--disassemble

-d

从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选项可用的架构和目标格式列表。

-jname

--section=name

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

-l

--line-numbers

用文件名和行号标注相应的目标代码,仅仅和-d、-D或者-r一起使用使用-ld和使用-d的区别不是很大,在源码级调试的时候有用,要求编译时使用了-g之类的调试编译选项。

-mmachine

--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选项载入。

[举例]

首先,在给出后面大部分测试所基于的源代码以及编译指令。

源代码如下:

[root@lv-k04_libraryTest]#nlmytest.cpp

1voidprintTest()

2{

3chara;

4a='a';

5}

6voidprintTest2()

7{

8inta=2;

9a+=2;

10}

对以上源代码进行编译,如下:

[root@lv-k04_libraryTest]#g++-c-gmytest.cpp

这里,生成的文件是mytest.o,为了方便测试包含了调试的信息,对可执行文件的测试,显示的结果类似。

*查看当前使用的objdump的版本号:

[root@lv-k04_libraryTest]#objdump-V

输入之后输出如下:

GNUobjdump2.17.50.0.6-14.el520061020

Copyright2005FreeSoftwareFoundation,Inc.

Thisprogramisfreesoftware;youmayredistributeitunderthetermsof

theGNUGeneralPublicLicense.Thisprogramhasabsolutelynowarranty.

*查看档案库文件中的信息:

[root@lv-k04_libraryTest]#objdump-alibmy2.a

输入之后输出如下:

Inarchivelibmy2.a:

myfile.o:fileformatelf32-i386

rwxrwxrwx0/02724Nov1616:062009myfile.o

mytest.o:fileformatelf32-i386

rw-r--r--0/0727Jul1315:322011mytest.o

这里,libmy2.a是一个使用ar命令将多个*.o目标文件打包而生成的静态库。命令的输出类似"ar-tv",相比较"ar-tv"输出如下:

[root@lv-k04_libraryTest]#ar-tvlibmy2.a

rwxrwxrwx0/02724Nov1616:062009myfile.o

rw-r--r--0/0727Jul1315:322011mytest.o

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

[root@lv-k04_libraryTest]#objdump-i

输入之后输出如下:

BFDheaderfileversion2.17.50.0.6-14.el520061020

elf32-i386

(headerlittleendian,datalittleendian)

i386

a.out-i386-linux

(headerlittleendian,datalittleendian)

i386

efi-app-ia32

(headerlittleendian,datalittleendian)

i386

elf64-x86-64

(headerlittleendian,datalittleendian)

i386

elf64-little

(headerlittleendian,datalittleendian)

i386

elf64-big

(headerbigendian,databigendian)

i386

elf32-little

(headerlittleendian,datalittleendian)

i386

elf32-big

(headerbigendian,databigendian)

i386

srec

(headerendiannessunknown,dataendiannessunknown)

i386

symbolsrec

(headerendiannessunknown,dataendiannessunknown)

i386

tekhex

(headerendiannessunknown,dataendiannessunknown)

i386

binary

(headerendiannessunknown,dataendiannessunknown)

i386

ihex

(headerendiannessunknown,dataendiannessunknown)

i386

trad-core

(headerendiannessunknown,dataendiannessunknown)

elf32-i386a.out-i386-linuxefi-app-ia32elf64-x86-64

i386elf32-i386a.out-i386-linuxefi-app-ia32elf64-x86-64

elf64-littleelf64-bigelf32-littleelf32-bigsrecsymbolsrec

i386elf64-littleelf64-bigelf32-littleelf32-bigsrecsymbolsrec

tekhexbinaryihextrad-core

i386tekhexbinaryihex---------

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

*显示mytest.o文件中的text段的内容:

[root@lv-k04_libraryTest]#objdump--section=.text-smytest.o

输入之后输出如下:

mytest.o:fileformatelf32-i386

Contentsofsection.text:

00005589e583ec10c645ff61c9c35589e583U......E.a..U...

0010ec10c745fc020000008345fc02c9c3...E......E....

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

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

[root@lv-k04_libraryTest]#objdump-j.text-Smytest.o

输入之后输出如下:

mytest.o:fileformatelf32-i386

Disassemblyofsection.text:

00000000<_Z9printTestv>:

voidprintTest()

0:55push%ebp

1:89e5mov%esp,%ebp

3:83ec10sub$0x10,%esp

{

chara;

a='a';

6:c645ff61movb$0x61,0xffffffff(%ebp)

}

a:c9leave

b:c3ret

0000000c<_Z10printTest2v>:

voidprintTest2()

c:55push%ebp

d:89e5mov%esp,%ebp

f:83ec10sub$0x10,%esp

{

inta=2;

12:c745fc02000000movl$0x2,0xfffffffc(%ebp)

a+=2;

19:8345fc02addl$0x2,0xfffffffc(%ebp)

}

1d:c9leave

1e:c3ret

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

*反汇编出mytest.o的源代码:

[root@lv-k04_libraryTest]#objdump-Smytest.o

输入之后输出如下:

mytest.o:fileformatelf32-i386

Disassemblyofsection.text:

00000000<_Z9printTestv>:

voidprintTest()

0:55push%ebp

1:89e5mov%esp,%ebp

3:83ec10sub$0x10,%esp

{

chara;

a='a';

6:c645ff61movb$0x61,0xffffffff(%ebp)

}

a:c9leave

b:c3ret

0000000c<_Z10printTest2v>:

voidprintTest2()

c:55push%ebp

d:89e5mov%esp,%ebp

f:83ec10sub$0x10,%esp

{

inta=2;

12:c745fc02000000movl$0x2,0xfffffffc(%ebp)

a+=2;

19:8345fc02addl$0x2,0xfffffffc(%ebp)

}

1d:c9leave

1e:c3ret

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

*显示文件的符号表入口:

[root@lv-k04_libraryTest]#objdump-tmytest.o

输入之后输出如下:

mytest.o:fileformatelf32-i386

SYMBOLTABLE:

00000000ldf*ABS*00000000mytest.cpp

00000000ld.text00000000.text

00000000ld.data00000000.data

00000000ld.bss00000000.bss

00000000ld.debug_abbrev00000000.debug_abbrev

00000000ld.debug_info00000000.debug_info

00000000ld.debug_line00000000.debug_line

00000000ld.debug_frame00000000.debug_frame

00000000ld.debug_loc00000000.debug_loc

00000000ld.debug_pubnames00000000.debug_pubnames

00000000ld.debug_aranges00000000.debug_aranges

00000000ld.note.GNU-stack00000000.note.GNU-stack

00000000ld.comment00000000.comment

00000000gF.text0000000c_Z9printTestv

00000000*UND*00000000__gxx_personality_v0

0000000cgF.text00000013_Z10printTest2v

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

[root@lv-k04_libraryTest]#nm-smytest.o

0000000cT_Z10printTest2v

00000000T_Z9printTestv

U__gxx_personality_v0

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

[root@lv-k04_libraryTest]#objdump-t-Cmytest.o

输入之后输出如下:

mytest.o:fileformatelf32-i386

SYMBOLTABLE:

00000000ldf*ABS*00000000mytest.cpp

00000000ld.text00000000.text

00000000ld.data00000000.data

00000000ld.bss00000000.bss

00000000ld.debug_abbrev00000000.debug_abbrev

00000000ld.debug_info00000000.debug_info

00000000ld.debug_line00000000.debug_line

00000000ld.debug_frame00000000.debug_frame

00000000ld.debug_loc00000000.debug_loc

00000000ld.debug_pubnames00000000.debug_pubnames

00000000ld.debug_aranges00000000.debug_aranges

00000000ld.note.GNU-stack00000000.note.GNU-stack

00000000ld.comment00000000.comment

00000000gF.text0000000cprintTest()

00000000*UND*00000000__gxx_personality_v0

0000000cgF.text00000013printTest2()

这里,和没有-C相比,printTest2函数可读性增加了。

*反汇编目标文件的特定机器码段:

[root@lv-k04_libraryTest]#objdump-dmytest.o

输入之后输出如下:

mytest.o:fileformatelf32-i386

Disassemblyofsection.text:

00000000<_Z9printTestv>:

0:55push%ebp

1:89e5mov%esp,%ebp

3:83ec10sub$0x10,%esp

6:c645ff61movb$0x61,0xffffffff(%ebp)

a:c9leave

b:c3ret

0000000c<_Z10printTest2v>:

c:55push%ebp

d:89e5mov%esp,%ebp

f:83ec10sub$0x10,%esp

12:c745fc02000000movl$0x2,0xfffffffc(%ebp)

19:8345fc02addl$0x2,0xfffffffc(%ebp)

1d:c9leave

1e:c3ret

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

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

[root@lv-k04_libraryTest]#objdump-d-lmytest.o

输入之后输出如下:

mytest.o:fileformatelf32-i386

Disassemblyofsection.text:

00000000<_Z9printTestv>:

_Z9printTestv():

/root/test/04_libraryTest/mytest.cpp:1

0:55push%ebp

1:89e5mov%esp,%ebp

3:83ec10sub$0x10,%esp

/root/test/04_libraryTest/mytest.cpp:4

6:c645ff61movb$0x61,0xffffffff(%ebp)

/root/test/04_libraryTest/mytest.cpp:5

a:c9leave

b:c3ret

0000000c<_Z10printTest2v>:

_Z10printTest2v():

/root/test/04_libraryTest/mytest.cpp:6

c:55push%ebp

d:89e5mov%esp,%ebp

f:83ec10sub$0x10,%esp

/root/test/04_libraryTest/mytest.cpp:8

12:c745fc02000000movl$0x2,0xfffffffc(%ebp)

/root/test/04_libraryTest/mytest.cpp:9

19:8345fc02addl$0x2,0xfffffffc(%ebp)

/root/test/04_libraryTest/mytest.cpp:10

1d:c9leave

1e:c3ret

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

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

[root@lv-k04_libraryTest]#objdump-hmytest.o

输入之后输出如下:

mytest.o:fileformatelf32-i386

Sections:

IdxNameSizeVMALMAFileoffAlgn

0.text0000001f0000000000000000000000342**2

CONTENTS,ALLOC,LOAD,READONLY,CODE

1.data000000000000000000000000000000542**2

CONTENTS,ALLOC,LOAD,DATA

2.bss000000000000000000000000000000542**2

ALLOC

3.debug_abbrev000000460000000000000000000000542**0

CONTENTS,READONLY,DEBUGGING

4.debug_info000000ed00000000000000000000009a2**0

CONTENTS,RELOC,READONLY,DEBUGGING

5.debug_line0000003e0000000000000000000001872**0

CONTENTS,RELOC,READONLY,DEBUGGING

6.debug_frame000000440000000000000000000001c82**2

CONTENTS,RELOC,READONLY,DEBUGGING

7.debug_loc0000005800000000000000000000020c2**0

CONTENTS,READONLY,DEBUGGING

8.debug_pubnames0000002f0000000000000000000002642**0

CONTENTS,RELOC,READONLY,DEBUGGING

9.debug_aranges000000200000000000000000000002932**0

CONTENTS,RELOC,READONLY,DEBUGGING

10.comment0000002e0000000000000000000002b32**0

CONTENTS,READONLY

11.note.GNU-stack000000000000000000000000000002e12**0

CONTENTS,READONLY

这里,更多的内容参见"manobjdump"中的这个选项。

[其它]

更多的命令参见"manobjdump"

参考:

http://www.cnblogs.com/amethyst623/articles/1946499.html

http://blog.csdn.net/babylon_0049/article/details/4092978

相关推荐