web-dev-qa-db-ja.com

動的ローディングと動的リンクの違いは?

ルーチンは、呼び出されるまでロードされません。すべてのルーチンは、再配置可能なロード形式でディスクに保持されます。メインプログラムがメモリにロードされ、実行されます。これは動的リンクと呼ばれます。

なぜこれがダイナミックリンクと呼ばれるのですか?動的ロードと呼ばれるまでルーチンはロードされないため、動的ロードではないはずです。動的リンクの場合と同様、リンクは実行時まで延期されます。

20
Luv

動的読み込みは、読み込み中または実行中にライブラリ(またはその他のバイナリ)をメモリに読み込むことを意味します。

動的ローディングはプラグインに似ていると想像できます。つまり、exeは動的ローディングが発生する前に実際に実行できます(たとえば、動的ローディングはCまたはC++のLoadLibrary呼び出しを使用して作成できます)

動的リンクは、exeの作成時ではなく、ロードまたは実行時に行われるリンクを指します。

Exeの作成中にリンカを動的にリンクする場合、最小限の作業で済みます。動的なリンカが機能するためには、実際にライブラリもロードする必要があります。したがって、リンクローダーとも呼ばれます。

したがって、あなたが参照する文は理にかなっているかもしれませんが、それが参照しているコンテキストを推測することはできないため、まだかなりあいまいです。

19
Desert Ice

動的ロードとは、実行後にプロセスのメモリに実行可能ファイルまたはライブラリをマッピング(またはコピーする頻度は低い)することです。動的リンクとは、コンパイル後にシンボルを解決すること、名前をアドレスまたはオフセットに関連付けることを指します。

以下は、QuoraのJeff Darcyによる完全な回答へのリンクです。

http://www.quora.com/Systems-Programming/What-is-the-exact-difference-between-Dynamic-loading-and-dynamic-linking/answer/Jeff-Darcy

9
user1995120

この答えは、基本的なLinuxコマンドを知っていることを前提としています。

Linuxには、静的または共有の2種類のライブラリがあります。

enter image description here

静的ライブラリの関数を呼び出すには、ライブラリを実行可能ファイルに静的にリンクする必要があり、その結果静的バイナリが生成されます。

共有ライブラリの関数を呼び出すには、2つのオプションがあります。

最初のオプションはダイナミックリンクです。これは一般的に使用されます-実行可能ファイルをコンパイルするときは、プログラムが使用する共有ライブラリを指定する必要があります。そうしないと、コンパイルさえできません。プログラムが起動すると、これらのライブラリを開くのはシステムの仕事であり、lddコマンドを使用してリストできます。

もう1つのオプションは動的ロードです。プログラムを実行するとき、そのライブラリを開くのはプログラムの仕事です。そのようなプログラムは通常、共有ライブラリを開く機能を提供するlibdlとリンクされています。

ウィキペディアからの抜粋:

動的読み込みは、コンピュータープログラムが実行時にライブラリ(または他のバイナリ)をメモリに読み込み、ライブラリに含まれる関数と変数のアドレスを取得し、それらの関数を実行するか、それらの変数にアクセスし、メモリからのライブラリ。これは、コンピュータープログラムが他のソフトウェアを使用できる3つのメカニズムの1つです。他の2つは静的リンクと動的リンクです。静的リンクや動的リンクとは異なり、動的ロードを使用すると、これらのライブラリがない場合にコンピュータープログラムを起動し、利用可能なライブラリを発見して、追加の機能を取得することができます。

まだ混乱している場合は、まずこの素晴らしい記事を読んでください: Anatomy of Linux dynamic libraries and build the dynamic loading example それを感じて、そしてこれに戻ってください回答。

ldd ./dlの出力は次のとおりです。

linux-vdso.so.1 =>  (0x00007fffe6b94000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f400f1e0000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f400ee10000)
/lib64/ld-linux-x86-64.so.2 (0x00007f400f400000)

ご覧のとおり、dllibdlに依存する動的実行可能ファイルであり、dlを実行するとLinux動的リンカーであるld.soによって動的にリンクされます。リスト内の他の3つのライブラリについても同様です。

libmは、動的にロードされるライブラリとして使用されるため、このリストには表示されません。 ldがロードを要求されるまでロードされません。

8
navigaid

私は「恐竜の本」も読んでいて、ロードとリンクの概念と混同されました。ここに私の理解があります:

  1. 動的なロードとリンクの両方が実行時に行われ、必要なものはすべてメモリにロードされます。

  2. 主な違いは、動的ロードでは、ルーチンがloaderによってロードされたかどうかをチェックし、動的リンクでは、ルーチンがmemoryにあるかどうかをチェックすることです。

  3. したがって、動的リンクの場合、メモリにはライブラリコードのコピーが1つしかありませんが、これは動的ロードには当てはまらない可能性があります。そのため、動的リンクには他のプロセスのメモリをチェックするためにOSサポートが必要です。この機能は、多くのプログラムで共有される言語サブルーチンライブラリにとって非常に重要です。

5
Zheng Gao

動的リンカーは、プログラムの実行を開始する前に、プログラムのすべての動的依存関係をロードおよびバインドするランタイムプログラムです。ダイナミックリンカーは、プログラムが必要とするダイナミックライブラリ、それらのライブラリが必要とするライブラリなどを検索し、それらすべてのライブラリをロードして、関数へのすべての参照が正しい場所を正しく指すようにします。たとえば、最も基本的な「hello world」プログラムでも、通常、出力を表示するためにCライブラリが必要になるため、動的リンカーは、hello worldプログラムをロードする前にCライブラリをロードし、printf()適切なコードに。

2
Diya

Dynamic Loading:呼び出し時にメインメモリにルーチンをロードします。

Dynamic Linking:実行時間中にメインメモリにルーチンをロードします。実行時間の前に呼び出しが発生した場合、実行時間まで延期されます。

動的ロードオペレーティングシステムからの特別なサポートは必要ありません。ロードするルーチンがメインメモリに存在しないかどうかを確認するのはプログラマの責任です。

ダイナミックリンクオペレーティングシステムからの特別なサポートが必要です。ダイナミックリンクを介してロードされたルーチンは、さまざまなプロセスで共有できます。

ルーチンは、呼び出されるまでロードされません。すべてのルーチンは、再配置可能なロード形式でディスクに保持されます。メインプログラムがメモリにロードされ、実行されます。これは動的リンクと呼ばれます。

ステートメントは不完全です。 "メインプログラムはメインメモリにロードされ、実行されます。"は、プログラムのロード時期を指定しません。

呼び出し時に1としてロードされると考える場合st statementは、その動的ローディングを指定します

1
Ankita Rane

ダイナミックローディングを使用して、スペースの利用効率を向上させます

  • 動的ロードでは、プログラムは呼び出されるまでロードされませんすべてのルーチンは、再配置可能なロード形式でディスク上に保持されます。メインプログラムはメモリにロードされ、実行されます。
  • ルーチンが別のルーチンを呼び出す必要がある場合、呼び出しルーチンは最初にロードされているかどうかを確認します。ロードされていない場合、リロケータブルリンクローダーが呼び出され、目的のルーチンをメモリにロードし、プログラムのアドレステーブルを更新してこの変更を反映します。新しくロードされたルーチンに渡されます

利点

  1. 未使用のルーチンがロードされることはありません。これは、エラールーチンなど、頻繁に発生しないケースを処理する必要があるプログラムコードが大きい場合に最も役立ちます。この場合、プログラムコードは大きくても、使用されるコードは小さくなります。
  2. 動的読み込みはO.Sからの特別なサポートを必要としません。メソッドを活用するためにプログラムを設計するのはユーザーの責任ですが、O.Sはプログラマーを支援するライブラリを提供できます
1
Jaimon Thomas

静的と動的のリンクには2つのタイプがあり、実行時に出力ファイルが依存関係なしで実行される場合(files = Library)、このタイプのリンクは静的と呼ばれ、動的は2つのタイプです1.動的ロードリンク2.動的ランタイムリンク以下に説明します

動的リンクとは、ライブラリファイルがプライマリメモリに持ち込まれ、リンクされるランタイム中のリンクを指します..(これらはリンクされている関数呼び出しに関係なく)。

動的ランタイムリンクとは、必要に応じてリンクすることを意味します。つまり、ランタイム中にリンクしているときに関数呼び出しが発生するたびに実行されます。

0
user3350897