top of page

[C]コンパイルとリンク


概要

Cでプログラムを書いて実行する場合、「コンパイル」と「リンク」の2つを行います。

これらが何をやっているのかしっかり理解していなかったので、自分なりにまとめてみました(なので本記事には真新しい内容はありません)。

全体的に直感的な説明をしているので正確ではないところがあるかもしれません。



コンパイルとオブジェクトファイル

まずはコンパイルが何をしているか、についてです。


コンパイルではオブジェクトファイルを作ります。

オブジェクトファイルには主に以下の情報が含まれます(他にもありますが割愛します)。


1 バイナリ化したコード

2 あるものリスト(本ファイルで定義されている関数)

3 欲しいものリスト(本フィルで参照している関数)


1についてですが、C言語で書かれたコードを、CPUが処理できるようにバイナリ化します。

2、3は他のファイルに定義された関数を参照する場合に使用します。2のリストの実態(関数定義そのもの)が1ですね。



リンク

次にリンクでは、主に以下を行います(あくまで説明であって、リンカの動作を正確に表現しているわけではありません)。


1 関数コードのアドレスの決定

2 関数呼び出しを関数コードが格納されたアドレスへのジャンプに置き換え


CPUの処理としては、関数呼び出しは、実行するコードのアドレスをその関数が格納されたアドレスに置き換えることです。

全てのオブジェクトファイルが揃ったら、実際に各関数のコードが格納されるアドレスが決めれらます。

アドレスが決まったら、関数呼び出しをそのアドレスへのジャンプに置き換えます。

この時、オブジェクトファイルの「あるものリスト」を利用します。




まとめ

コードのバイナリ化はもちろん、関数呼び出しでどこに飛んだら良いかを解決するのが大きな目的の一つになります。

なお、パブリック変数についても同様です。

最新記事

すべて表示

[C]コンパイルエラーとリンクエラー

概要 前回、コンパイルとリンクについて説明しました。 今回は、それを元にコンパイルエラーとリンクエラーについて説明します。 コンパイルエラー コンパイルで行われるのは 1 コードのバイナリ化 2 あるものリスト、欲しいものリストの作成...

Comments


カテゴリ

あなたの買い物をサポートする
アプリ Shop Plan

iphone6.5p2.png

​いつ何を買うかの計画を立てられるアプリです。

google-play-badge.png
Download_on_the_App_Store_Badge_JP_RGB_blk_100317.png

靴を大切にしよう!靴管理アプリ SHOES_KEEP

納品:iPhone6.5①.png

靴の履いた回数、お手入れ回数を管理するアプリです。

google-play-badge.png
Download_on_the_App_Store_Badge_JP_RGB_blk_100317.png

「後で読む」を忘れないアプリ ArticleReminder

気になった​Webサイトを登録し、指定時刻にリマインダを送れるアプリです

google-play-badge.png
Download_on_the_App_Store_Badge_JP_RGB_blk_100317.png
bottom of page