【问题标题】:Get .lib address获取 .lib 地址
【发布时间】:2013-03-03 02:11:14
【问题描述】:

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

【问题讨论】:

    标签: winapi assembly linker import


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢您的信息。但这仍然不能解释如何找出用于 user32.lib 或 kernel32.lib 等函数的名称。它可能在 WinUser.h 中定义,但作为程序员,我如何在没有 WinUser 的情况下找到名称。H?!哪里有纪录片?
    • 嗯,确实如此,我在回答中多次使用了“映射”一词。按照我为 .def 文件提供的链接查看这些映射是如何创建的。
    • 我想你可能误解了我的问题。假设我想使用函数 VirtualAlloc,它在 .obj 文件中声明为外部的“VirtualAlloc”,可能会导致错误或根本不导入。我实际上必须使用 _VirtualAlloc@16 或者我什至可以使用 _VirtualAlloc@900 或 _VirtualAlloc@12345。那么我怎么知道哪个是正确的名字呢?
    • 您不能使用 _VirtualAlloc@900,因为该函数不存在。汉斯的回答很准确。
    • 因为 16 是参数的字节数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-24
    • 2012-11-13
    • 2010-11-04
    • 2011-10-11
    • 1970-01-01
    相关资源
    最近更新 更多