2

Visual Studio 2008を使用していますが、この警告について質問があります。

ライブラリの1つで、「固定ベースアドレス」フラグ(/ FIXED)を設定し、固定ベースアドレスを定義しています。

コマンドで共有セクションを宣言します

#pragma comment(linker,"/SECTION:FOO,RWS") 
#pragma data_seg("FOO")

/ FIXEDフラグを削除すると、警告が表示されます

リンク:警告LNK4092:共有書き込み可能セクション「FOO」に再配置が含まれています。画像が正しく動作しない場合があります

このフラグを使用すると、実行可能ファイルからロードするときにdllが再配置される可能性があることを理解しています。今、私は理解していません。これらの共有セクションが再配置されないことが重要なのはなぜですか?それらのアドレスは、各プロセスで仮想ではありませんか?

再配置を許可し、共有セクションを持つ方法はありますか?ライブラリインターフェイスを変更した後、これに問題が発生しました。将来、開発者がこれらの結果を知らずにこのライブラリを変更した場合は、これを回避したいと思います。

これがどのように機能するかも興味があります。/ SECTIONフラグと4092警告のMSDNAページは、ここではあまり役に立ちません。

4

1 に答える 1

4

ここではKB137235が関連していると思います。基本的に、エラーは、セクション内の他のデータへのポインターなど、セクションがロードされているアドレスに依存するデータがセクションに含まれていることを示しています。セクションが再配置可能な場合、異なるインスタンスが同じ仮想アドレスにない可能性があるため、ポインターはそれらすべてに対して同時に有効になることはできません。

中長期的には、共有セクションを使用しないことが正しい解決策です。たとえば、次を参照してください。

于 2012-11-12T20:25:18.273 に答える