gdbで特定の関数をアセンブルする

gcc -S とかでアセンブリの勉強とかしてたけど、
これは大きいファイルになるほど面倒だし、よく分からなくなる。
すべてを読みこんでから関数単位でアセンブリを見たくなった。
 
「それgdbでできるよ」
 
gdbを知らない人はこちら
debugging with GDB
 
何をしたいのか分からないものを用意

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int *cntr;
    cntr = malloc(sizeof(int) * 10);
    cntr[0] = 2;
    cntr[0] += 3;
    return *cntr;
}

malloc_test.c
 
コンパイル

gcc -g malloc_test.c
  • g はgdb用で見れるようにするオプション

man gdbで -g を見ればいいかと
 
GDB起動

nari@nari-laptop ~/p/study> gdb a.out
GNU gdb 6.8-debian
Copyright (C) 2008 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "i486-linux-gnu"...

 
アセンブルかます

(gdb) disassemble main
Dump of assembler code for function main:
0x08048374 <main+0>:	lea    0x4(%esp),%ecx
0x08048378 <main+4>:	and    $0xfffffff0,%esp
0x0804837b <main+7>:	pushl  -0x4(%ecx)
0x0804837e <main+10>:	push   %ebp
0x0804837f <main+11>:	mov    %esp,%ebp
0x08048381 <main+13>:	push   %ecx
0x08048382 <main+14>:	sub    $0x14,%esp
0x08048385 <main+17>:	movl   $0x28,(%esp)
0x0804838c <main+24>:	call   0x80482d8 <malloc@plt>
0x08048391 <main+29>:	mov    %eax,-0x8(%ebp)
0x08048394 <main+32>:	mov    -0x8(%ebp),%eax
0x08048397 <main+35>:	movl   $0x2,(%eax)
0x0804839d <main+41>:	mov    -0x8(%ebp),%eax
0x080483a0 <main+44>:	mov    (%eax),%eax
0x080483a2 <main+46>:	lea    0x3(%eax),%edx
0x080483a5 <main+49>:	mov    -0x8(%ebp),%eax
0x080483a8 <main+52>:	mov    %edx,(%eax)
0x080483aa <main+54>:	mov    -0x8(%ebp),%eax
0x080483ad <main+57>:	mov    (%eax),%eax
0x080483af <main+59>:	add    $0x14,%esp
0x080483b2 <main+62>:	pop    %ecx
0x080483b3 <main+63>:	pop    %ebp
0x080483b4 <main+64>:	lea    -0x4(%ecx),%esp
0x080483b7 <main+67>:	ret    
End of assembler dump.

 
また、.oとか.soとかだけあって.cがないという場合にも役立つ事があるんだが、それはまた次回に。
(バイナリがあってファイルがない場合)