我正在看这个:Importing Function Calls Using __declspec(dllimport)我不明白为什么真的需要__declspec(dllimport)?为什么链接器补丁在链接阶段不能调用func1调用DWORD PTR __imp_func1(IAT表地址),因此无需在源代码中单独声明?
答案 0 :(得分:2)
用于修补指令的空间不足可能是一个原因,但不是主要原因。即使有足够的空间,链接器仍然不会修补它以获得更好的性能。原因是链接器不执行或修改编译器后端生成的代码,它只是用重定位信息修补这些地方。下面的例子不是很好的编码风格,但清楚地解释了这个问题。生成的bar()
指令为call dword[_imp__bar]
,长度为6个字节,即使链接器知道最终图像中已定义bar()
,也不会使用{ {1}}只需要5个字节。将代码生成延迟到链接时间(传递/ GL到cl.exe)可以解决此问题,因为链接器将在链接时调用编译器后端,并且后端将生成优化的call OffsetOfBar
指令,因为它知道call
目标位于同一模块中。
call
答案 1 :(得分:1)
引用Raymond Chen:call func长度为5个字节,但是调用dword ptr [_ imp _func]长度为6个字节。补丁不适合。这个字节太大了。在每一条调用指令后添加一个nop(以防它恰好被导入)听起来相当多。