いいえ、元のコードは新しい定義を使用しません。もしそうなら、何を変えなければならないかを想像してみてください。まず、my_struct
ヒープ上の各フィールドを拡張して、新しいフィールドを含める必要があります。これは、データ セクションのサイズを変更する必要があり、前方にシフトされたすべてのデータの参照を再配置する必要があることを意味します。sizeof struct my_struct
コンパイル時に評価される は、新しい定義と矛盾します。これらは、あなたがやろうとしていることを (少なくともあなたが試みている方法では) 不可能にする理由のほんの一部です。
古い定義に対してコンパイルおよびリンクされた元のコードは、引き続き古いmy_struct
. 共有オブジェクト内の新しいコードはすべて、新しい定義に対してコンパイルされて使用されるため、c
フィールドがあります。
元のプログラムがコンパイルされると、それは について何も知りませんmy_struct
。その情報は、構造体メンバーにアクセスするためのオフセットを生成するためにコンパイラによって使用され、メモリ内でのレイアウト方法を知ることができます。情報がシンボルの形で利用できる可能性はありますが、これは定義の取得方法には影響しません。関数の解決とは異なり、コード/データの生成と構造体の解決は、厳密にはコンパイル時の操作です。