|
|
|
|
# objdump
|
|
|
|
|
|
|
|
|
|
## 说明
|
|
|
|
|
|
|
|
|
|
**objdump命令** 是用查看目标文件或者可执行的目标文件的构成的gcc工具。显示二进制文件信息
|
|
|
|
|
|
|
|
|
|
## 选项
|
|
|
|
|
|
|
|
|
|
```markdown
|
|
|
|
|
--archive-headers
|
|
|
|
|
-a
|
|
|
|
|
显示档案库的成员信息,类似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++函数名以可理解的方式显示出来。
|
|
|
|
|
|
|
|
|
|
--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 选项可用的架构和目标格式列表。
|
|
|
|
|
|
|
|
|
|
-j name
|
|
|
|
|
--section=name
|
|
|
|
|
仅仅显示指定名称为name的section的信息
|
|
|
|
|
|
|
|
|
|
-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选项载入。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
用法:objdump <选项> <文件>
|
|
|
|
|
显示来自目标 <文件> 的信息。至少必须给出以下选项之一:
|
|
|
|
|
-a, --archive-headers Display archive header information
|
|
|
|
|
-f, --file-headers Display the contents of the overall file header
|
|
|
|
|
-p, --private-headers Display object format specific file header contents
|
|
|
|
|
-P, --private=OPT,OPT... Display object format specific contents
|
|
|
|
|
-h, --[section-]headers Display the contents of the section headers
|
|
|
|
|
-x, --all-headers Display the contents of all headers
|
|
|
|
|
-d, --disassemble Display assembler contents of executable sections
|
|
|
|
|
-D, --disassemble-all Display assembler contents of all sections
|
|
|
|
|
-S, --source Intermix source code with disassembly
|
|
|
|
|
-s, --full-contents Display the full contents of all sections requested
|
|
|
|
|
-g, --debugging Display debug information in object file
|
|
|
|
|
-e, --debugging-tags Display debug information using ctags style
|
|
|
|
|
-G, --stabs Display (in raw form) any STABS info in the file
|
|
|
|
|
-W[lLiaprmfFsoRt] or
|
|
|
|
|
--dwarf[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,
|
|
|
|
|
=frames-interp,=str,=loc,=Ranges,=pubtypes,
|
|
|
|
|
=gdb_index,=trace_info,=trace_abbrev,=trace_aranges,
|
|
|
|
|
=addr,=cu_index]
|
|
|
|
|
Display DWARF info in the file
|
|
|
|
|
-t, --syms Display the contents of the symbol table(s)
|
|
|
|
|
-T, --dynamic-syms Display the contents of the dynamic symbol table
|
|
|
|
|
-r, --reloc Display the relocation entries in the file
|
|
|
|
|
-R, --dynamic-reloc Display the dynamic relocation entries in the file
|
|
|
|
|
@<file> Read options from <file>
|
|
|
|
|
-v, --version Display this program's version number
|
|
|
|
|
-i, --info List object formats and architectures supported
|
|
|
|
|
-H, --help Display this information
|
|
|
|
|
|
|
|
|
|
以下选项是可选的:
|
|
|
|
|
-b, --target=BFDNAME 将标的目标文件格式指定为 BFDNAME
|
|
|
|
|
-m, --architecture=MACHINE 将标的体系结构指定为 MACHINE
|
|
|
|
|
-j, --section=NAME 只显示 NAME 节的信息
|
|
|
|
|
-M, --disassembler-options=OPT 将文本传递到 OPT 反汇编程序
|
|
|
|
|
-EB --endian=big 反汇编时假定高位字节在前
|
|
|
|
|
-EL --endian=little 反汇编时假定低位字节在前
|
|
|
|
|
--file-start-context 从文件的起点引入上下文 (带有 -S)
|
|
|
|
|
-l, --line-numbers 在输出中给出行号和文件名
|
|
|
|
|
-C, --demangle[=STYLE] 对修饰过的 (mangled) 符号名进行解码
|
|
|
|
|
如果给出了 STYLE,STYLE 可能为“auto”、“gnu”、
|
|
|
|
|
“lucid”、“arm”、“hp”、“edg”或“gnu-new-abi”
|
|
|
|
|
-w, --wide 以多于 80 列的宽度对输出进行格式化
|
|
|
|
|
-z, --disassemble-zeroes 反汇编时不要跳过为零的块
|
|
|
|
|
--start-address=ADDR 只有进程数据的地址 >= ADDR
|
|
|
|
|
--stop-address=ADDR 只有进程数据的地址 <= ADDR
|
|
|
|
|
--prefix-addresses 同反汇编代码并列显示完整的地址
|
|
|
|
|
--[no-]show-raw-insn 同符号反汇编并列显示十六进制值
|
|
|
|
|
--adjust-vma=OFFSET 为所有显示的节地址增加 OFFSET
|
|
|
|
|
|
|
|
|
|
--dwarf-depth=N Do not display DIEs at depth N or greater
|
|
|
|
|
--dwarf-start=N Display DIEs starting with N, at the same depth
|
|
|
|
|
or deeper
|
|
|
|
|
--dwarf-check Make additional dwarf internal consistency checks.
|
|
|
|
|
|
|
|
|
|
objdump:支持的目标: elf64-x86-64 elf32-i386 elf32-iamcu elf32-x86-64 a.out-i386-linux pei-i386 pei-x86-64 elf64-l1om elf64-k1om elf64-little elf64-big elf32-little elf32-big plugin srec symbolsrec verilog tekhex binary ihex
|
|
|
|
|
objdump:支持的体系结构: i386 i386:x86-64 i386:x64-32 i8086 i386:intel i386:x86-64:intel i386:x64-32:intel i386:nacl i386:x86-64:nacl i386:x64-32:nacl iamcu iamcu:intel l1om l1om:intel k1om k1om:intel plugin
|
|
|
|
|
|
|
|
|
|
下列 i386/x86-64 特定的反汇编器选项在使用 -M 开关时可用(使用逗号分隔多个选项):
|
|
|
|
|
x86-64 Disassemble in 64bit mode
|
|
|
|
|
i386 Disassemble in 32bit mode
|
|
|
|
|
i8086 在 16 位模式下反汇编
|
|
|
|
|
att 用 AT&T 语法显示指令
|
|
|
|
|
intel 用 Intel 语法显示指令
|
|
|
|
|
att-mnemonic
|
|
|
|
|
Display instruction in AT&T mnemonic
|
|
|
|
|
intel-mnemonic
|
|
|
|
|
Display instruction in Intel mnemonic
|
|
|
|
|
addr64 假定 64 位地址大小
|
|
|
|
|
addr32 假定 32 位地址大小
|
|
|
|
|
addr16 假定 16 位地址大小
|
|
|
|
|
data32 假定 32 位数据大小
|
|
|
|
|
data16 假定 16 位数据大小
|
|
|
|
|
suffix 在 AT&T 语法中始终显示指令后缀
|
|
|
|
|
amd64 Display instruction in AMD64 ISA
|
|
|
|
|
intel64 Display instruction in Intel64 ISA
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### 实例
|
|
|
|
|
|
|
|
|
|
首先,在给出后面大部分测试所基于的源代码以及编译指令。 源代码如下:
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
root@localhost [test]# nl mytest.cpp
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
void printTest() {
|
|
|
|
|
char a;
|
|
|
|
|
a = 'a';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void printTest2() {
|
|
|
|
|
int a = 2;
|
|
|
|
|
a+=2;
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
对以上源代码进行编译,如下:
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
[root@localhost test]# g++ -c -g mytest.cpp
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
这里,生成的文件是mytest.o,为了方便测试包含了调试的信息,对可执行文件的测试,显示的结果类似。
|
|
|
|
|
|
|
|
|
|
**查看当前使用的objdump的版本号: **
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
[root@localhost test]# objdump -V
|
|
|
|
|
GNU objdump 2.17.50.0.6-14.el5 20061020
|
|
|
|
|
Copyright 2005 free Software Foundation, Inc.
|
|
|
|
|
This program is free software; you may redistribute it under the terms of
|
|
|
|
|
the GNU General Public License. This program has absolutely no warranty.
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
**查看档案库文件中的信息: **
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
[root@localhost test]# objdump -a libmy2.a
|
|
|
|
|
In archive libmy2.a:
|
|
|
|
|
myfile.o: file format elf32-i386
|
|
|
|
|
rwxrwxrwx 0/0 2724 Nov 16 16:06 2009 myfile.o
|
|
|
|
|
mytest.o: file format elf32-i386
|
|
|
|
|
rw-r--r-- 0/0 727 Jul 13 15:32 2011 mytest.o
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
**这里,libmy2.a是一个使用ar命令将多个*.o目标文件打包而生成的静态库。命令的输出类似`ar -tv`,相比较`ar -tv`输出如下: **
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
[root@localhost test]# ar -tv libmy2.a
|
|
|
|
|
rwxrwxrwx 0/0 2724 Nov 16 16:06 2009 myfile.o
|
|
|
|
|
rw-r--r-- 0/0 727 Jul 13 15:32 2011 mytest.o
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
显示可用的架构和目标结构列表:
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
[root@localhost test]# objdump -i
|
|
|
|
|
BFD header file version 2.17.50.0.6-14.el5 20061020
|
|
|
|
|
elf32-i386
|
|
|
|
|
(header little endian, data little endian)
|
|
|
|
|
i386
|
|
|
|
|
a.out-i386-linux
|
|
|
|
|
(header little endian, data little endian)
|
|
|
|
|
i386
|
|
|
|
|
efi-app-ia32
|
|
|
|
|
(header little endian, data little endian)
|
|
|
|
|
i386
|
|
|
|
|
elf64-x86-64
|
|
|
|
|
(header little endian, data little endian)
|
|
|
|
|
i386
|
|
|
|
|
elf64-little
|
|
|
|
|
(header little endian, data little endian)
|
|
|
|
|
i386
|
|
|
|
|
elf64-big
|
|
|
|
|
(header big endian, data big endian)
|
|
|
|
|
i386
|
|
|
|
|
elf32-little
|
|
|
|
|
(header little endian, data little endian)
|
|
|
|
|
i386
|
|
|
|
|
elf32-big
|
|
|
|
|
(header big endian, data big endian)
|
|
|
|
|
i386
|
|
|
|
|
srec
|
|
|
|
|
(header endianness unknown, data endianness unknown)
|
|
|
|
|
i386
|
|
|
|
|
symbolsrec
|
|
|
|
|
(header endianness unknown, data endianness unknown)
|
|
|
|
|
i386
|
|
|
|
|
tekhex
|
|
|
|
|
(header endianness unknown, data endianness unknown)
|
|
|
|
|
i386
|
|
|
|
|
binary
|
|
|
|
|
(header endianness unknown, data endianness unknown)
|
|
|
|
|
i386
|
|
|
|
|
ihex
|
|
|
|
|
(header endianness unknown, data endianness unknown)
|
|
|
|
|
i386
|
|
|
|
|
trad-core
|
|
|
|
|
(header endianness unknown, data endianness unknown)
|
|
|
|
|
|
|
|
|
|
elf32-i386 a.out-i386-linux efi-app-ia32 elf64-x86-64
|
|
|
|
|
i386 elf32-i386 a.out-i386-linux efi-app-ia32 elf64-x86-64
|
|
|
|
|
|
|
|
|
|
elf64-little elf64-big elf32-little elf32-big srec symbolsrec
|
|
|
|
|
i386 elf64-little elf64-big elf32-little elf32-big srec symbolsrec
|
|
|
|
|
|
|
|
|
|
tekhex binary ihex trad-core
|
|
|
|
|
i386 tekhex binary ihex ---------
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
这里,显示的信息是相对于 -b 或者 -m 选项可用的架构和目标格式列表。
|
|
|
|
|
|
|
|
|
|
**显示mytest.o文件中的text段的内容: **
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
[root@localhost test]# objdump --section=.text -s mytest.o
|
|
|
|
|
mytest.o: file format elf32-i386
|
|
|
|
|
Contents of section .text:
|
|
|
|
|
0000 5589e583 ec10c645 ff61c9c3 5589e583 U......E.a..U...
|
|
|
|
|
0010 ec10c745 fc020000 008345fc 02c9c3 ...E......E....
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
这里注意,不能单独使用-j或者--section,例如`objdump --section=.text mytest.o`是不会运行成功的。
|
|
|
|
|
|
|
|
|
|
**反汇编mytest.o中的text段内容,并尽可能用源代码形式表示: **
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
[root@localhost test]# objdump -j .text -S mytest.o
|
|
|
|
|
mytest.o: file format elf32-i386
|
|
|
|
|
Disassembly of section .text:
|
|
|
|
|
00000000 <_Z9printTestv>:
|
|
|
|
|
void printTest()
|
|
|
|
|
0: 55 push %ebp
|
|
|
|
|
1: 89 e5 mov %esp,%ebp
|
|
|
|
|
3: 83 ec 10 sub $0x10,%esp
|
|
|
|
|
{
|
|
|
|
|
char a;
|
|
|
|
|
a = 'a';
|
|
|
|
|
6: c6 45 ff 61 movb $0x61,0xffffffff(%ebp)
|
|
|
|
|
}
|
|
|
|
|
a: c9 leave
|
|
|
|
|
b: c3 ret
|
|
|
|
|
|
|
|
|
|
000000c <_Z10printTest2v>:
|
|
|
|
|
void printTest2()
|
|
|
|
|
c: 55 push %ebp
|
|
|
|
|
d: 89 e5 mov %esp,%ebp
|
|
|
|
|
f: 83 ec 10 sub $0x10,%esp
|
|
|
|
|
{
|
|
|
|
|
int a = 2;
|
|
|
|
|
12: c7 45 fc 02 00 00 00 movl $0x2,0xfffffffc(%ebp)
|
|
|
|
|
a+=2;
|
|
|
|
|
19: 83 45 fc 02 addl $0x2,0xfffffffc(%ebp)
|
|
|
|
|
}
|
|
|
|
|
1d: c9 leave
|
|
|
|
|
1e: c3 ret
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
这里注意,不能单独使用-j或者--section,例如`objdump -j .text mytest.o是不会运行成功的`。另外-S命令对于包含调试信息的目标文件,显示的效果比较好,如果编译时没有指定g++的-g选项,那么目标文件就不包含调试信息,那么显示效果就差多了。
|
|
|
|
|
|
|
|
|
|
**反汇编出mytest.o的源代码: **
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
[root@localhost test]# objdump -S mytest.o
|
|
|
|
|
mytest.o: file format elf32-i386
|
|
|
|
|
|
|
|
|
|
Disassembly of section .text:
|
|
|
|
|
|
|
|
|
|
00000000 <_Z9printTestv>:
|
|
|
|
|
void printTest()
|
|
|
|
|
0: 55 push %ebp
|
|
|
|
|
1: 89 e5 mov %esp,%ebp
|
|
|
|
|
3: 83 ec 10 sub $0x10,%esp
|
|
|
|
|
{
|
|
|
|
|
char a;
|
|
|
|
|
a = 'a';
|
|
|
|
|
6: c6 45 ff 61 movb $0x61,0xffffffff(%ebp)
|
|
|
|
|
}
|
|
|
|
|
a: c9 leave
|
|
|
|
|
b: c3 ret
|
|
|
|
|
|
|
|
|
|
0000000c <_Z10printTest2v>:
|
|
|
|
|
void printTest2()
|
|
|
|
|
c: 55 push %ebp
|
|
|
|
|
d: 89 e5 mov %esp,%ebp
|
|
|
|
|
f: 83 ec 10 sub $0x10,%esp
|
|
|
|
|
{
|
|
|
|
|
int a = 2;
|
|
|
|
|
12: c7 45 fc 02 00 00 00 movl $0x2,0xfffffffc(%ebp)
|
|
|
|
|
a+=2;
|
|
|
|
|
19: 83 45 fc 02 addl $0x2,0xfffffffc(%ebp)
|
|
|
|
|
}
|
|
|
|
|
1d: c9 leave
|
|
|
|
|
1e: c3 ret
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
这里,尤其当编译的时候指定了-g这种调试参数时,反汇编的效果比较明显。隐含了-d参数。
|
|
|
|
|
|
|
|
|
|
**显示文件的符号表入口: **
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
[root@localhost test]# objdump -t mytest.o
|
|
|
|
|
mytest.o: file format elf32-i386
|
|
|
|
|
|
|
|
|
|
SYMBOL TABLE:
|
|
|
|
|
00000000 l df *ABS* 00000000 mytest.cpp
|
|
|
|
|
00000000 l d .text 00000000 .text
|
|
|
|
|
00000000 l d .data 00000000 .data
|
|
|
|
|
00000000 l d .bss 00000000 .bss
|
|
|
|
|
00000000 l d .debug_abbrev 00000000 .debug_abbrev
|
|
|
|
|
00000000 l d .debug_info 00000000 .debug_info
|
|
|
|
|
00000000 l d .debug_line 00000000 .debug_line
|
|
|
|
|
00000000 l d .debug_frame 00000000 .debug_frame
|
|
|
|
|
00000000 l d .debug_loc 00000000 .debug_loc
|
|
|
|
|
00000000 l d .debug_pubnames 00000000 .debug_pubnames
|
|
|
|
|
00000000 l d .debug_aranges 00000000 .debug_aranges
|
|
|
|
|
00000000 l d .note.GNU-stack 00000000 .note.GNU-stack
|
|
|
|
|
00000000 l d .comment 00000000 .comment
|
|
|
|
|
00000000 g F .text 0000000c _Z9printTestv
|
|
|
|
|
00000000 *UND* 00000000 __gxx_personality_v0
|
|
|
|
|
0000000c g F .text 00000013 _Z10printTest2v
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
这里,输出的信息类似`nm -s`命令的输出,相比较之下,nm命令的输出如下:
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
[root@localhost test]# nm -s mytest.o
|
|
|
|
|
0000000c T _Z10printTest2v
|
|
|
|
|
00000000 T _Z9printTestv
|
|
|
|
|
U __gxx_personality_v0
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
**显示文件的符号表入口,将底层符号解码并表示成用户级别: **
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
[root@localhost test]# objdump -t -C mytest.o
|
|
|
|
|
mytest.o: file format elf32-i386
|
|
|
|
|
SYMBOL TABLE:
|
|
|
|
|
00000000 l df *ABS* 00000000 mytest.cpp
|
|
|
|
|
00000000 l d .text 00000000 .text
|
|
|
|
|
00000000 l d .data 00000000 .data
|
|
|
|
|
00000000 l d .bss 00000000 .bss
|
|
|
|
|
00000000 l d .debug_abbrev 00000000 .debug_abbrev
|
|
|
|
|
00000000 l d .debug_info 00000000 .debug_info
|
|
|
|
|
00000000 l d .debug_line 00000000 .debug_line
|
|
|
|
|
00000000 l d .debug_frame 00000000 .debug_frame
|
|
|
|
|
00000000 l d .debug_loc 00000000 .debug_loc
|
|
|
|
|
00000000 l d .debug_pubnames 00000000 .debug_pubnames
|
|
|
|
|
00000000 l d .debug_aranges 00000000 .debug_aranges
|
|
|
|
|
00000000 l d .note.GNU-stack 00000000 .note.GNU-stack
|
|
|
|
|
00000000 l d .comment 00000000 .comment
|
|
|
|
|
00000000 g F .text 0000000c printTest()
|
|
|
|
|
00000000 *UND* 00000000 __gxx_personality_v0
|
|
|
|
|
0000000c g F .text 00000013 printTest2()
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
这里,和没-C相比,printTest2函数可读性增加了。
|
|
|
|
|
|
|
|
|
|
**反汇编目标文件的特定机器码段: **
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
[root@localhost test]# objdump -d mytest.o
|
|
|
|
|
mytest.o: file format elf32-i386
|
|
|
|
|
Disassembly of section .text:
|
|
|
|
|
|
|
|
|
|
00000000 <_Z9printTestv>:
|
|
|
|
|
0: 55 push %ebp
|
|
|
|
|
1: 89 e5 mov %esp,%ebp
|
|
|
|
|
3: 83 ec 10 sub $0x10,%esp
|
|
|
|
|
6: c6 45 ff 61 movb $0x61,0xffffffff(%ebp)
|
|
|
|
|
a: c9 leave
|
|
|
|
|
b: c3 ret
|
|
|
|
|
|
|
|
|
|
0000000c <_Z10printTest2v>:
|
|
|
|
|
c: 55 push %ebp
|
|
|
|
|
d: 89 e5 mov %esp,%ebp
|
|
|
|
|
f: 83 ec 10 sub $0x10,%esp
|
|
|
|
|
12: c7 45 fc 02 00 00 00 movl $0x2,0xfffffffc(%ebp)
|
|
|
|
|
19: 83 45 fc 02 addl $0x2,0xfffffffc(%ebp)
|
|
|
|
|
1d: c9 leave
|
|
|
|
|
1e: c3 ret
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
这里,对text段的内容进行了反汇编。
|
|
|
|
|
|
|
|
|
|
**反汇编特定段,并将汇编代码对应的文件名称和行号对应上: **
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
[root@localhost test]# objdump -d -l mytest.o
|
|
|
|
|
mytest.o: file format elf32-i386
|
|
|
|
|
Disassembly of section .text:
|
|
|
|
|
|
|
|
|
|
00000000 <_Z9printTestv>:
|
|
|
|
|
_Z9printTestv():
|
|
|
|
|
/root/test/04_libraryTest/mytest.cpp:1
|
|
|
|
|
0: 55 push %ebp
|
|
|
|
|
1: 89 e5 mov %esp,%ebp
|
|
|
|
|
3: 83 ec 10 sub $0x10,%esp
|
|
|
|
|
/root/test/04_libraryTest/mytest.cpp:4
|
|
|
|
|
6: c6 45 ff 61 movb $0x61,0xffffffff(%ebp)
|
|
|
|
|
/root/test/04_libraryTest/mytest.cpp:5
|
|
|
|
|
a: c9 leave
|
|
|
|
|
b: c3 ret
|
|
|
|
|
|
|
|
|
|
0000000c <_Z10printTest2v>:
|
|
|
|
|
_Z10printTest2v():
|
|
|
|
|
/root/test/04_libraryTest/mytest.cpp:6
|
|
|
|
|
c: 55 push %ebp
|
|
|
|
|
d: 89 e5 mov %esp,%ebp
|
|
|
|
|
f: 83 ec 10 sub $0x10,%esp
|
|
|
|
|
/root/test/04_libraryTest/mytest.cpp:8
|
|
|
|
|
12: c7 45 fc 02 00 00 00 movl $0x2,0xfffffffc(%ebp)
|
|
|
|
|
/root/test/04_libraryTest/mytest.cpp:9
|
|
|
|
|
19: 83 45 fc 02 addl $0x2,0xfffffffc(%ebp)
|
|
|
|
|
/root/test/04_libraryTest/mytest.cpp:10
|
|
|
|
|
1d: c9 leave
|
|
|
|
|
1e: c3 ret
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
这里,项"-d"从objfile中反汇编那些特定指令机器码的section,而使用"-l"指定用文件名和行号标注相应的目标代码,仅仅和-d、-D或者-r一起使用,使用-ld和使用-d的区别不是很大,在源码级调试的时候有用,要求编译时使用了-g之类的调试编译选项。
|
|
|
|
|
|
|
|
|
|
**显示目标文件各个段的头部摘要信息: **
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
[root@localhost test]# objdump -h mytest.o
|
|
|
|
|
mytest.o: file format elf32-i386
|
|
|
|
|
|
|
|
|
|
Sections:
|
|
|
|
|
Idx Name Size VMA LMA File off Algn
|
|
|
|
|
0 .text 0000001f 00000000 00000000 00000034 2**2
|
|
|
|
|
CONTENTS, ALLOC, LOAD, readonly, CODE
|
|
|
|
|
1 .data 00000000 00000000 00000000 00000054 2**2
|
|
|
|
|
CONTENTS, ALLOC, LOAD, DATA
|
|
|
|
|
2 .bss 00000000 00000000 00000000 00000054 2**2
|
|
|
|
|
ALLOC
|
|
|
|
|
3 .debug_abbrev 00000046 00000000 00000000 00000054 2**0
|
|
|
|
|
CONTENTS, READONLY, DEBUGGING
|
|
|
|
|
4 .debug_info 000000ed 00000000 00000000 0000009a 2**0
|
|
|
|
|
CONTENTS, RELOC, READONLY, DEBUGGING
|
|
|
|
|
5 .debug_line 0000003e 00000000 00000000 00000187 2**0
|
|
|
|
|
CONTENTS, RELOC, READONLY, DEBUGGING
|
|
|
|
|
6 .debug_frame 00000044 00000000 00000000 000001c8 2**2
|
|
|
|
|
CONTENTS, RELOC, READONLY, DEBUGGING
|
|
|
|
|
7 .debug_loc 00000058 00000000 00000000 0000020c 2**0
|
|
|
|
|
CONTENTS, READONLY, DEBUGGING
|
|
|
|
|
8 .debug_pubnames 0000002f 00000000 00000000 00000264 2**0
|
|
|
|
|
CONTENTS, RELOC, READONLY, DEBUGGING
|
|
|
|
|
9 .debug_aranges 00000020 00000000 00000000 00000293 2**0
|
|
|
|
|
CONTENTS, RELOC, READONLY, DEBUGGING
|
|
|
|
|
10 .comment 0000002e 00000000 00000000 000002b3 2**0
|
|
|
|
|
CONTENTS, READONLY
|
|
|
|
|
11 .note.GNU-stack 00000000 00000000 00000000 000002e1 2**0
|
|
|
|
|
CONTENTS, READONLY
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
这里,更多的内容参见`man objdump`中的这个选项。
|
|
|
|
|
|
|
|
|
|
|