共有ライブラリを LD_PRELOAD に書き込んでおり、既存のライブラリ (Linux) からのいくつかの呼び出しをインターセプトしています。
約 50 以上の異なる関数プロトタイプと属性宣言を記述する必要があります。関数プロトタイプは非常に大きいため、コードをできるだけ短くしたいと考えています。
私が抱えている問題は次のとおりです: doStuff(int, void*) へのすべての呼び出しを傍受したいとしましょう
次のコードがあります。
ヘッダー ファイル:
typedef int (*doStuffPrototype) (int, void*);
extern doStuffPrototype dlSym_doStuff;
extern int doStuff(int, void*);
Cファイル
doStuffPrototype dlSym_doStuff;
__attribute__((constructor)) void libSomething() {
void* lib_ptr;
dlerror();
lib_ptr = dlopen(LIB_NAME, RTLD_LAZY);
...
// Loading all references to the real library
dlSym_doStuff = (doStuffPrototype) dlSym(lib_ptr, "doStuff");
}
これで問題なく動作しますが、ヘッダーの次の行を置き換えたいと思います。
extern int doStuff(int, void*);
次のようなもので:
extern doStuffPrototype doStuff;
しかし、私は得る
「doStuff」が別の種類のシンボルとして再宣言されました
実際のライブラリで宣言されているため...しかし...現在の構文には問題はありません...引数を最初から書き直さなければなりません...型定義から逆参照を外すと:
typedef int (doStuffPrototype) (int, void*);
その後extern doStuffPrototype doStuff;
、動作しますが、dlSym_doStuff = (doStuffPrototype) dlSym(lib_ptr, "doStuff");
コンパイルされません...
私は多くのことを試しました:これは可能ですか?