リンケージエディタ
リンケージエディタ(英: linkage editor)またはリンカ(英: linker)とは、機械語のプログラムの断片を結合し実行可能なプログラムを作成するプログラムのことである。例として、C言語では、ソースファイルをコンパイルするとオブジェクトファイルが生成される。それに他のオブジェクトファイルやライブラリを結合して1つの実行可能なプログラム(実行可能ファイル)が完成する。この結合(リンク)の際リンケージエディタが使われる。
日本語では「連係編集プログラム」[1]とも訳される。
リンクの種類
[編集]静的リンク
[編集]静的リンクは、リンク時に他のオブジェクトやライブラリをすべて1つのファイルに結合する方法。この方法では、出来上がったプログラムは、単独で動作することができる。単独で動作させなければならない組み込み向けプログラムなどでよく使われる。必要とされるすべてのライブラリを組み込むため、出来上がったプログラムはその分だけ大きくなる。
動的リンク
[編集]動的リンクは、リンク時にライブラリの参照を名前のみで解決してプログラムを作る方法。出来上がったプログラムにはライブラリの部分のプログラムは含まれないのが特徴である。そのプログラム実行時に、ライブラリ空間上の実際のプログラムと結合し、実行する(この作業は通常ローダと呼ばれるプログラムが行う)。出来上がったプログラムの大きさが小さくなる、プログラムを再度リンクしなくてもライブラリだけ入れ替えることができるなどの利点があり、現在広く使われている。
C言語の標準ランタイムライブラリのような汎用ライブラリは動的リンクするものの、ユーザー定義のライブラリは静的リンクする、あるいは汎用ライブラリは静的リンクするものの、ユーザー定義のライブラリは動的リンクする、両方動的リンクする、両方静的リンクする、といった組み合わせがあり、用途によって使い分けることもある。
リンクの処理(静的リンク)
[編集]静的リンクでは、おおむね以下の処理が行われる。
- ファイルの連結
- 分割コンパイルによってオブジェクトファイルが複数ある場合、連結して単体のファイルとする。
- ライブラリ内のファイルの連結
- ライブラリの関数を呼び出している場合は、ライブラリ内のオブジェクトファイルも連結される。
- OS固有コードの追加
- OSによって決められたスタートアップコードやメタ情報を追加する。
- アドレスの解決
- ソース内で使用した関数や変数の名前は、最終的にはすべてメモリアドレスに置き換えられる。リロケータブルなプログラムではこれはプログラム先頭等からの相対アドレスとなるが、プログラム全体のサイズがわかるまでは相対アドレスを決定する事はできないため、この処理はリンク時に実施される。
リンクの処理(動的リンク)
[編集]動的リンクにおいては、ローダをなんらかの方法で実行ファイルに加えなければならない。
- あらかじめ用意されているローダを静的リンクする。プログラマから見ると、インポートライブラリの静的リンクやリンケージエディタのオプション設定等の形となる。
- プログラマが、API等を直接呼び出してローダのコードを書く(この方式ではリンケージエディタは動的リンクに関与しない)。
処理系間の互換性
[編集]オブジェクトファイルの形式は処理系固有であり、他の処理系で作られたオブジェクトファイルを静的リンクする事は通常はできない。このため、コンパイラとリンケージエディタはセットで提供されている事が多い。
追加機能
[編集]処理系によっては、より高度な機能を実装している。
- インクリメンタルリンク
- 前回のリンクから変更のあった部分だけを対象とする事で、高速なリンク処理を行う機能。
- デバッガとの連携
- デバッガ用の補助情報を実行ファイルに含める機能。
主な実装
[編集]- ld (UNIX)
- GNU ld
- gold (リンカ)
- LLVM lld
- link.exe (Microsoft Visual C++)[2]
- mold[3]
脚注
[編集]出典
[編集]- ^ リンカ(リンケージエディタ / 連係編集プログラム)とは - 意味をわかりやすく - IT用語辞典 e-Words
- ^ MSVC linker reference | Microsoft Learn
- ^ Ueyama, Rui (2024-09-17), rui314/mold 2024年9月18日閲覧。