2016-09-04 11 views
4

私の記事では、glibcソースコードのいくつかの機能を変更する必要があります。 私はpthreadの一部を変更する必要があります。たとえば、ソースコード内のpthread_create.cやpthread_mutex_lock.cなどのマルチスレッド関連の関数を変更しました。その後、私の具体的なプログラムが動作しているときに、これらの関数を使用する必要があるときに変更された関数を使用するように指定する必要があり、他の関数には影響しません。また、glibcのバージョン全体を指定したくないプログラムが実行中です。 この問題の解決策はありますか? ありがとうございます! DingC/C++ダイナミックリンクライブラリのオーバーロード

+5

標準機能を置き換えるのではなく、単に別の名前を使用するのはなぜですか? – Aganju

+0

特定のglibc関数のすべてのインスタンスを置き換え、他のインスタンスの実装を保持したいと思っていますか?その場合、置換された関数を含むSOからシンボルをロードするために、LD_PRELOADを使用して成功することができます。 –

+0

ご協力いただきありがとうございます。実際には、pthread関数内の特定のパラメータ、例えばシステムによって割り当てられたスレッドのidなどを取得する必要があります。関数内にルーチンを挿入し、変更されたglibcを再コンパイルした後、計測ツールを使用して、あなたが提案したように、私はpthread関数を書き直したいですが、glibcのソースコードの中で複雑な関係の呼び出しが止まってしまったので、glibc全体を再コンパイルしてlibpthread.soをプリロードしようとしましたが、うまくいきませんシステムglibcのバージョンが私のものと異なる場合は、私は混乱しています。 –

答えて

1

これは共有ライブラリインターポーザの仕事です。 Hereは優れた記事です。

関数が共有ライブラリにある場合、実行時リンカーは代わりに別の '介在'関数を呼び出すように指示できます。インターポーザは、機能を完全に置き換えることも、機能を拡張することもできます。 mallocファミリーの関数の大きな例は、メモリリーク検出器とヒープレポートツールは、ユーザープログラムとシステムコールの間に一連のインターポーザーを基にすることができます。

インターポーザーは共有(.so)ライブラリでのみ動作します。静的ライブラリ(.a)は実行可能ファイルに直接リンクし、呼び出しを簡単に傍受することはできません。

Linuxサポートのすべての主要な味は、LD_PRELOAD機能のために介在します。

Hereは、pthread_createのインターポーザーの一例です。

+0

あなたの助けをありがとう。実際には、システムによって割り当てられたスレッドのIDなど、pthread関数内の特定のパラメータを取得する必要があります。私は関数内にルーチンを挿入し、変更されたglibcを再コンパイルし、あなたが提案したように、私はpthread関数を書き直したいですが、私はglibcのソースコードの中で複雑な関係を呼び出すことによって止められました。私はglibc全体を再コンパイルし、libpthread.soだけをプリロードしようとしましたしかし、システムglibcのバージョンが私のものと違うとうまくいきません。混乱します。 –

+0

glibcはそのままの状態にしてください。 pthread_createの実装をとり、インターポーザーにコピーします。インターポーザのバージョンで、カスタムコードを追加します。機能が異なる場合は、新しい機能を作成してください。 my_pthread_createとインターポーザなしの通常のリンク。 –

関連する問題