彼らの例によると、Valgrindで関数をインターセプトしようとしています。
gcc でビルドする場合はグローバル関数のインターセプトを実行できますが、同じコードを g++ でコンパイルするとインターセプトが機能しません。
指定する必要があるコンパイラ フラグに特別なものはありますか?
サンプルアプリは次のとおりです。
#include <stdio.h>
#include "valgrind.h"
__attribute__ ((noinline))
void foo()
{
printf("inside foo\n");
}
void I_WRAP_SONAME_FNNAME_ZU(NONE,foo)()
{
OrigFn fn;
VALGRIND_GET_ORIG_FN(fn);
printf("*** Before foo()\n");
CALL_FN_v_v(fn);
printf("*** After foo()\n");
}
int main()
{
foo();
return 0;
}
GCC でコンパイルすると、出力は次のようになります。
*** Before foo()
inside foo
*** After foo()
ただし、g++ でコンパイルすると、出力は単純になります。
インサイド・フー