我在看:Importing Function Calls Using __declspec(dllimport),我不明白为什么__declspec(dllimport)真的需要?为什么链接器补丁在链接阶段无法调用func1调用DWORD PTR __imp_func1(IAT表地址),从而避免需要在源中单独声明?__declspec(dllimport)的必要性
3
A
回答
1
引用Raymond Chen:call func长度为5个字节,但调用dword ptr [_ imp _func]长度为6个字节。该补丁不适合。这是一个太大的字节。在每个调用指令之后添加一个nop(以防万一它被导入)听起来非常过分。
2
补贴说明的空间不大可能是一个原因,但不是主要原因。即使有足够的空间,链接器仍然不会打补丁,以获得更好的性能。原因是链接器不会执行或修改由编译器后端生成的代码,它只是用重定位信息来修补这些地方。下面的例子不是很好的编码风格,而是清楚地解释问题。对于bar()
生成的指令是call dword[_imp__bar]
,它是6个字节长,即使链接器知道bar()
是在最终映像中定义的,但它不会用仅需要5个字节的call OffsetOfBar
进行修补。将代码gen延迟到链接时间(pass/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() {}
相关问题
- 1. Windows&C++:extern&__declspec(dllimport)
- 2. __declspec(dllimport的/ DLLEXPORT)和继承
- 3. 正确使用__declspec(dllimport)
- 4. 必要性的malloc
- 5. 的DllImport - PreserverSig和SetLastError属性
- 6. 是__declspec(dllexport)的需要cpp文件
- 7. jQuery中.ready()的必要性
- 8. BaseWaveApplLayer中handleSelfMsg的必要性
- 9. @Parent注释的必要性
- 10. 必要性的getter方法
- 11. 必要性的“腐”操作
- 12. SQLAlchemy必要的表属性
- 13. 实现可比性的必要性
- 14. 动态设置DllImport属性
- 15. 必要性,这种情况
- 16. 是必要的,属性XML的entites值
- 17. 空的构造函数的必要性
- 18. ParseCrashReporter的符号化的必要性
- 19. matplotlib中plt.figure()的必要性是什么?
- 20. “必要”的属性不工作
- 21. JSP/Servlet的必要性JSF开发
- 22. 关于ROS包的必要性
- 23. pthread_attr_init()的使用和必要性
- 24. “退出函数”的必要性
- 25. 删除不必要的svn:mergeinfo属性
- 26. 指定WCF中参数的必要性
- 27. 使用ObserveOn观察物的必要性?
- 28. IP-in-IP的必要性是什么?
- 29. 虚拟成员函数的必要性
- 30. 在什么情况下你会得到__declspec(dllimport)的无法解析的外部符号?
这将有助于:http://stackoverflow.com/a/4490536/? – Joulukuusi 2013-04-04 13:15:17
@Joulukuusi是的,这是一个优化,以避免jmp,但我不明白为什么这种优化不能由链接器执行。 – user206334 2013-04-04 13:17:44
由于'call func'长度为5个字节,但'call dword ptr [__imp__func]'长度为6个字节。该补丁不适合。这是一个太大的字节。 – 2013-04-04 13:21:41