メモ
目次
ソースファイルから実行可能ファイルができるまで
ネイティブコード
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ネイティブコード
コンパイラの種類を特定するキーワード
- プログラミング言語
- CPU
- OS
リンク
ネイティブコードだけでは実行できない
実行可能ファイルにするためには
リンクが必要
例: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など)。メモリリークに気を付けて