获取.lib地址

问题描述:

我目前正在学习如何链接/编译工作,只是来到关于进口的.exe文件的主题。我发现(Microsoft)Linker可能需要Win32 SDK中的.lib文件来解析外部函数。例如,如果您想使用user32.dll中的MessageBoxA,您实际上需要user32.lib中的[email protected]地址来解决此问题。那么,用户/程序员怎么可能找出我需要解析它的哪个“Prefix”? (与其他User32/Kernel32函数一样...)获取.lib地址

_MessageBoxA @ 16是编译器从WinUser.h #include文件声明中生成的符号。这是一个装饰的名称,下划线和@后缀用于声明为__stdcall的函数。名称装饰有助于在链接时识别声明错误。但是,实际上并没有用于winapi函数,它们没有未修饰的名称。主要是为了方便使用GetProcAddress()。

User32.lib是不是一个正常库,它是一个导入库。它不包含MessageBoxA的代码,它仅包含由user32.dll导出的所有函数的列表。它包含从编译器生成的名称_MessageBoxA @ 16到它从user32.dll,MessageBoxA实际导出的名称的映射。当他们构建user32.dll时,Microsoft使用“模块定义文件”a .def file来创建此映射。

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

+0

感谢您的信息。但是,这仍然不能解释如何找出用于user32.lib或kernel32.lib等函数的名称。它可以在WinUser.h中定义,但是作为程序员,如何在没有WinUser的情况下找到名称。H?!有没有纪录片? – 2013-03-03 02:59:02

+0

嗯,它的确如此,我在答案中多次使用了“映射”这个词。按照我为.def文件提供的链接查看这些映射是如何创建的。 – 2013-03-03 03:00:43

+0

我想你可能会误解我的问题。假设我想使用VirtualAlloc函数,该函数在.obj文件中声明为'VirtualAlloc'外部函数,可能会导致错误或根本不导入。我实际上必须使用_VirtualAlloc @ 16,否则我甚至可以使用_VirtualAlloc @ 900或_VirtualAlloc @ 12345。那么我怎么知道哪个是正确的名字? – 2013-03-03 03:39:41