明確にするために、私の質問は、呼び出し元と呼び出し先がGCCコンパイラとリンカーを使用して同じコンパイルユニットで定義されている場合に、ある関数/シンボルから別の関数/シンボルへの呼び出しをラップ/インターセプトすることを指します。
次のような状況があります。
/* foo.c */
void foo(void)
{
/* ... some stuff */
bar();
}
void bar(void)
{
/* ... some other stuff */
}
これらの関数への呼び出しをラップしたいと思いますが、ld のオプションを使用して (ある程度まで) それを行うことができます--wrap
(そして、ld のオプションの結果によって期待されるように __real_foo と __real_bar を呼び出す __wrap_foo と __wrap_bar を実装し--wrap
ます)。
gcc -Wl,--wrap=foo -Wl,--wrap=bar ...
私が抱えている問題は、これがこのコンパイル単位の外部からの foo と bar への参照に対してのみ有効になる (そしてリンク時に解決される) ことです。つまり、foo.c 内の他の関数からの foo および bar への呼び出しはラップされません。
objcopy --redefine-symを使用してみましたが、シンボルとその参照の名前が変更されるだけです。
and (foo.o 内) の呼び出しをfoo
and (リンカーのオプションによって他のオブジェクト ファイルで解決されるのと同じように) に置き換えたいと思います。*.o ファイルをリンカーのオプションに渡す前に、foo を変更する必要はありません。 .c のソース コード。bar
__wrap_foo
__wrap_bar
--wrap
--wrap
そうすれば、foo.o の外で行われる呼び出しだけでなく、 とfoo
へのすべての呼び出しに対してラッピング/インターセプトが行われます。bar
これは可能ですか?