アプリ版:「スタンプのみでお礼する」機能のリリースについて

高速化の為に/BASEオプションや defファイルなどで dll やプロセスのベースアドレスを設定する場合についてですが、これはどういう風にアドレスを設定すればいいのでしょうか?

例えばプログラムや dll がメモリにロードされる時に、マルチプロセスな OS 用のアプリケーション等の場合だと他にどんなモジュールがメモリに配置されているかは実行時じゃないとわかりませんよね?こういう場合はベースアドレスは普通設定しないものなのでしょうか?

それと、複数の同時に使用される可能性のある dll を作成する場合に、ベースアドレスを重ならないように設定するといいとのことですが、これは単純に "A.dll のベースアドレスに A.dll の大きさ(バイト)を足したものを B.dll のベースアドレスにする" みたいな感じでいいでしょうか?

それからもう1つ、高速であるべきモジュールを作成する時に、どうしても再配置によるオーバーヘッドを払いたくない場合、初期化時に、ソースコード中のアドレスを指定している部分を実行時のベースアドレスとオフセットによって書き換える、ということをしたらいいんじゃないかと思ったのですが、こんなことをするのは現実的ではないですか?(ロード時間がある程度かかるのは気にしないとして)

1つでも回答いただけたら嬉しいです。よろしくお願いします。

A 回答 (1件)

一応 MS 推奨のベースアドレスというのがあります。

昔 MSDN で見かけた情報なのですが、今調べても見つけられませんでした。確か rebase のツールの説明あたりから辿れたような気がしたのですが・・・。

大まかに言えば DLL のファイル名の先頭の文字で分類して、A-D は 0x60000000, E-G は 0x61000000 といった具合で 0x69000000 くらいまで使用していたと思います。もちろん、ご自分の DLL に lib1.dll, lib2.dll があれば、lib1 と lib2 がかぶらないように調節してください。

ちなみに、どんなモジュールが配置されるかは確かに分かりませんが、自分のプロセスに関して言えば OS の DLL(こいつらはベースアドレスが決まっています)と自分が使用している DLL だけを気にすれば十分です。というか、他に IME の DLL とかもロードされますが、そこまで含めてコントロールするのは現実的には難しいでしょう。

それから、使用するアドレス空間を算出するには EXE ファイルの構造を知らないといけませんが、実用上は rebase したときにその DLL がどこからどこまでを使用したかが表示されるので、次の DLL のベースアドレスはその後ろに持ってくるだけでオーケーです。

高速化についてのご質問は意図がよく分からないのでパスで。ロード時間がある程度かかるのが許容できるなら、別にロード時に再配置されたって構わないような気がしますが?
    • good
    • 0
この回答へのお礼

>>OS の DLL(こいつらはベースアドレスが決まっています)と自分が使用している DLL だけを気にすれば十分
>>次の DLL のベースアドレスはその後ろに持ってくるだけでオーケー

単純にならべるだけでOKなんですね!(64kbで区切るんでしたっけ)

高速化についてはちょっと勘違いしていたので忘れてください。
回答ありがとうございました!

お礼日時:2009/11/17 23:33

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!