objdump
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