objdump命令的使用

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源代码和反汇编出来的指令对照:

  1. 编译成目标文件(要加-g选项)
    gcc -g -o test.c
  2. 输出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>

标签: linux, c

添加新评论