|
objdump 是 binutils 包中的一个非常有用的工具。我们经常会查看目标代码文件中由编译器生成的指令码,而 objdump 不仅能够显示汇编语言代码,而且还能够显示生成的原始指令码。可以通过 man 来查看 objdump 的命令格式。
下表为命令行参数简要说明:
参数
| 描述
| -a
| 如果任何文件是存档文件,则显示存档头信息
| -b
| 指定目标代码文件的目标代码格式
| -C
| 将低级符号还原为用户级别的名称
| -d
| 把目标代码反汇编为指令码
| -D
| 把所有段反汇编为指令码,包括数据
| -EB
| 指定大端格式(big-endian)目标文件
| -EL
| 指定小端格式(little-endian)目标文件
| -f
| 显示每个文件头的摘要信息
| -G
| 显示调试段的内容
| -h
| 显示每个文件段头的摘要信息
| -i
| 显示所有架构和目标格式的清单
| -j
| 只显示指定段的信息
| -l
| 使用源代码行号标记输出
| -m
| 指定进行反汇编时使用的架构
| -p
| 显示目标文件格式特有的信息
| -r
| 显示文件中的重定位条目
| -R
| 显示文件中的动态重定位条目
| -s
| 显示指定段的完整内容
| -S
| 交错显示源代码和反汇编后的代码
| -t
| 显示文件的符号表条目
| -T
| 显示文件的动态符号表条目
| -x
| 显示文件所有可用的头信息
| --start-address
| 开始显示在指定地址上的数据
| --stop-address
| 停止显示在指定地址上的数据
|
在众多参数中,-d 参数最有意思,因为它显示反汇编后的目标代码文件。现在以 hello world 为例,hello.c 代码为:
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf ("hello world\n");
exit (0);
} 使用 gcc 的 -c 参数编译源程序,创建用于转储的目标文件:
生成 hello.o 目标文件,现在用 objdump 及 -d 参数查看 hello.o 文件:
beyes@beyes-groad:~/programming$ objdump -d hello.o
hello.o: file format elf32-i386
Disassembly of section .text:
00000000 <main>:
0: 55 push %ebp
1: 89 e5 mov %esp,%ebp
3: 83 e4 f0 and $0xfffffff0,%esp
6: 83 ec 10 sub $0x10,%esp
9: c7 04 24 00 00 00 00 movl $0x0,(%esp)
10: e8 fc ff ff ff call 11 <main+0x11>
15: c7 04 24 00 00 00 00 movl $0x0,(%esp)
1c: e8 fc ff ff ff call 1d <main+0x1d>
编译器版本的不同上面 dump 出的结果也会有所差别。有另外一篇介绍 objdump 的帖子:http://www.groad.net/bbs/read.php?tid-784.html |
|