raw_write.h
よく、 libc の関数呼べるかどうかはあやしい部分を printf デバッグしたいことがあると思います。あるんですよ!
そういう時にシステムコールってどう呼ぶんだっけ…みたいなことを調べたり、ええと数字を出力したい…とかいうのは結構かったるいので、 #include するだけで使えるライブラリを書いてみました。 for linux 。
https://github.com/shinh/test/blob/master/raw_write.h
使いかたはテストの方を見てください。要は RAW_PRINT_STR, RAW_PRINT_INT, RAW_PRINT_PTR とかが print で、 RAW_PUTS_STR, RAW_PUTS_INT, RAW_PUTS_PTR とかが改行つきです。
https://github.com/shinh/test/blob/master/raw_write_test.c
ついでに nop を埋める RAW_NOP() と、逆アセした時に注目したいコードをマーキングする用途で、 4242 とかで検索したら見つかるようにしてある RAW_UNIQ_NOP() 、 breakpoint を埋める RAW_BREAK() をおまけとしてつけてあります。
そういえば x86-64 の inline assembly てやつは、どうも RAX とかに入れますよーっていう constraint がたぶん無いんだと思う(EAXとかはもちろんあるけど)。しょうがないから、
http://gcc.gnu.org/bugzilla/attachment.cgi?id=17274
とかに書いてある通り、 register unsigned long rsi asm("rsi") みたいなのを定義して、 constraint を +r にしてやることでなんとかした。あとの引数はまあ 64bit いらんし、 constraint でいいんじゃないかな…
でもなんか雰囲気的には constraint でレジスタ指定するのは筋が悪いってのが GCC の気持ちなんですかね。このへん見ると。
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=16331
あともうひとつ、 GCC の inline assembly は input register を clobber register として指定できないのもよくわからんなーとか思う。 =r とかにするには変数定義せにゃならんし、マクロの中とかだと特にめんどくさいんだよな…