ベストアンサー1
ソース コード (記述したもの) から実行可能コード (実行するもの) に至るまでには、(ほとんどの場合、解釈されたコードを除いて) 2 つの段階があります。
1 つ目は、ソース コードをオブジェクト モジュールに変換するコンパイルです。
2 番目のリンクは、オブジェクト モジュールを組み合わせて実行可能ファイルを形成するものです。
この区別は、とりわけ、ソース コードを表示せずにサード パーティ ライブラリを実行可能ファイルに含めること (データベース アクセス、ネットワーク通信、グラフィカル ユーザー インターフェイス用のライブラリなど) や、異なる言語 (C およびアセンブリ コードなど) でコードをコンパイルしてからそれらをすべてリンクすることを可能にするために行われます。
ファイルを静的に実行可能ファイルにリンクすると、そのファイルの内容がリンク時に取り込まれます。つまり、ファイルの内容は、実行する実行可能ファイルに物理的に挿入されます。
動的にリンクする場合、リンク先のファイルへのポインタ (たとえば、ファイルのファイル名) が実行ファイルに含まれ、リンク時にはそのファイルの内容は含まれません。これらの動的にリンクされたファイルは、後で実行ファイルを実行するときにのみ取り込まれ、ディスク上の実行ファイルではなく、メモリ内の実行ファイル コピーにのみ取り込まれます。
これは基本的に遅延リンクの方法です。さらに遅延する方法 (一部のシステムでは遅延バインディングと呼ばれます) もあり、これは実際に関数を呼び出そうとするまで動的にリンクされたファイルを取り込まない方法です。
静的にリンクされたファイルは、リンク時に実行可能ファイルに「ロック」されるため、変更されることはありません。実行可能ファイルによって参照される動的にリンクされたファイルは、ディスク上のファイルを置き換えるだけで変更できます。
これにより、コードを再リンクしなくても機能を更新できます。ローダーは実行するたびに再リンクします。
これには良い面と悪い面があります。一方では、更新やバグ修正が容易になりますが、他方では、更新に互換性がない場合にプログラムが動作しなくなる可能性があります。これは、動的にリンクされたライブラリを互換性のないものに置き換えるとアプリケーションが壊れる可能性があるという、一部の人が言及する恐ろしい「DLL 地獄」の原因となることがあります (ちなみに、これを行う開発者は、追跡され、厳しく罰せられることを覚悟しておく必要があります)。
例として、ユーザーがmain.c
静的リンクと動的リンク用にファイルをコンパイルする場合を見てみましょう。
Phase Static Dynamic
-------- ---------------------- ------------------------
+---------+ +---------+
| main.c | | main.c |
+---------+ +---------+
Compile........|.........................|...................
+---------+ +---------+ +---------+ +--------+
| main.o | | crtlib | | main.o | | crtimp |
+---------+ +---------+ +---------+ +--------+
Link...........|..........|..............|...........|.......
| | +-----------+
| | |
+---------+ | +---------+ +--------+
| main |-----+ | main | | crtdll |
+---------+ +---------+ +--------+
Load/Run.......|.........................|..........|........
+---------+ +---------+ |
| main in | | main in |-----+
| memory | | memory |
+---------+ +---------+
静的なケースでは、メイン プログラムと C ランタイム ライブラリがリンク時に (開発者によって) 一緒にリンクされていることがわかります。通常、ユーザーは実行可能ファイルを再リンクできないため、ライブラリの動作に縛られます。
動的の場合、メイン プログラムは C ランタイム インポート ライブラリ (動的ライブラリの内容は宣言しますが、実際には定義しません) にリンクされます。これにより、実際のコードがなくてもリンカーがリンクできるようになります。
次に、実行時に、オペレーティング システム ローダーは、メイン プログラムと C ランタイム DLL (ダイナミック リンク ライブラリ、共有ライブラリ、またはその他の命名法) との遅延リンクを実行します。
C ランタイムの所有者は、更新やバグ修正を提供するために、いつでも新しい DLL をドロップインできます。 前述したように、これには利点と欠点の両方があります。