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