1、介绍
objdump是用查看目标文件或者可执行的目标文件的构成的工具。
2、参数
选项 | 详细选项 | 描述 |
-a | --archive-headers | 显示档案库的成员信息,类似 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++函数名以可理解的方式显示出来。 |
-g | --debugging | 显示调试信息。企图解析保存在文件中的调试信息并以 C 语言的语法显示出来。仅仅支持某些类型的调试信息。有些其他的格式被 readelf -w 支持。 |
-e | --debugging-tags | 类似 -g 选项,但是生成的信息是和 ctags 工具相兼容的格式。 |
-d | --disassemble | 从 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 选项列出这里能够指定的架构. |
-r | --reloc | 显示文件的重定位入口。如果和 -d 或者 -D 一起使用,重定位部分以反汇编后的格式显示出来。 |
-R | --dynamic-reloc | 显示文件的动态重定位入口,仅仅对于动态目标文件意义,比如某些共享库。 |
-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 选项载入 |
3、例子
3.1 显示文件头信息
$ objdump main.o -h
main.o: file format elf64-x86-64
Sections:
Idx Name Size VMA LMA File off Algn
0 .text 0000002a 0000000000000000 0000000000000000 00000040 2**0
CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
1 .data 00000010 0000000000000000 0000000000000000 00000070 2**3
CONTENTS, ALLOC, LOAD, RELOC, DATA
2 .bss 00000000 0000000000000000 0000000000000000 00000080 2**0
ALLOC
3 .rodata 00000015 0000000000000000 0000000000000000 00000080 2**0
CONTENTS, ALLOC, LOAD, READONLY, DATA
4 .comment 00000036 0000000000000000 0000000000000000 00000095 2**0
CONTENTS, READONLY
5 .note.GNU-stack 00000000 0000000000000000 0000000000000000 000000cb 2**0
CONTENTS, READONLY
6 .eh_frame 00000038 0000000000000000 0000000000000000 000000d0 2**3
CONTENTS, ALLOC, LOAD, RELOC, READONLY, DATA
3.2 输出目标文件的符号表
$ objdump main.o -t
main.o: file format elf64-x86-64
SYMBOL TABLE:
0000000000000000 l df *ABS* 0000000000000000 main.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
0000000000000004 O *COM* 0000000000000004 bbb
0000000000000000 g O .data 0000000000000004 ccc
0000000000000008 g O .data 0000000000000008 ddd
0000000000000000 g F .text 000000000000002a main
0000000000000000 *UND* 0000000000000000 printf
3.3 反汇编
$ objdump main.o -d
main.o: file format elf64-x86-64
Disassembly of section .text:0000000000000000 <main>:
0: 55 push %rbp
1: 48 89 e5 mov %rsp,%rbp
4: 48 83 ec 10 sub $0x10,%rsp
8: c7 45 fc 0a 00 00 00 movl $0xa,-0x4(%rbp)
f: 8b 45 fc mov -0x4(%rbp),%eax
12: 89 c6 mov %eax,%esi
14: bf 00 00 00 00 mov $0x0,%edi
19: b8 00 00 00 00 mov $0x0,%eax
1e: e8 00 00 00 00 callq 23 <main+0x23>
23: b8 00 00 00 00 mov $0x0,%eax
28: c9 leaveq
29: c3 retq
3.4 显示指定段的信息
$ objdump -s -j .comment main.o
main.o: file format elf64-x86-64
Contents of section .comment:
0000 00474343 3a202855 62756e74 7520352e .GCC: (Ubuntu 5.
0010 342e302d 36756275 6e747531 7e31362e 4.0-6ubuntu1~16.
0020 30342e31 32292035 2e342e30 20323031 04.12) 5.4.0 201
0030 36303630 3900 60609.$ objdump -s -j .text main.o
main.o: file format elf64-x86-64
Contents of section .text:
0000 554889e5 4883ec10 c745fc0a 0000008b UH..H....E......
0010 45fc89c6 bf000000 00b80000 0000e800 E...............
0020 000000b8 00000000 c9c3 ..........$ objdump -S -j .text main.o
main.o: file format elf64-x86-64
Disassembly of section .text:0000000000000000 <main>:
0: 55 push %rbp
1: 48 89 e5 mov %rsp,%rbp
4: 48 83 ec 10 sub $0x10,%rsp
8: c7 45 fc 0a 00 00 00 movl $0xa,-0x4(%rbp)
f: 8b 45 fc mov -0x4(%rbp),%eax
12: 89 c6 mov %eax,%esi
14: bf 00 00 00 00 mov $0x0,%edi
19: b8 00 00 00 00 mov $0x0,%eax
1e: e8 00 00 00 00 callq 23 <main+0x23>
23: b8 00 00 00 00 mov $0x0,%eax
28: c9 leaveq
29: c3 retq
注:不能单独使用-j .xxx段,必须加上对这个段有什么操作的参数,比如-s、-S等。