Out of Memory

ごめん、忘れてた。

目次

Blog 利用状況

ニュース

2008年7月1日
Microsoft MVP for Developer Tools - Visual C++ を再受賞しました。
2008年2月某日
MVPアワードがVisual C++に変更になりました。
2007年10月23日
blogタイトルを変更しました。
2007年7月1日
Microsoft MVP for Windows - SDKを受賞しました!
2007年6月20日
スキル「ニュース欄ハック」を覚えた!
2006年12月14日
記念すべき初エントリ
2006年12月3日
わんくま同盟に加盟しました。

カレンダー

中の人

aetos

顔写真

埼玉を馬鹿にする奴は俺が許さん。

基本的に知ったかぶり。興味を持った技術に手を出して、ちょっと齧りはするものの、それを応用して何か形にするまでは及ばずに飽きて放り出す人。

Microsoft MVP for Windows SDK July 2007 - February 2008, Microsoft MVP for Visual C++ February 2008 - June 2009
Microsoft MVP for Windows SDK
July 2007 - February 2008
Microsoft MVP for Visual C++
February 2008 - June 2009

アクセサリ

あわせて読みたい

e-Words

アフィリエイト

記事カテゴリ

書庫

日記カテゴリ

PEファイルの謎

PEファイルについて調べてます。
んで、わからないことが数点。

その1:隠しリンカオプション
VC++ 2008のリンカオプションはMSDNに一覧があるが、ここに書かれていないオプションが少なくとも一つある。
/INTEGRITYCHECKというのがそれで、これを指定してリンクすると、PEヘッダのIMAGE_OPTIONAL_HEADER.DllCharacteristicsにIMAGE_DLL_CHARACTERISTICS_FORCE_INTEGRITYビットが含まれる。
が、このファイルがどういうわけか実行できない。
このフラグは何のためにあるのだろう?

その2:セクション属性
PEファイル中のセクションの属性は、IMAGE_SECTION_HEADER構造体に含まれる。
こいつのCharacteristicsメンバに含まれるフラグのなかに、意味がよくわからないものがある。
列挙すると、IMAGE_SCN_NO_DEFER_SPEC_EXC、IMAGE_SCN_LNK_NRELOC_OVFL、IMAGE_SCN_MEM_DISCARDABLE、IMAGE_SCN_MEM_NOT_CACHED、IMAGE_SCN_MEM_NOT_PAGEDの5つ。
どれも、ビットが立っているとどういう挙動をするのかがよくわからない。
最初の2つは、どうすればこのビットが立つのかもわからない。

ご存知の方がいらっしゃいましたら、教えてくださると幸いです。
なお、現在、x86とx64アーキテクチャ上での、いわゆるDLLとEXEのみを対象として調べており、他のアーキテクチャ用だとか、「カーネルモードドライバでしか縁のないフラグ」とかには興味がありません。
ので、上に挙げたようなものが、もしそうしたものであったら、詳細なしでも構いません。

投稿日時 : 2008年1月27日 17:59

Feedback

# re: PEファイルの謎 2008/01/28 8:55 れい

ある程度知ってることもありますが。

この余白はそれを書くには狭すぎる。

というか、MSDNに書いてありませんか?
シャノンさんらしくもない。

とりあえず
IMAGE_SCN_MEM_DISCARDABLE
IMAGE_SCN_MEM_NOT_CACHED
IMAGE_SCN_MEM_NOT_PAGED
これはそのまんまです。説明にも書いてあるとおり。
指定されたセクションが破棄可能なメモリに置かれるか、キャッシュ不可におかれるか、ノンページ領域になるか、というだけです。
カーネルモードだとキャッシュされたりページングされるとかなり困るので、それを防ぐために使います、
ユーザーモードで有効かどうかしりません。
たとえ有効であっても、役に立つかは知りません。

IMAGE_SCN_NO_DEFER_SPEC_EXC
これは投機的命令実行に関するフラグで、
これが立ってると投機的命令実行を抑制したと思います。(たぶん。
メモリチェックツールでも作ってるのでなければ
立ててなくてOKです。

IMAGE_SCN_LNK_NRELOC_OVFL
これも書いてある通り。
こいつはリロケーションカウントが16ビットを超えたらIMAGE_SECTION_HEADER.NumberOfRelocationsに入らなくなるので、変わりにVirtualAddressに入れるよっていうフラグです。
リロケーションカウント増やしまくったらリンカが勝手に立ててくれます。

IMAGE_DLL_CHARACTERISTICS_FORCE_INTEGRITY
これはCode Integrityの話なのでよくわかりませんが、(最近の話は知らないのです…
署名検査を強制するのではないですか?
Signすれば実行できるんじゃないでしょうか?
Code Integrityのログでも見ればいいかと。
http://msdn2.microsoft.com/en-us/library/aa906262.aspx

# re: PEファイルの謎 2008/01/28 10:03 シャノン

> 指定されたセクションが破棄可能なメモリに置かれるか、

「メモリの破棄」って何スか?
昔は GlobalDiscard なんていう「メモリ破棄」関数がありましたが、VirtualXXX 関数には相当するものは無いと思いますし。
破棄可能メモリに置かれると、具体的にどうなるんでしょう?

> キャッシュ不可におかれるか、

これは今、VirtualProtect の説明を見ていて気がつきました。
たぶん PAGE_NOCACHE 属性がつくんだと思います。
後で試して見ます。
ただ、「メモリをキャッシュする」とはどういうことなのかがちょっとわかりません。
CPUキャッシュに置かず、常にメモリから読み込むということ?

> ノンページ領域になるか

ユーザーモードメモリにもページ領域とノンページ領域ってあるんでしたっけ?
あるとして、そのメモリがノンページ領域かどうかは、どうやって確かめられるんでしょう?

> 投機的命令実行を抑制したと思います。(たぶん。

スーパースカラとかアウトオブオーダー実行とかHyperThreadingとか、そういう関連の話?
このフラグを立てるリンカオプションは無いかなぁ…

> リロケーションカウント増やしまくったらリンカが勝手に立ててくれます。

試してみます。

> Signすれば実行できるんじゃないでしょうか?

できませんですたorz
オレオレ証明書(信頼済みストアには追加済み)じゃダメなのかな。

# re: PEファイルの謎 2008/01/28 10:04 シャノン

> この余白はそれを書くには狭すぎる。

いまさらフェルマーに気づくww

> というか、MSDNに書いてありませんか?

MSDN読んでもわかんなかったんですorz

# re: PEファイルの謎 2008/01/28 10:08 シャノン

> こいつはリロケーションカウントが16ビットを超えたらIMAGE_SECTION_HEADER.NumberOfRelocationsに入らなくなるので、変わりにVirtualAddressに入れるよっていうフラグです。

IMAGE_SECTION_HEADER.NumberOfRelocationsってPEでは使われないじゃんorz
ってことはIMAGE_SCN_LNK_NRELOC_OVFLもオブジェクトファイル専用フラグか。

# re: PEファイルの謎 2008/01/28 11:04 シャノン

#pragma section
http://msdn2.microsoft.com/en-us/library/50bewfwa.aspx
曰く、nopage、nocache、discard はいずれも
> useful for Win32 device drivers
だそうで。

ユーザーモードじゃ意味ないフラグと言うことにして片付けてしまおうかなぁ…

破棄可能なんて、カーネルモードメモリ関数にも見当たらないけどなぁ。

# re: PEファイルの謎 2008/01/28 13:39 れい

だから余白が足りないと言ってるのに(T-T

http://www.amazon.co.jp/Microsoft-Windows-Internals-Server-Pro-Developer/dp/0735619174
http://www.microsoft.com/whdc/system/cec/MemMgt.mspx

これらを参照してください。

# re: PEファイルの謎 2008/01/28 14:04 シャノン

うーん…
ユーザーモードに関与しない部分については「関与しません」の一言で満足するわけですが、それでも足りませんか。ということは関与するということですか。
挙げられた資料はどちらもカーネル寄りのものに見えるのですが。

# re: PEファイルの謎 2008/01/28 14:19 れい

> ということは関与するということですか。

通常は関与しないと思いますが。
絶対関与しません!と、言い切れるほど詳しく知りません。
悪魔の証明に近いですよね。それ。

神が光臨して
「ユーザーモードでもペケペケはモフモフに使えるのじゃ!」
と言ってくれる可能性もあるかと。

そんなのがあるなら私も知りたいです。

# re: PEファイルの謎 2008/01/28 15:49 シャノン

> 悪魔の証明に近いですよね。それ。

神だけでなく、Microsoftにも証明することができます。
Microsoftが出した資料があれば、誰にでも証明できます。

タイトル  
名前  
Url
コメント