2

共有オブジェクトを作成し、LD_PRELOADを使用して最初にロードすることにより、関数を置き換えたとします。その関数のパラメーターを元のライブラリのパラメーターとは異なるものにすることは可能ですか?

たとえば、パラメータpthread_mutex_tの代わりにpthread_my_mutex_tを使用するように、 pthread_mutex_lockを置き換えた場合。出来ますか?

第二に、関数の他に、LD_PRELOADを使用して構造体宣言を変更することは可能ですか?たとえば、構造にもう1つのフィールドを追加できます。

4

3 に答える 3

4

変更した関数を提供するように手配することもできますがpthread_mutex_lock()、コードは標準関数を呼び出すようにコンパイルされています。これは、標準関数に渡されたパラメーターを使用して置換が呼び出されたときに問題を引き起こします。これは丁寧な言い方です。

  • クラッシュして燃えることを期待してください

プリロードされた関数は、置き換える関数と同じインターフェイス(同じ名前、同じ引数in、同じ値out)を実装する必要があります。内部は必要に応じて異なる方法で実装できますが、インターフェースは同じである必要があります。

構造物についても同様です。既存のコードは、1つの特定のレイアウトで、構造に1つのサイズを期待するようにコンパイルされました。最後にフィールドを追加することで解決できるかもしれませんが、置換されていないコードはおそらく正しく機能しません。拡張構造などではなく、元のサイズの構造にスペースを割り当てます。余分な要素自体にアクセスすることはありません。おそらく完全に不可能ではありませんが、動的に変化する構造サイズを処理するようにプログラムを設計している必要があります。これにより、「できない」という答えがおそらく適切であるように、いつ実行できるかについて十分に厳しい制約が課せられます。より単純な)。

IMNSHO、LD_PRELOADメカニズムは、緊急事態用です(また、特定の問題に対する一時的なバンドエイドです)。これは、リモートで定期的に使用することを計画する必要があるメカニズムではありません。

于 2012-06-03T16:32:59.097 に答える
2

LD_PRELOADは1つのことを実行し、1つのことだけを実行します。ld.soがシンボルを検索するために使用するリストの先頭に特定のDSOファイルを配置します。見つかった関数またはデータ項目をコードがどのように使用するかとは関係ありません。

LD_PRELOADで実行できることはすべて、リストの先頭にある-lを使用して置換ライブラリをリンクするだけでシミュレートできます。一方、その-lを使用してタスクを実行できない場合は、LD_PRELOADを使用してタスクを実行することはできません。

于 2012-06-03T16:28:29.647 に答える
0

あなたが説明していることの効果は、概念的には、通常のリンク時に不一致の外部関数を提供することの効果と同じです:未定義の動作。

火遊びではなく、これを実行したい場合は、置換関数もpthread_mutex_t *引数型として使用しpthread_my_mutex_t *、関数本体でポインターをに変換してみませんか?通常、この変換はソースレベルでのみ行われます。そのためのコードは生成されません。

于 2012-06-03T16:43:18.267 に答える