windows - __declspec(dllimport) 的必要性

标签 windows winapi linker

我在看这个:Importing Function Calls Using __declspec(dllimport)而且我不明白为什么真的需要 __declspec(dllimport)?为什么链接器不能在链接阶段将调用 func1 修补为调用 DWORD PTR __imp_func1(IAT 表地址)从而避免在源中单独声明的需要?

最佳答案

补丁指令空间不足可能是一个原因,但不是主要原因。即使有足够的空间,链接器仍然不会修补它以获得更好的性能。原因是链接器不做或修改编译器后端生成的代码,它只是用重定位信息修补地方。下面的例子不是很好的编码风格,但清楚地解释了问题。 bar() 生成的指令是 call dword[_imp__bar],它有 6 个字节长,即使链接器知道 bar() 在最终图像中定义,它不会用只需要 5 个字节的 call OffsetOfBar 对其进行修补。延迟代码生成到链接时间(将/GL 传递给 cl.exe)可以解决这个问题,因为链接器将在链接时间调用编译器后端,后端将生成优化的 call 指令因为它知道 call 目标在同一模块中。

// main.c
// compile it with 'cl.exe /Zi /O2 main.c bar.c'

__declspec(dllimport) void bar();

int main() {
  bar();
}

// bar.c
void __declspec(noinline) bar() {}

关于windows - __declspec(dllimport) 的必要性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15812196/

相关文章:

c++ - Windows运行时库依赖和纯C代码

c++ win32如何重命名文件夹/目录

windows - Microsoft 键盘布局创建器不允许我创建我的 DLL 文件或安装包

c++ - 在 Win32 API 中禁用组合框项

c++ - IcmpSendEcho2 - 异步调用不是异步的

c++ - 在 Xcode 4 中链接和编译 Armadillo

c# - 如何在系统启动时自动运行应用程序?

无法从 LPT1 获取端口句柄

c++ - 链接器说 _IsolationAwareLoadLibrary 未定义 - 有什么想法吗?

go - 在其他操作系统上编译时,go 程序如何链接系统库?