objdump命令是Linux下的反汇编目标文件或者可执行文件的命令,它还有其他作用,下面以ELF格式可执行文件test为例详细介绍:
objdump -f test
显示test的文件头信息
objdump -d test
反汇编test中的需要执行指令的那些section
objdump -D test
与-d类似,但反汇编test中的所有section
objdump -h test
显示test的Section Header信息
objdump -x test
显示test的全部Header信息
objdump -s test
除了显示test的全部Header信息,还显示他们对应的十六进制文件代码
举例:
将C源代码和反汇编出来的指令对照:
- 编译成目标文件(要加-g选项)
gcc -g -o test.c
- 输出C源代码和反汇编出来的指令对照的格式
objdump -S test.o
如下:
00000000004004c4 <main>:
#include <stdio.h>
#define ARR_LENGTH 3
int main(void)
{
4004c4: 55 push %rbp
4004c5: 48 89 e5 mov %rsp,%rbp
4004c8: 48 83 ec 30 sub $0x30,%rsp
int a=1,b=2,c=3,*p[ARR_LENGTH] = {&a,&b,&c};
4004cc: c7 45 f8 01 00 00 00 movl $0x1,-0x8(%rbp)
4004d3: c7 45 f4 02 00 00 00 movl $0x2,-0xc(%rbp)
4004da: c7 45 f0 03 00 00 00 movl $0x3,-0x10(%rbp)
4004e1: 48 8d 45 f8 lea -0x8(%rbp),%rax
4004e5: 48 89 45 d0 mov %rax,-0x30(%rbp)
4004e9: 48 8d 45 f4 lea -0xc(%rbp),%rax
4004ed: 48 89 45 d8 mov %rax,-0x28(%rbp)
4004f1: 48 8d 45 f0 lea -0x10(%rbp),%rax
4004f5: 48 89 45 e0 mov %rax,-0x20(%rbp)
for(int i = 0;i < ARR_LENGTH;i++)
4004f9: c7 45 fc 00 00 00 00 movl $0x0,-0x4(%rbp)
400500: eb 27 jmp 400529 <main+0x65>
{
printf("*p[%d] = %d\n",i,*p[i]);
400502: 8b 45 fc mov -0x4(%rbp),%eax
400505: 48 98 cltq
400507: 48 8b 44 c5 d0 mov -0x30(%rbp,%rax,8),%rax
40050c: 8b 10 mov (%rax),%edx
40050e: b8 38 06 40 00 mov $0x400638,%eax
400513: 8b 4d fc mov -0x4(%rbp),%ecx
400516: 89 ce mov %ecx,%esi
400518: 48 89 c7 mov %rax,%rdi
40051b: b8 00 00 00 00 mov $0x0,%eax
400520: e8 93 fe ff ff callq 4003b8 <printf@plt>