(備忘録)シンプルなCのソースコードをGCCでコンパイルして逆アセンブルする


シンプルなCのソースコードをコンパイルして逆アセンブルしていきます。

addintandint.c
extern int addintandint(int i ,int j)
{
        return i + j;
}

extern int hoge()
{
        return addintandint(3,2);
}

最適化をかけてコンパイルします

$ gcc -c -Og addintandint.c

逆アセンブル。Intel記法で行います

$ objdump -M intel -d addintandint.o >dump.txt

逆アセンブルできました。

addintandint.o:     ファイル形式 elf64-x86-64


セクション .text の逆アセンブル:

0000000000000000 <addintandint>:
   0:   f3 0f 1e fa             endbr64 
   4:   8d 04 37                lea    eax,[rdi+rsi*1]
   7:   c3                      ret    

0000000000000008 <hoge>:
   8:   f3 0f 1e fa             endbr64 
   c:   be 02 00 00 00          mov    esi,0x2
  11:   bf 03 00 00 00          mov    edi,0x3
  16:   e8 00 00 00 00          call   1b <hoge+0x13>
  1b:   c3                      ret 

ちなみに以下のように最適化をかけないでコンパイルすると

$ gcc -c  addintandint.c

以下のようにちょっとややこしくなります

addintandint.o:     ファイル形式 elf64-x86-64


セクション .text の逆アセンブル:

0000000000000000 <addintandint>:
   0:   f3 0f 1e fa             endbr64 
   4:   55                      push   rbp
   5:   48 89 e5                mov    rbp,rsp
   8:   89 7d fc                mov    DWORD PTR [rbp-0x4],edi
   b:   89 75 f8                mov    DWORD PTR [rbp-0x8],esi
   e:   8b 55 fc                mov    edx,DWORD PTR [rbp-0x4]
  11:   8b 45 f8                mov    eax,DWORD PTR [rbp-0x8]
  14:   01 d0                   add    eax,edx
  16:   5d                      pop    rbp
  17:   c3                      ret    

0000000000000018 <hoge>:
  18:   f3 0f 1e fa             endbr64 
  1c:   55                      push   rbp
  1d:   48 89 e5                mov    rbp,rsp
  20:   be 02 00 00 00          mov    esi,0x2
  25:   bf 03 00 00 00          mov    edi,0x3
  2a:   e8 00 00 00 00          call   2f <hoge+0x17>
  2f:   5d                      pop    rbp
  30:   c3                      ret

謝辞:以下のサイトなどで教えていただいたyumetodoさん、Peter Cordesさんありがとうございました