[C]コンパイルとリンク
概要
Cでプログラムを書いて実行する場合、「コンパイル」と「リンク」の2つを行います。
これらが何をやっているのかしっかり理解していなかったので、自分なりにまとめてみました(なので本記事には真新しい内容はありません)。
全体的に直感的な説明をしているので正確ではないところがあるかもしれません。
コンパイルとオブジェクトファイル
まずはコンパイルが何をしているか、についてです。
コンパイルではオブジェクトファイルを作ります。
オブジェクトファイルには主に以下の情報が含まれます(他にもありますが割愛します)。
1 バイナリ化したコード
2 あるものリスト(本ファイルで定義されている関数)
3 欲しいものリスト(本フィルで参照している関数)
1についてですが、C言語で書かれたコードを、CPUが処理できるようにバイナリ化します。
2、3は他のファイルに定義された関数を参照する場合に使用します。2のリストの実態(関数定義そのもの)が1ですね。
リンク
次にリンクでは、主に以下を行います(あくまで説明であって、リンカの動作を正確に表現しているわけではありません)。
1 関数コードのアドレスの決定
2 関数呼び出しを関数コードが格納されたアドレスへのジャンプに置き換え
CPUの処理としては、関数呼び出しは、実行するコードのアドレスをその関数が格納されたアドレスに置き換えることです。
全てのオブジェクトファイルが揃ったら、実際に各関数のコードが格納されるアドレスが決めれらます。
アドレスが決まったら、関数呼び出しをそのアドレスへのジャンプに置き換えます。
この時、オブジェクトファイルの「あるものリスト」を利用します。
まとめ
コードのバイナリ化はもちろん、関数呼び出しでどこに飛んだら良いかを解決するのが大きな目的の一つになります。
なお、パブリック変数についても同様です。
最新記事
すべて表示概要 前回、コンパイルとリンクについて説明しました。 今回は、それを元にコンパイルエラーとリンクエラーについて説明します。 コンパイルエラー コンパイルで行われるのは 1 コードのバイナリ化 2 あるものリスト、欲しいものリストの作成...
Comments