BlankTar

about | blog | works | photo

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

気になったので、調べたり妄想してみたりしました。正確かどうかはわかりませんが。
上から順番に、ファイルで言うなら先頭の方、メモリで言うならアドレスの少ない方から昇順に参ります。

ヘッダー

これは、ファイルにだけあるもの。
UNIX系ならELFヘッダってのがあって、先頭の方にascii文字でELFって書いてあるらしい。
windowsだとなんかPEヘッダとかNEヘッダとか色々あってよく分からない。きもちわるい。
メモ帳で開くとThis program cannot bt run is DOS modeってのがあるので、見分けるのは簡単。

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

コード部

プログラムの本体。機械言語でごりごり命令が書いてあるところ。テキスト領域、なんて呼び方もあるみたい。
ファイルならヘッダの後ろに書いてあって、メモリに読み込まれるのはここから先みたい。
先端からCPUが読みだして実行していく。

データ部

ファイルだろうとメモリだろうと、とりあえずコード部の次にあるやつ。静的領域なんて呼び名も。
プログラムが使う文字列とか、画像とか、そういうのを埋め込むところ。
リソースを埋め込むのはここっぽいね。
試しにバイナリエディタでnotepad.exeを開いてみたら、一番後ろにはXMLがベタって埋め込んでありました。なんてこった。

ヒープ

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

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

参考:
アプリケーションとメモリの関係 - 徳島大学大学院ソシオテクノサイエンス研究部
メモリの4領域
< イーサネット関係のヘッダ pythonのデコレータを使ってお手軽ベンチマーク >