カニゲーム攻略日記ブログ

beatmaniaIIDXやハースストーンなどのゲーム攻略日記。主にまったり勢。2016年にIIDX皆伝になった

プログラムはなぜ動くのか  第8章 ソースファイルから実行可能ファイルができるまで

メモ

目次

ソースファイルから実行可能ファイルができるまで

ネイティブコード

native:母国語
CPUにとっての母国語:ネイティブコード

ソースコード
↓ 翻訳
ネイティブコード
↓ 解釈・実行
CPU

ネイティブコードの中身は
ダンプ(16進数)すると確認できる

12 34 56 78 90 ab cd ef 12 34 56 78 90 ab cd ef
12 34 56 78 90 ab cd ef 12 34 56 78 90 ab cd ef

コンパイラ

ソースコード
ネイティブコードに
翻訳するのがコンパイラ

CPUが異なるとコンパイラも異なる

graph LR
    ソースコード --> x86用コンパイラ
    ソースコード --> PowerPC用コンパイラ
    x86用コンパイラ --> x86ネイティブコード
    PowerPC用コンパイラ --> PowerPCネイティブコード

コンパイラの種類を特定するキーワード

リンク

ネイティブコードだけでは実行できない

実行可能ファイルにするためには
リンクが必要

例:hello.cをコンパイルしてからリンク

ソースコードコンパイルしてオブジェクトファイル(ネイティブコード含む)を作成

bcc32 hello.c -o hello.obj

オブジェクトファイルをリンクして実行可能ファイルを作成

ilink32 hello.obj, hello.exe,, import32.lib cw32.lib

ライブラリファイル

上記の例の場合、 import32.libとcw32.libがライブラリファイル

リンク時に import32.libとcw32.libを指定しないとエラーになる

外部シンボル

他のオブジェクトファイルの中にある変数や関数

標準関数

標準ライブラリに含まれる関数
printfなど

DLL

WindowsではAPIのオブジェクトファイルを
DLL(Dynamic Link Library)に格納

ダイナミックの通り
プログラムの実行時に結合する

実行可能ファイル(exe)を実行

exeファイル(ディスク)
↓ コピー
メモリ
↓ 実行
CPU

exeファイルの構造

仮アドレス 再配置情報
0000 変数1
0001 変数2
0002 変数3
0003 関数1
0004 関数2
0005 関数3

メモリへコピー時に
実際のアドレスが割り当てられる

スタックとヒープ

実行可能ファイルを実行時、
メモリ領域に
スタックとヒープも作られる

  • メモリ領域
    • 再配置情報の変数(exeからコピー)
    • 再配置情報の関数(exeからコピー)
    • スタック(プログラム実行時に確保)
    • ヒープ (プログラム実行時に確保)

スタック:関数の内部で一時的に使用される変数や関数を格納。プログラマは意識しない

ヒープ:任意のデータを格納。プログラマが明示的に確保と解放を行う(mallocやfreeなど)。メモリリークに気を付けて