objdump生成可读的汇编代码

  • Post author:
  • Post category:其他

大家都知道用GCC的选项S来生成汇编代码,可是这样的汇编代码过于复杂,GCC生成了很多的额外信息,信息量大了,可读性却降低了,举个简单的例子:

下面是一段非常简单的C程序 test.c

int main()
{
   int a = 1;
   return a;
}

用GCC的S选项编译出来的汇编是这样的,几行的Code产生了非常多的信息,不偏于阅读和对照。(也可以加上选项 -fverbose-asm, 显示更多comment信息)

#gcc  -S -fverbose-asm test.c

.file “temp.c”
.text
.globl main
.type main, @function
main:
.LFB2:
pushq %rbp
.LCFI0:
movq %rsp, %rbp
.LCFI1:
movl $1, %eax
leave
ret
.LFE2:
.size main, .-main
.section .eh_frame,”a”,@progbits
.Lframe1:
.long .LECIE1-.LSCIE1
.LSCIE1:
.long 0x0
.byte 0x1
.string “zR”
.uleb128 0x1
.sleb128 -8
.byte 0x10
.uleb128 0x1
.byte 0x3
.byte 0xc
.uleb128 0x7
.uleb128 0x8
.byte 0x90
.uleb128 0x1
.align 8
.LECIE1:
.LSFDE1:
.long .LEFDE1-.LASFDE1
.LASFDE1:
.long .LASFDE1-.Lframe1
.long .LFB2
.long .LFE2-.LFB2
.uleb128 0x0
.byte 0x4
.long .LCFI0-.LFB2
.byte 0xe
.uleb128 0x10
.byte 0x86
.uleb128 0x2
.byte 0x4
.long .LCFI1-.LCFI0
.byte 0xd
.uleb128 0x6
.align 8
.LEFDE1:
.ident “GCC: (SUSE Linux) 4.3.4 [gcc-4_3-branch revision 152973]”
.section .comment.SUSE.OPTs,”MS”,@progbits,1
.string “ospwg”
.section .note.GNU-stack,””,@progbits

用objdump命令则可以生成阅读性高很多的汇编代码, 除了信息精简了很多,而且还有和原始Code的对照,是不是这样看就清楚多了。

#gcc -g -c test.c

#objdump -d -M intel -S test.o

temp.o:     file format elf64-x86-64

Disassembly of section .text:

0000000000000000 <main>:
//#include <iostream>
//using namespace std;

int main()
{
   0: 55                   push   rbp
   1: 48 89 e5             mov    rbp,rsp
   int a;

   return 1;
   4: b8 01 00 00 00       mov    eax,0x1
}
   9: c9                   leave  
   a: c3                   ret    

## 博客仅作个人记录##


版权声明:本文为swedenfeng原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。