1. ホーム
  2. c#

[解決済み】「静的リンク」「動的リンク」の意味とは?

2022-04-03 08:55:38

質問

静的にリンクされた」「動的にリンクされた」という言葉をよく耳にします。 C , C++ または C# . これらは一体何なのか、何について話しているのか、そして何にリンクしているのか?

どうやって解決するの?

ソースコード(書いたもの)から実行コード(実行するもの)になるには、(インタプリタ型コードを除けば)ほとんどの場合、2つの段階があります。

1つ目はコンパイルで、ソースコードをオブジェクトモジュールに変換します。

2つ目のリンクは、オブジェクト・モジュールを結合して実行ファイルを形成するものです。

この区別は、特に、サードパーティのライブラリをソースコードを見ることなく実行ファイルに含めることができるようにするため(データベースアクセス、ネットワーク通信、グラフィカルユーザーインターフェースのためのライブラリなど)、あるいは異なる言語のコード(例えばCとアセンブリコード)をコンパイルして、それらをすべてリンクするために行われるものである。

あなたが 静的 ファイルを実行ファイルにリンクする場合、そのファイルのコンテンツはリンク時に含まれます。言い換えれば、ファイルの内容は、実行する実行ファイルに物理的に挿入されます。

リンクするとき 動的に の場合、リンク先のファイルへのポインタ(ファイルのファイル名など)が実行ファイルに含まれ、リンク時には当該ファイルの内容は含まれません。それは、後で 実行 また、これらのファイルはディスク上のものではなく、実行可能ファイルのインメモリコピーにのみ組み込まれます。

基本的にはディファード・リンクという方法です。さらに より は、実際にその中の関数を呼び出そうとするまで、ダイナミックリンクされたファイルを取り込まないという、遅延方法(システムによってはレイトバインディングと呼ばれます)です。

静的にリンクされたファイルは、リンク時に実行ファイルに「ロック」されるため、決して変更されることはありません。 実行ファイルから参照される動的リンクされたファイルは、ディスク上のファイルを置き換えるだけで変更可能です。

このため、コードを再リンクすることなく、機能の更新が可能です。ローダーは実行するたびに再リンクします。

これは良いことでもあり悪いことでもあります。一方ではアップデートやバグフィックスが容易になる一方で、アップデートに互換性がないとプログラムが動作しなくなる可能性があります。これは、一部の人が言及する、ダイナミックリンクされたライブラリを互換性のないものに置き換えるとアプリケーションが壊れるという恐ろしい「quot; DLL hell"」の原因でもあります(ところで、これを行う開発者は追い詰められて厳しく罰せられると思って下さい)。


として をコンパイルする場合を見てみましょう。 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をドロップインすることができます。前述したように、これにはメリットとデメリットの両方があります。