twitterで@mskwtさんとか@NyaRuRuさん(バカンス中なのにw)とかとDLLのrebase話について盛り上がってる。私も自分のお仕事で作っているライブラリ類はNT 3.1時代にrebaseの重要性を懇々と説かれたので、特に共有するようなDLLはもれなくrebaseしています。DLLって昔は数十くらいロードすればいいかってくらいだったけど、この前何気に数えたら、余計なランタイム込みで300近くになっていて驚きました。確か昔は256以上のdllをロードしようとすると失敗するようなKBがあったような。探せない。
ロード時間に関してはNT3.51とかの時代の資料だけど、Win32でrebaseしていないと、どれくらいDLLの読み込みにペナルティが発生するかという資料が公開されています。何も考えずに作っていると、みんな同じアドレスにロードしようとして、アドレスの再計算が発生するからシャレにならないよってことでした。あとmapファイル作っておけば、エラーが発生したアドレスのスタックトレースから、わかりやすくなるでしょう。
Content Removed (Windows)
このほかにも共有可能ページ量とか、連続したアドレスの確保などでペナルティがあると…。それを確認するにはVMMap。
VMMap
Vista以降はASLRを使いましょうと。他の*nix系OSでも使われているそうですね。
/DYNAMICBASE (ASLR (Address Space Layout Randomization) の使用)
Address Space Layout Randomization in Windows Vista - Michael Howard's Web Log - Site Home - MSDN Blogs