2

我目前正在学习链接/编译的工作原理,刚刚谈到了关于 .exe 文件的导入的主题。我看到(Microsoft)链接器可能需要 Win32 SDK 中的 .lib 文件来解析外部函数。例如,如果您想使用MessageBoxAfromuser32.dll您实际上需要_MessageBoxA@16来自 user32.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 回答