2

重複の可能性:
異なるパラメーターを持つ関数を LD_PRELOAD することは可能ですか?

私は構造体を持っています。それをmy_structと呼びましょう。これは次のように宣言されています。

struct my_struct
{
 int a;
 int b;
}

なぜかそこに新しいフィールドを追加したいので、以下のように変更したいと思います。

struct my_struct
{
 int a;
 int b;
 int c;
}

共有オブジェクト ライブラリでこれを行うとします。その後、プログラムを実行するために LD_PRELOAD を実行します。私のプログラムは 2 番目の定義を使用しますか、それとも元の定義を使用しますか?

4

1 に答える 1

10

いいえ、元のコードは新しい定義を使用しません。もしそうなら、何を変えなければならないかを想像してみてください。まず、my_structヒープ上の各フィールドを拡張して、新しいフィールドを含める必要があります。これは、データ セクションのサイズを変更する必要があり、前方にシフトされたすべてのデータの参照を再配置する必要があることを意味します。sizeof struct my_structコンパイル時に評価される は、新しい定義と矛盾します。これらは、あなたがやろうとしていることを (少なくともあなたが試みている方法では) 不可能にする理由のほんの一部です。

古い定義に対してコンパイルおよびリンクされた元のコードは、引き続き古いmy_struct. 共有オブジェクト内の新しいコードはすべて、新しい定義に対してコンパイルされて使用されるため、cフィールドがあります。

元のプログラムがコンパイルされると、それは について何も知りませんmy_struct。その情報は、構造体メンバーにアクセスするためのオフセットを生成するためにコンパイラによって使用され、メモリ内でのレイアウト方法を知ることができます。情報がシンボルの形で利用できる可能性はありますが、これは定義の取得方法には影響しません。関数の解決とは異なり、コード/データの生成と構造体の解決は、厳密にはコンパイル時の操作です。

于 2012-06-03T17:32:22.073 に答える