ダイナミックリンカーは、実行可能ファイルの実行前または実行中に、実行可能ファイル用のダイナミックライブラリをロードしてリンクするオペレーティングシステムの機能です。詳細はオペレーティングシステムによって異なりますが、一般的に、ダイナミックリンカーは各ライブラリの内容を永続ストレージからRAMにコピーし、ジャンプテーブルを埋め、ポインタを再配置します。
リンクとは、実行可能ファイルがコンパイルされる際に実行されるプロセスを指すことが多い一方、ダイナミックリンカーは、外部共有ライブラリを実行中のプロセスにロードし、それらの共有ライブラリを実行中のプロセスに動的にバインドするオペレーティングシステムの特殊な部分です。この方法は、遅延リンクとも呼ばれます。
ダイナミックリンクライブラリ(DLL)は、Microsoft WindowsおよびOS/2オペレーティングシステムにおける共有ライブラリの概念をMicrosoftが実装したものです。これらのライブラリは通常、ファイル拡張子が.dll 、 ( ActiveXコントロールを含むライブラリの場合)、または(レガシーシステムドライバの場合)となります。DLLのファイル形式は、Windows EXEファイルと同じで、32ビットおよび64ビットWindowsの場合はポータブル実行可能ファイル(PE) 、16ビットWindowsの場合は新規実行可能ファイル(NE)です。EXEと同様に、DLLにはコード、データ、リソースを任意の組み合わせで含めることができます。DLLOCXDRV
DLL と同じファイル形式だが、ファイル拡張子が異なり、リソースセクションのみを含むデータファイルは、リソース DLL と呼ばれることがある。このような DLL の例としては、拡張子を持つ多言語ユーザーインターフェイスライブラリ、拡張子を持つこともあるアイコンライブラリ、拡張子とを持つフォントファイルなどがある。[ 1 ]MUIICLFONFOT
ほとんどのUnix系システムでは、動的リンカを構成するマシンコードの大部分は、実際には外部実行ファイルであり、オペレーティングシステムカーネルがexec最初にロードして、関数呼び出しの結果として新たに構築されたプロセスアドレス空間で実行しますposix_spawn。リンク時には、使用すべき動的リンカのパスが実行イメージに埋め込まれます。
実行可能ファイルがロードされると、オペレーティングシステムのカーネルはそこからダイナミックリンカのパスを読み取り、その別の実行可能バイナリをロードして実行しようとします。例えば、そのパスにファイルが存在しないなどの理由でこの試みが失敗すると、元の実行可能ファイルの実行も失敗します。その後、ダイナミックリンカは最初の実行可能イメージと、それが依存するすべての動的リンクライブラリをロードし、実行可能ファイルを起動します。結果として、ダイナミックリンカのパス名はオペレーティングシステムのアプリケーションバイナリインターフェースの一部となります。
Solaris、64ビット版HP-UX、Linux、FreeBSD、NetBSD、OpenBSD、DragonFly BSDなど、実行可能イメージと動的ライブラリにELFを使用するUnix系システムでは、使用すべき動的リンカーのパスがリンク時に実行可能ファイルのセグメントのセクションに埋め込まれます。これらのシステムでは、動的にロードされた共有ライブラリはファイル名のサフィックス(共有オブジェクト)で識別できます。.interpPT_INTERP.so
動的リンカは、プログラムの実行中またはリンク中にその動作を変更するように影響を受けることがあり、その例はさまざまな Unix ライクなシステムのランタイム リンカ マニュアル ページに記載されています。[ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ]LD_LIBRARY_PATHこの動作の典型的な変更は、およびLD_PRELOAD環境変数の使用です。これらは、共有ライブラリを別の場所で検索したり、そうでなければロードされないライブラリを強制的にロードおよびリンクしたりすることで、ランタイム リンク プロセスを調整します。例として、zlibc [ 7 ](別名 )[ a ]uncompress.soがあり、ハックを介して使用すると透過的な解凍が容易になります。その結果、BSD および Linux システムでは、圧縮されていないファイルであるかのように、事前に圧縮された (gzip で圧縮された) ファイル データを読み取ることができ、いくつかの注意点はあるものの、ユーザーが基盤となるファイルシステムに透過的な圧縮を追加できるようになります。このメカニズムは柔軟性があり、同じコードを簡単に変更することで、要求したユーザープロセスにデータを提供する前に、ファイル読み取り中にデータの追加処理や代替処理を実行できます。[ 8 ] [ 9 ]LD_PRELOAD
AppleのDarwinオペレーティングシステム、およびmacOS、iOS、iPadOS、tvOS、watchOS、visionOSなど、Darwinをベースに構築されたAppleのオペレーティングシステムでは、使用すべきダイナミックリンカーのパスは、リンク時に実行可能イメージ内のMach-Oロードコマンドのいずれかに埋め込まれます。これらのシステムでは、動的にロードされる共有ライブラリは、ファイル名のサフィックス、またはフレームワークのバンドル.dylib内での配置によって識別できます。
ダイナミックリンカは、ターゲット実行可能ファイルを共有ライブラリにリンクするだけでなく、リンク時にターゲット実行可能ファイルが認識するメモリ内の特定のアドレスポイントにマシンコード関数を配置します。実行可能ファイルがダイナミックリンカとやり取りしたい場合は、マシン固有の呼び出し命令またはジャンプ命令を実行して、これらの既知のアドレスポイントのいずれかにジャンプします。Darwinベースのプラットフォーム上の実行可能ファイルは、プロセスの実行中にダイナミックリンカとやり取りすることがよくあります。実行可能ファイルが最初に起動してから数時間後にダイナミックリンカとやり取りして、より多くのライブラリをロードし、より多くのシンボルを解決することさえあることが知られています。Darwinベースのオペレーティングシステム用の多くのプログラムがダイナミックリンカと頻繁にやり取りする理由は、これらのオペレーティングシステムのほとんどのアプリケーションで使用されているAppleのCocoaおよびCocoa Touch APIと、これらのAPIが実装されている言語であるObjective-Cの両方にあります(詳細については、それぞれのメイン記事を参照してください)。
動的リンカーは、その動作の一部を変更するように強制することができます。ただし、他の Unix ライクなオペレーティングシステムとは異なり、これらの変更はヒントであり、動的リンカーによって無視されることがあります (そして実際に無視されることもあります)。この例は、dyldのマニュアル ページに記載されています。[ 10 ]DYLD_FRAMEWORK_PATHこの動作の典型的な変更は、および環境変数の使用ですDYLD_PRINT_LIBRARIES。前述の変数のうち前者は、共有ライブラリの検索パスをランタイムで調整し、後者は、ライブラリがロードおよびリンクされるときにライブラリの名前を表示します。
AppleのmacOSダイナミックリンカーは、 Darwinの一部としてリリースされたオープンソースプロジェクトであり、Appleのオープンソースdyldプロジェクトで見つけることができます。[ 11 ]
AIXなどのXCOFFを使用する Unix ライクなオペレーティングシステムでは、動的にロードされる共有ライブラリはファイル名のサフィックスを使用します。.a
動的リンカーは、プログラムの実行中またはリンク中に動作を変更するように影響を受けることがあります。この動作を変更する典型的な例は、LIBPATH環境変数を使用することです。この変数は、共有ライブラリを別の場所で検索したり、通常はロードされないライブラリを強制的にロードおよびリンクしたりすることで、実行時のリンク処理を調整します。
IBM OS/360 およびその後継OSにおけるアセンブラ言語プログラムからの動的リンクは、通常、リンク対象のライブラリモジュールをプログラムで使用できるようにするオペレーティング・システム・ルーチンをアクティブ化するスーパーバイザ・コール命令を含むLINKマクロ命令を使用して行われます。ライブラリモジュールは、制御カードで指定され、特定のプログラム実行でのみ使用可能な「STEPLIB」または「JOBLIB」、PARMLIBのLINKLISTに含まれるライブラリ(システム起動時に指定)、またはシステム起動時に特定の再入可能モジュールがロードされる「リンクパック領域」に配置される場合があります。
Multicsオペレーティングシステムでは、実行ファイルを含むすべてのファイルはセグメントです。現在のセグメントに含まれていないルーチンを呼び出すと、システムはメモリまたはディスク上で参照されているセグメントを探し出し、実行中のプロセスのアドレス空間に追加します。動的リンクが通常の動作方法であり、静的リンク(バインダーを使用)は例外です。
動的リンクは、一般的にコンパイル時のリンクよりも遅く(より多くのCPUサイクルを必要とする)[ 12 ]、実行時に実行されるほとんどのプロセスに当てはまります。ただし、ライブラリの関数への呼び出しが最初の呼び出しが発生したときにのみ(ライブラリ内の)実装にリンクされるプロセスである「遅延リンク」を使用することで、ロード時間を短縮できます。副作用として、プログラムがロードされると、関数への最初の呼び出しは遅くなります。これは、関数へのリンク時間が起動時から実行時にシフトされたためです。
しかし、動的リンクは多くの場合、ディスクと実行時のメモリの両方でスペース効率が優れています。ライブラリが静的にリンクされている場合、実行中のすべてのプロセスは、呼び出されるライブラリ関数の独自のコピーとリンクされます。そのため、ライブラリが異なるプログラムによって何度も呼び出されると、そのライブラリ内の同じ関数がシステムのメモリ内の複数の場所に複製されます。共有動的ライブラリを使用すると、コンパイル時に各ファイルをライブラリの独自のコピーにリンクしてメモリ領域を無駄にする代わりに、一度に1つのライブラリのコピーのみがメモリに格納され、メモリ領域を他の用途に解放できます。[ 13 ]さらに、動的リンクでは、ライブラリは実際に使用されている場合にのみロードされます。[ 14 ]
{{cite book}}: CS1 maint: 非推奨のアーカイブサービス (リンク)コード: [リンク削除済み]訂正: