获取.lib地址

时间:2013-03-03 02:11:14

标签: winapi assembly linker import

我目前正在学习如何链接/编译工作,并且刚刚谈到了关于.exe文件的IMPORTS的主题。我看到(Microsoft)链接器可能需要Win32 SDK中的.lib文件来解析外部函数。例如,如果您想使用MessageBoxA中的user32.dll,则实际需要user32.lib中的_MessageBoxA@16地址来解析它。那么用户/程序员怎么可能找出我需要解决它的“前缀”?! (像其他User32 / Kernel32函数一样......)

1 个答案:

答案 0 :(得分:1)

_MessageBoxA @ 16是编译器根据WinUser.h #include文件中的声明生成的符号。它是修饰的名称,下划线和@ postfix用于声明为__stdcall的函数。名称修饰有助于在链接时捕获声明错误。但实际上并没有用于winapi功能,他们有未修饰的名字。主要是为了方便使用GetProcAddress()。

User32.lib 是普通库,它是导入库。它不包含MessageBoxA的代码,它只包含user32.dll导出的所有函数的列表。它包含从编译器生成的名称_MessageBoxA @ 16到它实际从user32.dll,MessageBoxA导出的名称的映射。 Microsoft使用“模块定义文件”a .def file在构建user32.dll

时创建此映射

链接器使用user32.lib来解析符号。它从导入库中知道如何使用导出函数的正确名称在EXE中创建导入表条目。