9

C++ プログラムのメソッド呼び出しに介入する必要があります (クラスは別の共有ライブラリに存在します)。LD_PRELOAD を使用できると思いましたが、これがどのように機能するかわかりません (C 関数の例しか見つかりませんでした): 挿入されたクラスの実装からコードをコピーせずに、単一のメソッドの挿入を設定する方法はありますか?

4

2 に答える 2

11

挿入されたコード用のファイルを作成するだけです (実装が適切でないことを確認してください)。名前空間、クラス名、および関数は、インターセプトするメソッドと同じにする必要があります。クラス定義では、インターセプトしたくない他のメソッドについて言及しないでください。LD_PRELOAD には、傍受する共有オブジェクトへのフル パスが必要であることに注意してください。

たとえば、void X::fn1() をインターセプトするには、次のようにファイル libx2.cc を作成します。

#include <iostream>

クラスX
{
  公衆:
    void X::fn1();
};

void X::fn1() { std::cout << "X2::fn()\n"; }

次に、それをコンパイルします。

g++ -shared -o libx2.so libx2.cc

次に、alaを実行します

LD_PRELOAD=`pwd`/libx2.so ./libx_client

乾杯

于 2010-08-05T02:47:06.040 に答える
2

移植性は高くありませんが、割り込み関数を C で記述して、C++ メソッドのマングル名を付けることができます。もちろん、このパラメーターを明示的に処理する必要がありますが、すべての ELF ABI はそれを目に見えない最初の引数として扱うだけだと思います。

于 2010-08-05T00:55:59.200 に答える