バイナリ(というかアセンブリコード)を元のCソースと対訳で読みたいのだけれど… on Mac
ぐぐる先生もBINARY HACKS先生も
objdump -d -S hogehoge.o
で出来るよ、っていうんで
でインストールされた gobjdump で試してみたけどCのソースが出てこない
- ・・・もしかしてLinuxではできるのにMacではできないとか?
- ・・・というとELFには対応してるけどMach-Oには対応してないとか?
で、objdump mach-o でぐぐったらshinh先生の正月の記事ですよ
Mach-O バイナリをコード見ながら逆アセンブルする方法が無いってのがずっと困っていました。つまり linux でよくやっている objdump -S みたいなことがやりたかったんですが、 objdump -S は Mach-O に対しては動かないし、 otool -tvV もソースコードは見せてくれないし、っていう。でまぁ一念発起して binutils というか libbfd をいじってみたのでした。
binutils にパッチ投げてみた話 - 兼雑記
てかこの記事正月に読んだはずなのに
で、http://ftp.gnu.org/gnu/binutils/ の最新版 (2.22) が 2011/11/21 とあるので、もっと新しいやつないかなと思って ftp://sourceware.org/pub/binutils/snapshots から最新スナップショット (1/23現在 2.22.51) を貰ってきてビルドしてみるなう
$ tar jxf binutils-2.22.51.tar.bz2 $ cd binutils-2.22.51 $ ./configure $ make $ sudo make install
試してみよう。hello.cはこんな感じで:
#include <stdio.h> main(int argc, char *argv[]) { printf("Hello, world\n"); }
$ vi hello.c $ gcc -g hello.c -o hello $ objdump -d -S hello hello: ファイル形式 mach-o-x86-64 セクション .text の逆アセンブル: 0000000100000eb0 <start>: 100000eb0: 6a 00 pushq $0x0 ... (略) ... 100000eef: 90 nop 0000000100000ef0 <_main>: #include <stdio.h> main(int argc, char *argv[]) { 100000ef0: 55 push %rbp 100000ef1: 48 89 e5 mov %rsp,%rbp 100000ef4: 48 83 ec 20 sub $0x20,%rsp 100000ef8: 89 f8 mov %edi,%eax 100000efa: 89 45 fc mov %eax,-0x4(%rbp) 100000efd: 48 89 75 f0 mov %rsi,-0x10(%rbp) printf("Hello, world\n"); 100000f01: 48 8d 05 44 00 00 00 lea 0x44(%rip),%rax # 100000f4c <_puts$stub+0x2c> 100000f08: 48 89 c7 mov %rax,%rdi 100000f0b: e8 10 00 00 00 callq 100000f20 <_puts$stub> } 100000f10: 8b 45 ec mov -0x14(%rbp),%eax 100000f13: 48 83 c4 20 add $0x20,%rsp 100000f17: 5d pop %rbp 100000f18: c3 retq セクション __TEXT.__stubs の逆アセンブル: ... (略) ...
イイネ!!
BINARY HACKSの裏表紙の裏にしてもらったshinh先生のサインが今日も輝いてるぜ
↑教科書の裏に自分の名前を書くみたいな感じで書いてあるけど我が家の蔵書です