【发布时间】:2015-03-05 14:55:28
【问题描述】:
我看了这个页面:An In-Depth Look into the Win32 Portable Executable File Format
它解释了链接器需要一个导入库,因为编译器无法区分普通函数调用和 API 函数调用。但他们也说 __declspec(dllimport) 将函数调用指定为 API 调用,因此链接器链接到 __imp_[<em>function-name</em>]。 但是使用这个关键字,编译器应该知道这是对 API-Function 的调用。
为什么链接器还需要导入库?编译器可以通过在函数名前面加上 __imp_ 来将此符号标记为导入的,并且可以调用函数指针(这是一个尚未解析的符号)并且链接器可以替换此符号(因为它认为这是一个 API 调用) 与 IAT 条目的地址。
为什么 MinGW-linker 可以直接使用“MinGW-DLLs”而 Visual-Studio 链接器需要导入库?
当我阅读这篇文章时,还提出了一些其他问题。在完成与最终可执行文件的链接之前,“dlltool(或链接器)”(无论哪个创建导入库)如何知道 IAT 条目的位置?我认为 IAT 条目将在链接时与最终可执行文件一起构建。帖子说,每个 API-Call 在 IAT 表中都有一个固定的位置,别管会链接多少个 DLL。我无法想象这是如何实现的。
【问题讨论】:
-
This post 回答了您的大部分问题。