静的リンクと動的リンクの違い:ライブラリの結合方法を比較
リンクは、コンパイルしたコードを、それが使うライブラリのコードと結び付ける作業です。静的リンクでは、必要なライブラリのコードをビルド時に実行ファイルへコピーするので、プログラムだけで完結します。動的リンクでは、実行ファイルは必要な共有ライブラリを記録するだけで、プログラムの起動時にOSがそれらを読み込むので、多くのプログラムが1つのコピーを共有できます。静的は配布が簡単で、動的はメモリを節約でき、更新もしやすくなります。
| 項目 | 静的リンク | 動的リンク |
|---|---|---|
| いつ行うか | ビルド時。ライブラリのコードを実行ファイルにコピーする | ロード時や実行時。動的リンカーが共有ライブラリ(.so、.dll)を探してマップする |
| 実行ファイルの大きさ | 大きい | 小さい |
| メモリの使用量 | 各プログラムが、ライブラリのコードのコピーを持つ | 共有ライブラリの1つのコピーを、多くのプロセスで共有できる |
| 更新とセキュリティの修正 | プログラムを作り直して配り直す必要がある | ライブラリを1回更新すれば、作り直さなくても効果が出る(インターフェースに互換性があれば) |
| 起動時間 | やや速い | やや遅い。シンボルの解決が必要(遅延させることが多い) |
| 配布 | 自己完結。ライブラリがインストールされていなくても動く | 対象のシステムに正しいバージョンのライブラリが必要。なければ起動に失敗する |
| 実行時のコスト | プログラム全体の最適化と直接の呼び出しができる | GOTやPLTを通る間接呼び出しで、わずかな負荷がある |
| バージョンの問題 | 実行時にはない | プログラムと、インストールされたライブラリの不一致が起こりうる |
| 主な用途 | 組み込みのファームウェア、単一ファイルのツール、最小構成のコンテナ | 汎用OS上のほとんどのプログラム、プラグイン、libcなどのシステムのライブラリ |
数値は代表的な目安で、世代や製品によって異なります。