我在看这个:Importing Function Calls Using __declspec(dllimport)和我不明白为什么真的需要__declspec(dllimport)?为什么链接器不能在链接阶段调用DWORD PTR __imp_func1 (IAT table address)来调用func1,从而避免在源代码中单独声明?
发布于 2013-04-04 21:46:25
引用Raymond Chen的话: call func是5字节长,但是call dword ptr _imp_func是6字节长。这个补丁不合适。它太大了一个字节。在每个调用指令后面添加一个nop (只是为了防止它被导入)听起来有点过分。
发布于 2014-01-22 14:28:57
打补丁指令的空间不足可能是一个原因,但不是主要原因。即使有足够的空间,链接器仍然不会为其打补丁以获得更好的性能。原因是链接器不做或修改编译器后端生成的代码,它只是用重定位信息修补位置。下面的示例并不是很好的编码风格,但可以清楚地解释这个问题。为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() {}https://stackoverflow.com/questions/15812196
复制相似问题