私の記事では、glibcソースコードのいくつかの機能を変更する必要があります。 私はpthreadの一部を変更する必要があります。たとえば、ソースコード内のpthread_create.cやpthread_mutex_lock.cなどのマルチスレッド関連の関数を変更しました。その後、私の具体的なプログラムが動作しているときに、これらの関数を使用する必要があるときに変更された関数を使用するように指定する必要があり、他の関数には影響しません。また、glibcのバージョン全体を指定したくないプログラムが実行中です。 この問題の解決策はありますか? ありがとうございます! DingC/C++ダイナミックリンクライブラリのオーバーロード
答えて
これは共有ライブラリインターポーザの仕事です。 Hereは優れた記事です。
関数が共有ライブラリにある場合、実行時リンカーは代わりに別の '介在'関数を呼び出すように指示できます。インターポーザは、機能を完全に置き換えることも、機能を拡張することもできます。 mallocファミリーの関数の大きな例は、メモリリーク検出器とヒープレポートツールは、ユーザープログラムとシステムコールの間に一連のインターポーザーを基にすることができます。
インターポーザーは共有(.so)ライブラリでのみ動作します。静的ライブラリ(.a)は実行可能ファイルに直接リンクし、呼び出しを簡単に傍受することはできません。
Linuxサポートのすべての主要な味は、LD_PRELOAD機能のために介在します。
Hereは、pthread_createのインターポーザーの一例です。
あなたの助けをありがとう。実際には、システムによって割り当てられたスレッドのIDなど、pthread関数内の特定のパラメータを取得する必要があります。私は関数内にルーチンを挿入し、変更されたglibcを再コンパイルし、あなたが提案したように、私はpthread関数を書き直したいですが、私はglibcのソースコードの中で複雑な関係を呼び出すことによって止められました。私はglibc全体を再コンパイルし、libpthread.soだけをプリロードしようとしましたしかし、システムglibcのバージョンが私のものと違うとうまくいきません。混乱します。 –
glibcはそのままの状態にしてください。 pthread_createの実装をとり、インターポーザーにコピーします。インターポーザのバージョンで、カスタムコードを追加します。機能が異なる場合は、新しい機能を作成してください。 my_pthread_createとインターポーザなしの通常のリンク。 –
- 1. c-codeをダイナミックリンクライブラリにコンパイル
- 2. メイクファイルを使用したダイナミックリンクライブラリ
- 3. C++でのダイナミックリンクライブラリについて
- 4. GmailApp.sendEmail CC、CCが受信しない
- 5. アドビアニメイトCC
- 6. データベースにダイナミックリンクライブラリ(DLL)を保存する
- 7. アドビアニメイトCCダイナミックテキストナルエラー
- 8. GNU CCとWindows
- 9. iPhone - CC Avenue
- 10. Python sendmail with Cc
- 11. は、CCアドレス
- 12. 複数のCCにCCを送信しますか?
- 13. Adode CCのcreatejsティッカーの例
- 14. C++オーバーロード:[] []演算子のオーバーロード
- 15. アニメーションCCキャンバスとマスキング
- 16. Photoshop CCバッチアクションTinyPNGプラグイン
- 17. cc:言語CCが認識されない
- 18. アニメーションのCreateJS JavasScriptフレームスクリプティングCC
- 19. InDesignのCCイメージキャプション番号バグ
- 20. Adobe AnimateのAS3 CC
- 21. CCスプライトの追加とアクセス
- 22. YouTubeのiframeタグでCC
- 23. JavaScriptアニメーションCCアニメーションの制御
- 24. omp flushとcc-NUMAのアーキテクチャ
- 25. アドビアニメイトCCの2017 - 私は、オーディオ
- 26. Adobe Animate CCのHTMLフォーム
- 27. CCの検証(LuhnFormula)エラー
- 28. アニマルCC 2017のドラッグ&ドロップ
- 29. ccライセンス属性の実装
- 30. C++のダイナミックリンクライブラリのmainメソッドを無視する方法
標準機能を置き換えるのではなく、単に別の名前を使用するのはなぜですか? – Aganju
特定のglibc関数のすべてのインスタンスを置き換え、他のインスタンスの実装を保持したいと思っていますか?その場合、置換された関数を含むSOからシンボルをロードするために、LD_PRELOADを使用して成功することができます。 –
ご協力いただきありがとうございます。実際には、pthread関数内の特定のパラメータ、例えばシステムによって割り当てられたスレッドのidなどを取得する必要があります。関数内にルーチンを挿入し、変更されたglibcを再コンパイルした後、計測ツールを使用して、あなたが提案したように、私はpthread関数を書き直したいですが、glibcのソースコードの中で複雑な関係の呼び出しが止まってしまったので、glibc全体を再コンパイルしてlibpthread.soをプリロードしようとしましたが、うまくいきませんシステムglibcのバージョンが私のものと異なる場合は、私は混乱しています。 –