0

いくつかの libc 関数 (例: puts()) を独自の実装でオーバーライドしようとしています。

次のように、dylib ファイルに独自の実装を定義しました。

int puts ( const char * str ); 

Xcode でバイナリを dylib ファイルにリンクしてビルドすると、オーバーライドされたバージョンが呼び出されます。

ただし、バイナリに dylib を挿入すると、オーバーライドされたバージョンが呼び出されないことがわかります。dylib のエントリ ポイントに何かを記録することで、dylib がロードされていることを確認しました。

ここで誰かが、オーバーライドされたバージョンを呼び出すために何をする必要があるかを教えてもらえますか?

4

1 に答える 1

2

リンクすると、ライブラリが libSystem.B.dylib よりも優先されるため、これは予想される動作です。

これを実行時に取得するには、関数の挿入を明示的に使用する必要があります。これがDYLDの大きな特徴です。ライブラリで、小さなセクションを作成します。

static const interpose_t interposing_functions[] \
    __attribute__ ((section("__DATA, __interpose"))) = {
        { (void *)my_puts,  (void *) puts  } 
    };
于 2012-11-13T13:13:32.490 に答える