1. 序章

リンクとロードは、プログラムの実行において極めて重要な役割を果たす2つの手段です。 リンクは、アセンブラによって生成されたオブジェクトコードを組み合わせることにより、プログラムの実行可能モジュールを生成することを目的としています。 一方、ローダーは、これらの実行可能モジュールをメインメモリにロードして実行します。

このチュートリアルでは、これらの概念とその変形について説明します。

2. リンク

リンクとは、すべてのモジュールを接続するプロセス、またはプログラム実行用のプログラムの機能です。 複数のオブジェクトモジュールを取り、それを単一のオブジェクトファイルに結合します。 リンクエディタとも呼ばれるリンカは、アセンブラからオブジェクトモジュールを取得し、ローダーの実行可能ファイルを形成します。 したがって、名前が示すように、リンクとは、データとコードを1つのファイルに収集して維持するプロセスです。

オブジェクトモジュールのリンクは、コンパイル時とロード時の両方で行われます。 コンパイル時のリンクは、ソースコードがマシンコードに変換されるときに実行されます。 ロード時のリンクは、プログラムがローダーによってメモリにロードされている間に行われます。

リンクは、実行された時間に基づいて、静的リンクと動的リンクの2つのタイプに分類されます。

たとえば、上の図の静的リンクでは、各プログラムはコンパイル時に依存ライブラリにバインドします。 一方、ダイナミックリンクの場合、プログラムは共有ライブラリを使用し、これらのライブラリは実行時にプログラムにリンクされます。

2.1. 静的リンク

静的リンクは、プログラムのコンパイル時に実行されます。 オブジェクトファイルとコマンドライン引数のコレクションを受け取り、ロードおよび実行される完全にリンクされたオブジェクトファイルを生成します。

2.2. ダイナミックリンク

動的リンクは、が静的リンクの欠点を減らすことを目的としたもう1つの手法です。 静的リンクを使用すると、ユーザーはさまざまな実行可能ファイル間で繰り返される関数またはルーチンをコピーすることになります。 したがって、静的リンクは非効率的になります。 たとえば、ほぼすべてのプログラムに printf()関数が必要です。 したがって、そのコピーはすべての実行可能ファイルに存在し、仮想メモリとファイルシステムの両方のスペースを浪費します。

ダイナミックリンクアプローチでは、リンカはルーチンを実行可能ファイルにコピーしません。 プログラムがライブラリに依存していることに注意してください。 プログラムが実際に実行されると、リンカーは、プログラム内の関数呼び出しをディスクに存在する共有ライブラリにバインドします。

3. 読み込み中

ロードは、実行のためにセカンダリメモリからメインメモリにプログラムをロードするプロセスです。

動的ロードは、実行時にコンピュータプログラムがライブラリをメモリにロードし、変数と関数のアドレスを取得し、関数を実行し、プログラムをメモリからアンロードする手法です。 多くの場合、ソフトウェアプラグインを実装するために使用されます。 たとえば、Apache Webサーバーは、この手法を使用して、実行時に動的共有オブジェクト(*。dso)ファイルをロードします。

4. 読み込みと リンク

まず、リンクと読み込みの関係について説明します。

まず、アセンブラまたはコンパイラがソースプログラムをオブジェクトモジュールに変換します。 次に、リンカはこのオブジェクトモジュールと他のモジュールを使用して、リンクされたモジュールを準備します。 ローダーは、リンクされたモジュールを他のシステムライブラリとともに使用して、バイナリメモリイメージを生成します。 したがって、プログラム実行のプロセスでは、リンカーとローダーの両方のオファリングが使用されます。

一般に、プログラムは複数のモジュールで構成でき、プログラムの実行に基づいて、すべてのモジュールが同時にメモリに存在できるわけではありません。 動的ローディングは、オンデマンドでモジュールをロードする機能を提供します。

たとえば、Javaでは、 ClassLoader のインスタンスを使用して、クラスにアクセスする必要がある場合にクラスを動的にロードできます。 さらに、大規模なアプリケーションの場合、すべてのモジュールを同時にメモリにロードすることはできません。 したがって、動的負荷はそのような場合に便利な手法です。

ダイナミックリンクは非常によく似た方法で機能しますが、微妙な違いがあります。 アプリケーションモジュールはいくつかの機能で構成されており、これらが一緒になってモジュールが提供する機能を提供します。 ダイナミックリンクでは、関数定義が利用可能なシステムのライブラリへの参照を使用します。 関数定義が存在するライブラリに関する情報は、スタブに格納されます。

5. 結論

この簡単な記事では、コンピューターアプリケーションでのリンクとロードのさまざまな側面について説明しました。

リンクのプロセスとそのさまざまなタイプを紹介しました。 続いて、動的負荷のプロセスとその目的について説明しました。

最後に、動的ローディングと動的リンクの比較を提供しました。