トップ回答者
mapファイルに出力されるアドレスの固定方法

質問
-
Visual C++2005(2008,2010でも同様かと思います)にてソリューションをビルドしdllを生成すると、dll内の変数のアドレス情報がmapファイルに出力されます。このアドレスが、変数の追加・削除を行わなくても、ビルドを実行すると変わってしまうことがあります。
変数の追加・削除を行わない場合は、ビルドをしてもアドレスが変わらないようにしたいのですが、その方法はありますか?ご教授願います。
理由:
ある別アプリケーションからアドレスを指定してdll内の変数の値をモニタしているため、アドレスが変わってしまうと別アプリケーションのアドレス設定をし直す手間が発生してしまいます。
回答
-
>ビルドをしてもアドレスが変わらないようにしたい
参照したい変数や別アプリケーションの性質がよく分からないのですが、基本的に現実的ではありません。例えば、最初のうちはある特定のAddressでaccess出来ていたとしても、その後exeが肥大化したらAddressが変わる可能性があります。
また、OSによりMemory managementの仕組みが変わる可能性も考えられますね。
API等でそういった枠組みが用意されているのならよいのですが、残念ながら見当たりません。ASLR(Address Space Layout Randomization)が導入された経緯や背景から分かると思いますが、
addressの固定というのはsecurity上望ましいことではありません。対応するなら別の手段を検討された方が良いです。
例えば、named mapping objectなど共有メモリを利用する方法があります。
ただしこの場合、名前が被らないように配慮する必要があります。 -
accessしたいaddressをDLLがtemporary fileに書き出して、
別アプリケーションがそれを参照し、addressを確定する方法もダメですか?質問の要点は、
>アドレスが変わってしまうと別アプリケーションのアドレス設定をし直す手間が発生してしまいます。
この手間をなくしたい、ということですよね?>変数の追加・削除を行わない場合は、ビルドをしてもアドレスが変わらないようにしたい
変数の追加・削除を行わなくても、結局、Applicationによって読み込まれる他のDLLが確定できないため(OSや常駐Applicationの存在有無によっても異なる)、
直値によるaccessは無理でしょうね。確実ではない方法ですが、VirtualAllocでaddress指定をする方法があります。
でもこの方法を取るぐらいなら、named mapping objectの方がまだ安全です。ある特定の限られた状況であれば、以下の方法も取れそうですが、
その点が不確実なため私からは何とも言えません。[/FIXED (Fixed Base Address)]
http://msdn.microsoft.com/en-us/library/w368ysh2(v=VS.80).aspx[Need for Rebasing a DLL]
http://www.codeproject.com/KB/DLL/RebaseDll.aspx- 回答としてマーク 山本春海 2011年9月2日 5:05
すべての返信
-
>ビルドをしてもアドレスが変わらないようにしたい
参照したい変数や別アプリケーションの性質がよく分からないのですが、基本的に現実的ではありません。例えば、最初のうちはある特定のAddressでaccess出来ていたとしても、その後exeが肥大化したらAddressが変わる可能性があります。
また、OSによりMemory managementの仕組みが変わる可能性も考えられますね。
API等でそういった枠組みが用意されているのならよいのですが、残念ながら見当たりません。ASLR(Address Space Layout Randomization)が導入された経緯や背景から分かると思いますが、
addressの固定というのはsecurity上望ましいことではありません。対応するなら別の手段を検討された方が良いです。
例えば、named mapping objectなど共有メモリを利用する方法があります。
ただしこの場合、名前が被らないように配慮する必要があります。 -
accessしたいaddressをDLLがtemporary fileに書き出して、
別アプリケーションがそれを参照し、addressを確定する方法もダメですか?質問の要点は、
>アドレスが変わってしまうと別アプリケーションのアドレス設定をし直す手間が発生してしまいます。
この手間をなくしたい、ということですよね?>変数の追加・削除を行わない場合は、ビルドをしてもアドレスが変わらないようにしたい
変数の追加・削除を行わなくても、結局、Applicationによって読み込まれる他のDLLが確定できないため(OSや常駐Applicationの存在有無によっても異なる)、
直値によるaccessは無理でしょうね。確実ではない方法ですが、VirtualAllocでaddress指定をする方法があります。
でもこの方法を取るぐらいなら、named mapping objectの方がまだ安全です。ある特定の限られた状況であれば、以下の方法も取れそうですが、
その点が不確実なため私からは何とも言えません。[/FIXED (Fixed Base Address)]
http://msdn.microsoft.com/en-us/library/w368ysh2(v=VS.80).aspx[Need for Rebasing a DLL]
http://www.codeproject.com/KB/DLL/RebaseDll.aspx- 回答としてマーク 山本春海 2011年9月2日 5:05