4

彼らの例によると、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++ でコンパイルすると、出力は単純になります。

インサイド・フー

4

1 に答える 1

1

G ++は、。なしで関数の名前マングリングを行いますextern "C"。したがって、マングルされた名前(withnm objectなど)を見つけて、valgrindコードで使用する必要があります。または、関数を使用するようにターゲットプログラムを書き直すことができますextern "C"

于 2011-02-22T11:38:06.760 に答える