リンケージエディタ
リンケージエディタ(リンカ(linker)、連係編集プログラムとも)とは機械語のプログラムの断片を結合し実行可能なプログラムを作成するプログラムのことである。例として、C言語では、ソースファイルをコンパイルするとオブジェクトファイルが生成される。それに他のオブジェクトファイルやライブラリを結合して1つのプログラムが完成する。この結合(リンクという)の際リンケージエディタが使われる。
リンクの種類
静的リンク
静的リンクは、リンクを行なうとき、他のオブジェクトやライブラリをすべて1つのファイルに結合する方法。この方法では、出来上がったプログラムは、単独で動作することができる。単独で動作させなければならない、組み込み向けプログラムなどでよく使われる。そのかわり、必要とされるすべてのライブラリを組み込むため、出来上がったプログラムはその分だけ大きくなる。
動的リンク
動的リンクは、リンクを行なうとき、ライブラリの参照を、名前のみで解決してしまい、プログラムを作る方法。出来上がったプログラムにはライブラリの部分のプログラムは含まれないのが特徴である。そのプログラム実行時に、ライブラリ空間上の実際のプログラムと結合し、実行する(この作業は通常ローダと呼ばれるプログラムで行なわれる)。出来上がったプログラムの大きさが小さくなる、プログラムを再度リンクしなくてもライブラリだけ入れ替えることができるなどの利点があり、現在広く使われている。
リンクの処理(静的リンク)
静的リンクでは、おおむね以下の処理が行われる。
- ファイルの連結
- 分割コンパイルによってオブジェクトファイルが複数ある場合、連結して単体のファイルとする。
- ライブラリ内のファイルの連結
- ライブラリの関数を呼び出している場合は、ライブラリ内のオブジェクトファイルも連結される。
- OS固有コードの追加
- OSによって決められたスタートアップコードやメタ情報を追加する。
- アドレスの解決
- ソース内で使用した関数や変数の名前は、最終的にはすべてメモリアドレスに置き換えられる。リロケータブルなプログラムではこれはプログラム先頭等からの相対アドレスとなるが、プログラム全体のサイズがわかるまでは相対アドレスを決定する事はできないため、この処理はリンク時に実施される。
リンクの処理(動的リンク)
動的リンクにおいては、ローダをなんらかの方法で実行ファイルに加えなければならない。
- あらかじめ用意されているローダを静的リンクする。プログラマから見ると、インポートライブラリの静的リンクやリンケージエディタのオプション設定等の形となる。
- プログラマが、API等を直接呼び出してローダのコードを書く(この方式ではリンケージエディタは動的リンクに関与しない)。
処理系間の互換性
オブジェクトファイルの形式は処理系固有であり、他の処理系で作られたオブジェクトファイルを静的リンクする事は通常はできない。このため、コンパイラとリンケージエディタはセットで提供されている事が多い。
追加機能
処理系によっては、より高度な機能を実装している。
- インクリメンタルリンク
- 前回のリンクから変更のあった部分だけを対象とする事で、高速なリンク処理を行う機能。
- デバッガとの連携
- デバッガ用の補助情報を実行ファイルに含める機能。