__declspec(dllimport)加和不加的区别
来源:互联网 发布:淘宝网哪里写招聘 编辑:程序博客网 时间:2024/05/25 23:27
要点:在PE文件中,当CALL另一模块中的函数,编译器产生的CALL指令并不会把控制权直接传给DLL中的函数,而是传给一个JMPDWORD PTR[xxxxxxxx]指令。
CALL外部的DLLs,其实并不是直接CALL DLL本身,而是跳到一块存放有JMPDWORD PTR [XXXXXXXX]指令的存储区域去(可能放在.text或是.icode)。不过若在VC++中使用__declspec(dllimport)进行函数CALL,编译器不会在模块的其他地方产生JMP指令,而是直接就会产生CALL DWORD PTR[XXXXXXXX]。不论哪种情况,JMP或CALL指令中的位址都存放在.idata节的一个DWORD值中(这个DWORD内含该函数的真正位址,即函数入口点)。JMP或CALL指令会把控制权转给该位址。.
一个PE文件呼叫imported function的图示( User32.dll中的GetMessage函数)
上述图示中的偏移地址BFC0847D才是真正指向User32.dll模块中的GetMessage()函数。
原因是把对同一个DLL函数的所有CALL都集中到一处,加载器就不再需要修补每一个CALL DLL的指令。PE加载器要做的,只是把DLL函数的真实位址放到.idata的那个DWORD之中,根本就没有程序码需要修改。(不象NE文件的每一个节段内含一串待修正记录fixup records)。PE文件这种处理方式的缺点:不能够以DLL函数的真正位址初始化一个变量,如:FARPROC pfnGetMessage=GetMessage ;
其他关于此点的可以参考的文章:
http://blog.sina.com.cn/s/blog_6e6798460101j2t5.html
- __declspec(dllimport)加和不加的区别
- 加和不加的区别
- __declspec(dllexport) & __declspec(dllimport) 的区别和作用
- SQL 加go 和不加go的区别
- url中加斜杠和不加斜杠的区别
- new 对象加括号和不加括号的区别
- new 对象加括号和不加括号的区别
- new 对象加括号和不加括号的区别
- new 对象加括号和不加括号的区别
- new 对象加括号和不加括号的区别
- .dll 加d和不加d的区别
- js加var和不加var的区别
- js中加【var】和不加【var】的区别
- js中加“var”和不加“var”的区别
- js中加“var”和不加“var”的区别
- js中加“var”和不加“var”的区别
- C语言 *和不加的区别
- js中函数调用,加括号和不加括号,加引号和不加引号的区别
- Scrapy爬虫学习中遇到的问题记录
- 剑指offer之链表中倒数第k个结点(Python)
- Maven profiles构建开发、集测、生产环境配置文件
- 实验二 创建学生成绩-单链表
- 封装OkHttp3框架
- __declspec(dllimport)加和不加的区别
- 算法学习第一章
- noteBook2.3-C#基础第三天
- 欢迎使用CSDN-markdown编辑器
- 03 java基础语法(上)
- NDK实现毛玻璃效果完全教程
- 大数据CDH_10_01
- Java中字符流与字节流的转化
- 十大经典算法总结(Javascript描述)