メモリの中身と実行ファイル

結局のところ。結局のところ、だ。 実行ファイル、とは、なんぞや。 てゆか、よく言われるヒープとかスタックとか、どこにあるんや。 あと、exeファイルにリソースを埋め込むってどこに埋め込んだんや。

気になったので、調べたり妄想してみたりしました。正確かどうかはわかりませんが。

上から順番に、ファイルで言うなら先頭の方、メモリで言うならアドレスの少ない方から昇順に参ります。

ヘッダー

これは、ファイルにだけあるもの。

UNIX系ならELFヘッダってのがあって、先頭の方にascii文字でELFって書いてあるらしい。

windowsだとなんかPEヘッダとかNEヘッダとか色々あってよく分からない。きもちわるい。 メモ帳で開くとThis program cannot bt run is DOS modeってのがあるので、見分けるのは簡単。

動作するアーキテクチャとか、サイズとかもろもろが入ってるみたい。 つまりはメタデータっすね。

コード部

プログラムの本体。機械言語でごりごり命令が書いてあるところ。テキスト領域、なんて呼び方もあるみたい。

ファイルならヘッダの後ろに書いてあって、メモリに読み込まれるのはここから先みたい。 先端からCPUが読みだして実行していく。

データ部

ファイルだろうとメモリだろうと、とりあえずコード部の次にあるやつ。静的領域なんて呼び名も。

プログラムが使う文字列とか、画像とか、そういうのを埋め込むところ。 リソースを埋め込むのはここっぽいね。

試しにバイナリエディタでnotepad.exeを開いてみたら、一番後ろにはXMLがベタって埋め込んでありました。なんてこった。

ヒープ

いよいよヒープだ。スタックでもあり、データ領域とも呼ぶようらしい。

ファイルにはなくて、メモリにだけある。ま、作業用の領域だしね。 こいつを頭(アドレスが小さい方)から読むとヒープ領域になって、尻尾(アドレスが大きい方)から読むとスタック領域になる。 ・・・うん、意味わからん。

どうやら領域を逆向きに読むことで共有しているようで。 なので配列の添字を無闇にでかくしてヒープを溢れると、スタック領域に触れてしまうらしい。 逆に、スタックオーバーフローってのはヒープ領域に届いてしまったってことみたいね。


参考: