リンケージエディタ(リンカ)とは
リンケージエディタ、またはリンカとは、
コンパイラによって生成された複数の
機械語プログラムの断片(
オブジェクトファイル)を結合し、一つの実行可能なプログラムを生成する
ソフトウェアです。このプロセスは「リンク」と呼ばれ、プログラム開発の重要な段階です。
例えば、
C言語で作成したプログラムは、ソースファイルをコンパイルすることで
オブジェクトファイルが生成されます。これらの
オブジェクトファイルや、他の
ライブラリを結合して、最終的な実行可能ファイルを作成する際に、リンケージエディタが用いられます。リンケージエディタは、日本語では「連係編集プログラム」とも呼ばれます。
リンクの種類
リンクには大きく分けて、静的リンクと動的リンクの2種類があります。
静的リンク
静的リンクでは、プログラムの実行に必要なすべての
オブジェクトファイルや
ライブラリが、一つの実行可能ファイルに結合されます。この方式で生成されたプログラムは、単独で動作可能であり、組み込みシステムなど、独立して動作させる必要がある環境でよく利用されます。
静的リンクの利点は、必要な
ライブラリをすべて含んでいるため、プログラムの実行時に外部の
ライブラリに依存しないことです。しかし、その反面、実行ファイルのサイズが大きくなるという欠点があります。
動的リンク
動的リンクでは、プログラムの実行に必要な
ライブラリは、実行ファイルには組み込まれません。代わりに、
ライブラリへの参照情報のみが含まれます。プログラムの実行時に、ローダと呼ばれるプログラムが、必要な
ライブラリをメモリ上にロードし、プログラムと結合します。
動的リンクの利点は、実行ファイルのサイズを小さくできることと、
ライブラリを共有できることです。これにより、複数のプログラムが同じ
ライブラリを共有することで、メモリの使用量を削減できます。また、
ライブラリの修正や更新を行う際に、プログラムを再リンクする必要がないという利点もあります。
一般的に、
C言語の標準ランタイム
ライブラリなどの汎用的な
ライブラリは動的リンクされ、ユーザーが定義した
ライブラリは静的リンクされることが多いです。しかし、両方を動的リンクしたり、両方を静的リンクしたりするなど、プロジェクトの要件に応じて使い分けられます。
リンクの処理
静的リンクの処理
静的リンクでは、一般的に以下の処理が行われます。
1.
ファイルの連結: 複数の
オブジェクトファイルを結合し、一つのファイルにします。
2.
ライブラリ内のファイルの連結: プログラムが
ライブラリの関数を使用している場合、
ライブラリ内の
オブジェクトファイルも結合されます。
3.
OS固有コードの追加: OSが規定するスタートアップコードやメタ情報が追加されます。
4.
アドレスの解決: プログラム内で使用される関数や変数の名前は、最終的にメモリアドレスに置き換えられます。リロケータブルなプログラムの場合、これは相対アドレスになります。プログラム全体のサイズが確定するまで相対アドレスは確定できないため、この処理はリンク時に行われます。
動的リンクの処理
動的リンクでは、ローダをどのように実行ファイルに含めるかが重要です。
1.
ローダの静的リンク: あらかじめ用意されたローダを静的リンクする方法です。プログラマからは、インポート
ライブラリの静的リンクや、リンケージエディタのオプション設定という形で意識されます。
2.
ローダの直接呼び出し: プログラマが、APIなどを直接呼び出してローダのコードを作成する方法です。この場合、リンケージエディタは動的リンクには関与しません。
処理系間の互換性
オブジェクトファイルの形式は処理系に依存するため、異なる処理系で作成された
オブジェクトファイルを静的リンクすることは通常できません。そのため、
コンパイラとリンケージエディタはセットで提供されることが多いです。
追加機能
処理系によっては、以下の高度な機能が実装されています。
インクリメンタルリンク: 前回のリンクからの変更部分のみを対象とする高速なリンク機能です。
デバッガとの連携:
デバッグに必要な補助情報を実行ファイルに含める機能です。
主な実装
代表的なリンケージエディタには、以下のようなものがあります。
`ld` (UNIX系OS)
`GNU ld`
`gold` (リンカ)
`
LLVM lld`
`link.exe` (Microsoft Visual C++)
`mold`
まとめ
リンケージエディタは、
ソフトウェア開発における重要な役割を担っています。プログラムの断片を結合し、実行可能なプログラムを生成することで、複雑な
ソフトウェアの開発を可能にしています。静的リンクと動的リンクの適切な使い分けは、プログラムの効率と柔軟性を向上させるために不可欠です。