2017-02-17 12 views
-1

インポートライブラリには「スタブ」があるので、実行可能ファイルは必要なDLLと機能を知っています。今私の質問は:それらのスタブは何ですか?彼らはどんな見た目ですか?実行可能ファイルは、DLLの正しい場所へのポインタをどのように設定しますか?また、両方とも.libファイルなので、通常のライブラリまたはインポートライブラリについて話しているかどうかは、どのようにわかりますか?インポートライブラリはどのように正確に動作しますか?

+0

関連情報https://msdn.microsoft.com/en-us/magazine/bb985992.aspx –

+0

実行可能ファイルはこれを認識しません。これはリンカーであり、適切なコードを出力します。 – IInspectable

答えて

1

MSVCリンカはDLLに直接リンクせず、スタティックライブラリ(.lib)にしかリンクできません。

非常におおまかに言えば、インポートライブラリは通常の静的ライブラリであり、DLLのエクスポート関数ごとにスタブ関数を持っています。 DLL関数void func1()と輸出func1を持っている場合

例えば、対応するインポートライブラリは、インポートテーブルからfunc1のアドレスを取るだろう、「ジャンプ」実行時にスタブ機能void __imp__func1() { __asm { jmp dword ptr func1; } }

が含まれています。だからスタブが必要です。

アプリケーションのvoid __declspec(dllimport) func1();という宣言は、実際には__imp__func1()を参照します。

LoadLibraryGetProcAddressを呼び出して実行時にfunc1のアドレスを取得することができます。同じ効果があります。あなたが使用しているコンパイラ(リンカ)とプラットフォームに依存し

1

I.e.あなたは(それを動的にロードする以外に、実行時にそのシンボルを解決)、それにリンクしたい場合、Windows OS、共有ライブラリ通常.DLLファイルで、
に、あなたは、対応する.LIBファイルを必要とする、それがスタブライブラリであります。

基本的にスタブライブラリは、DLLによってエクスポートされたすべてのシンボル(__declspec(dllexport))をスタブにあるシンボルに再マップし、__declspec(dllimport)を使用してプログラム内で見つけて静的にリンクできる静的ライブラリです。

+0

__declspec(dllexport)はWindows APIの関数か、Visual Studioにある命令ですか? –

+0

@Daniel Nyman: '__declspec'はキーワードです(Visual Studio固有の限り)。 'dllexport'と 'dllimport'はそのキーワードの属性です。で詳細を参照してください。https://msdn.microsoft.com/en-us/library/3y1sfaz2.aspx – roalz

+0

[__declspec](https://msdn.microsoft.com/en-us/library/dabb5z75.aspx)でありますキーワードは、Microsoft固有のストレージクラス属性を割り当てます。 – IInspectable

関連する問題