2

私は現在、リンク/コンパイルがどのように機能するかを学んでおり、.exeファイルのインポートに関するトピックにたどり着きました。(Microsoft)リンカーは、外部関数を解決するためにWin32SDKからの.libファイルを必要とする可能性があることがわかります。たとえば、MessageBoxAfromを使用する場合は、user32.dll実際に_MessageBoxA@16user32.libのアドレスを使用して解決する必要があります。では、ユーザー/プログラマーがどの「プレフィックス」を解決する必要があるかをどのように見つけることができるのでしょうか。(他のUser32 / Kernel32関数のように...)

4

1 に答える 1

1

_MessageBoxA @ 16は、コンパイラがWinUser.h#includeファイルの宣言から生成したシンボルです。これは装飾された名前であり、アンダースコアと@接尾辞は、__stdcallとして宣言された関数に使用されます。名前の装飾は、リンク時に宣言の間違いを見つけるのに役立ちます。ただし、実際にはwinapi関数には使用されません。名前は装飾されていません。主に、GetProcAddress()を簡単に使用できるようにするためです。

User32.libは通常のライブラリではなくインポートライブラリです。MessageBoxAのコードは含まれていません。user32.dllによってエクスポートされるすべての関数のリストが含まれているだけです。また、コンパイラによって生成された名前_MessageBoxA @ 16から、user32.dllから実際にエクスポートされた名前MessageBoxAへのマッピングが含まれています。Microsoftは、 user32.dllをビルドするときに、「モジュール定義ファイル」である.defファイルを使用してこのマッピングを作成しました。

リンカはuser32.libを使用してシンボルを解決します。インポートライブラリから、エクスポートされた関数の適切な名前を使用して、EXEでインポートテーブルエントリを作成する方法を認識しています。

于 2013-03-03T02:40:02.980 に答える