既存の関数をオーバーライドできる?

あとで検証する。


[GNU リンカ ldの使い方]
http://www.sra.co.jp/wingnut/ld/ld-ja_2.html


--wrap symbol
symbol に対しラッパ関数を使う. symbol に対する未定義の参照は全て __wrap_symbol に解決される. __real_symbol に対する未定義の参照は全て symbol に解決される.

これを使うと, システムの関数に対するラッパを用意することができる. ラッパ関数は __wrap_symbol という名前にする必要がある. この関数がシステム関数を呼び出したい時には, __real_symbol を呼び出すようにする.

以下に簡単な例を示す.

void *
__wrap_malloc (int c)
{
printf ("malloc called with %ld\n", c);
return __real_malloc (c);
}

このファイルを --wrap malloc を指定して他のコードとリンクすると, 全ての malloc の呼び出しは, 代わりに関数 __wrap_malloc を呼び出す. __wrap_malloc の中の __real_malloc の呼び出しは本物の malloc 関数を呼び出す.

__real_malloc 関数も用意しておけば, --wrap オプションを指定せずにリンクしても大丈夫である. その場合, __real_malloc の定義を __wrap_malloc と同じファイルに置いてはいけない. 同じファイルに置いてしまうと, GNU リンカが malloc の呼び出しに変える前に, アセンブラがその呼び出しを解決してしまうからである.


あとは、gccのLD_PRELOADとか。
[cl.pocari.org - LD_PRELOAD を利用して,プログラム中で実行される connect() の接続先を syslog へ記録する hook_tcp.so]
http://cl.pocari.org/2005-12-27-10.html