質問

1つのexeと3つのdllを備えた小さなテストソリューションがあり、Exeはそれぞれ3つのdllを呼び出します。私は設定しました build-> advanced-> dllベースアドレス DLL1.DLL、DLL2.DLL、DLL3.DLLの0x41000000、0x42000000、および0x43000000に設定します。私は走っています

ngen install ConsoleApplication1.exe

そして、これは3つのDLLとともにアプリケーションを正常にngenしました。私は本当にexeをngenしたくありませんでしたが、これまでのところ、これが結果を生み出す唯一の方法です。

実行時にVMMAPを使用して仮想アドレス空間を監視すると、NGENのDLLが仮想メモリの一貫した範囲内に座っていることがわかりますが、実行するたびにわずかに異なるアドレスにロードして、その範囲内でジャンプしています。彼ら。 VMMAPは、私が画像をロードしようとしているアドレスに割り当てられているものは何もないことを明らかにしているため、このびくびくする動作はアドレスの衝突によって引き起こされていません。

私はログを保持しています:

   Dll1       Dll2       Dll3
0x40140000 0x411D0000 0x42810000 
0x40580000 0x41EB0000 0x426B0000 
0x40190000 0x41FB0000 0x42380000 
0x40F30000 0x41FD0000 0x42050000 
0x409B0000 0x41BF0000 0x42910000 
0x408E0000 0x41860000 0x42050000 
0x40B50000 0x41280000 0x42A80000

アドレスの最初の2桁は、すべての実行にわたる3つのDLLすべてで一貫していることに注意してください。

私の実際の質問:これは成功の指標ですか? DLLが正確に0x41000000、0x42000000、0x43000000に座っていると思ったので、私は少し混乱しています。結果は、彼らがそのエリアの周りにぶら下がっていることを示していますが、実際に私が彼らに座るように頼んだところに座ることはありません。私の理解では、DLLが高価なリベッシング操作を受ける必要がないように、あなたが尋ねるアドレスに正確にロードされることを望んでいるということです(それは とても DLLがngen'd)場合は非常に高価です)。しかし、これはまさに何が起こっているのではありませんか?確かに、私のDLLは特定のエリアにぶら下がっていますが、彼らは私が彼らに座るように頼んだ場所に正確に座っていないので、確かに高価な再脱出操作は各実行時にPeformedされていますか?これはまさに私が避けたいものです。

注:RebasingとNgenの議論/反対に興味はありません。何が起こっているのか、どのようにそれを機能させるかを知りたいだけです。

乾杯そう!

役に立ちましたか?

解決

ASLR(アドレススペースレイアウトランダム化)になる可能性があります - からのリンクを確認してください http://social.msdn.microsoft.com/forums/en/vcgeneral/thread/bac7e300-f3df-4087-9c4b-847880d625ad

他のヒント

NGENツールは、アセンブリに作成されるバイナリ画像のベースアドレスの指定を制限していません。 AFAIK「優先ベースアドレス」をアセンブリ自体にコンパイルする必要があります。 http://msdn.microsoft.com/en-us/magazine/cc163610.aspx

編集 *

ただし、ローダーがモジュールを目的のアドレスに配置できない場合(別のモジュールまたは既にロードされたデータまたは割り当てされたデータと重複するため)、モジュールはリベースされます。つまり、他のアドレスにロードされます。これは、実行可能ファイル画像内のすべてのアドレスを修正する必要があることを意味します。

また、インターネットを見ると、多くの開発者がこの機能を望んでいるようですが、問題は他の開発者アセンブリと競合しない基本アドレスを予約することです。あなたが期待していたアドレスに座っている他のDLLは何ですか?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top