途中ちょくちょくEmacsが落ちる。(Windows7)
PE
DOSと混在して実行される場合があるので、頭に This program cannot be run in DOS modeって頭につけて、DOSで動かした場合にエラーになるように仕向けてある。
ファイルを見ただけでは何用のファイルか分からない。
40-7F
ファイルの先頭MZ(000)→3C→80からプログラムを読み込む
すべてのOSのバイナリがいきなりreturnして終了できるとは限らない
unused DOSヘッダが8の倍数で収まらなかった場合のときにpaddingで帳尻を合わせている
大前提 実行ファイルはプログラムとデータから構成される
ヘッダがいろいろあってめんどくさそう(v6はヘッダがすごいシンプルであった)
8バイトのアラインメント
コンピュータなどにおいて、サイズが2バイト・4バイト……のデータが、アドレスが2の倍数・4の倍数……の丁度に位置に来るように調整すること。 それがunused
COFF File HeaderのFieldが不明
Unixシステムで用いられる実行ファイル、オブジェクトファイル、共有ライブラリのファイルフォーマット仕様
PEはCOFFの後継。
シンボル=名前。DLLで関数を動的に読み込むときは名前を持っておかないと呼べない。
32bit版と64bit版でオプショナルヘッダが違う
ファイルヘッダは一緒。
Machine TypesのIMAGE_FILE_MACHINE_AMD64は0x8664で決め打ち。
セクション
動的に決められる。IMAGE_SECTION_HEADERはセクションの数だけある。
データがあるならIMAGE_SECTION_HEADERは2つとなり、つまり可変である。
セクション=テキスト+データの他に、いろいろある。デバッグ用セクション、グローバル変数など
- text
- data(読み込みしかできないやつはrdataになるとか)
- bss
セクション名は自由につけられる。
Characteristicsにフラグを立てて、ファイルの属性を決定できる
- IMAGE_SECTION_HEADER
IMAGE_OPTIONAL_HEADERは固定値
SectionAlignment FileAlignment
- SectionAlignment(4096 4KB)
text data bss 各セクションは4KB単位
FileAgnment(512B)
- ファイル上のアラインメント
- 512はセクターのサイズ
- 区切り
File→Memory
ヘッダを読み込んでメモリに書き込み、必要になった時点でデータをメモリに読み込む。これをオンデマンドページングというが、それを実現しやすくするためにデータをアラインメントしている。
これはCOFFにはなくって、COFFを拡張したもの。
- Windows8 on Windows7での実行
(仮想マシンかどうかをチェックしている)
メモリ
ImageBase 先頭のアドレスの場所。そこから相対アドレスでBaseOfCodeとかBaseOfDataのアドレスの場所が指定されている。
RelativeVirtualAddress
相対仮想アドレス(RVA)は、標準的な仮想アドレスと混同してはならない。相対仮想アドレスはメモリにロードされたオブジェクトの仮想アドレスから、ファイルイメージのベースアドレスを引いたものである。