3

共有ライブラリを 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");コンパイルされません...

私は多くのことを試しました:これは可能ですか?

4

1 に答える 1

0

それは明らかです

typedef int (*doStuffPrototype) (int, void*);

typedef int (doStuffPrototype) (int, void*);

わずかに異なる を作成しますtypedef

私の提案は、2 つtypedefの異なる を作成し、それぞれを適切に使用することです。

typedef int (doStuffPrototype) (int, void*);
typedef doStuffPrototype* doStuffPrototypePtr

そして、それらを次のように使用します。

extern doStuffPrototypePtr dlSym_doStuff;
extern doStuffPrototype doStuff;

...


dlSym_doStuff = (doStuffPrototypePtr) dlSym(lib_ptr, "doStuff");
于 2014-06-19T19:40:47.740 に答える