メモリの中身と実行ファイル
結局のところ。結局のところ、だ。 実行ファイル、とは、なんぞや。 てゆか、よく言われるヒープとかスタックとか、どこにあるんや。 あと、exeファイルにリソースを埋め込むってどこに埋め込んだんや。
気になったので、調べたり妄想してみたりしました。正確かどうかはわかりませんが。
上から順番に、ファイルで言うなら先頭の方、メモリで言うならアドレスの少ない方から昇順に参ります。
ヘッダー
これは、ファイルにだけあるもの。
UNIX系ならELFヘッダってのがあって、先頭の方にascii文字でELFって書いてあるらしい。
windowsだとなんかPEヘッダとかNEヘッダとか色々あってよく分からない。きもちわるい。
メモ帳で開くとThis program cannot bt run is DOS mode
ってのがあるので、見分けるのは簡単。
動作するアーキテクチャとか、サイズとかもろもろが入ってるみたい。 つまりはメタデータっすね。
コード部
プログラムの本体。機械言語でごりごり命令が書いてあるところ。テキスト領域、なんて呼び方もあるみたい。
ファイルならヘッダの後ろに書いてあって、メモリに読み込まれるのはここから先みたい。 先端からCPUが読みだして実行していく。
データ部
ファイルだろうとメモリだろうと、とりあえずコード部の次にあるやつ。静的領域なんて呼び名も。
プログラムが使う文字列とか、画像とか、そういうのを埋め込むところ。 リソースを埋め込むのはここっぽいね。
試しにバイナリエディタでnotepad.exeを開いてみたら、一番後ろにはXMLがベタって埋め込んでありました。なんてこった。
ヒープ
いよいよヒープだ。スタックでもあり、データ領域とも呼ぶようらしい。
ファイルにはなくて、メモリにだけある。ま、作業用の領域だしね。 こいつを頭(アドレスが小さい方)から読むとヒープ領域になって、尻尾(アドレスが大きい方)から読むとスタック領域になる。 ・・・うん、意味わからん。
どうやら領域を逆向きに読むことで共有しているようで。 なので配列の添字を無闇にでかくしてヒープを溢れると、スタック領域に触れてしまうらしい。 逆に、スタックオーバーフローってのはヒープ領域に届いてしまったってことみたいね。
参考: