2

静的ライブラリと動的ライブラリについて読みました。私の質問は少し具体的です

dlopen dlclose:

Benifit of dlopen is  we can start the EXE with out
loading the necessary libraries at the begining. Only when we
need we will load the libratries and unload it from the memory.

これは、動的リンクライブラリの動作です。

私の質問は、ライブラリlibUtlitiesをリンクするかどうかです

ld -o EXE main.o -lUtilities 

EXEを実行すると、libUtlitiesがメモリにロードされてから、最初にそこで機能を使用します。

which i observed in dbx (Solaris debugger)
But will not contribute to the size of the EXE.

1.静的リンクまたは動的リンクです。?

4

2 に答える 2

10

残念ながら、「静的」や「動的」という言葉は、特に C や C++ では使いすぎですしたがって、私は次の用語を好みます。

  • リンク時リンク、別名「静的リンク」: すべてのシンボルはリンク時に静的ライブラリから解決されます。その結果、ロード時の依存関係のないモノリシックで静的にリンクされた実行可能ファイルが作成されます。

  • ロード時のリンク: これは、最新のプラットフォームでの標準的な方法です。未解決のシンボルは、共有ライブラリ(Unix) または Windows の残念ながら名前が付けられたダイナミック リンク ライブラリ(DLL) で検索され、参照のみがリンク時に記録されます。シンボルとコードの読み込みは読み込み時に行われます。

    これにより、「動的にリンクされた」実行可能ファイルが生成され、ローダーでロードする必要があります( ld.soLinux など)。ローディングは OS の一部であり、通常はユーザーに対して透過的ですが、検査することはできます ( lddLinux の場合など)。ロード時にすべての共有ライブラリが利用可能である必要があります。利用できない場合、プログラムは起動しません。

  • 実行時リンク、別名「動的リンク」: 未解決のシンボルはありません。dlopen()むしろ、ランタイムはorを使用して共有/動的ライブラリ内のシンボルを検索することを動的に決定しますLoadLibrary()。シンボルが見つからないことは、エラーではなく処理可能な実行時条件です。この手法は、一般的にプラグイン アーキテクチャに使用され、Windows ではコード インジェクションに使用されます。

ただし、Linux の共有オブジェクトと Windows の DLL には根本的な技術的な違いがあることに注意してください。名前が異なるだけで同じものではありません。ただし、どちらもロード時と実行時の両方のリンクに使用できます。

于 2011-08-27T13:32:33.923 に答える
3

動的リンクです。とは関係ありませんdlopen dlclose。動的ライブラリをdlopen手動で開き、そこからエクスポートされた関数を呼び出しています。動的リンクにより、このすべての作業はリンカーによって行われます。静的リンクは、静的ライブラリ (.aファイル) に対してリンクしています。ライブラリからのコードを静的にリンクすることにより、exe にリンクされ、サイズが大きくなります。

于 2011-08-27T13:17:56.297 に答える