您的位置:首页 > 编程语言 > C语言/C++

《Windows Via C/C++》读书笔记之dll隐式链接

2014-04-11 10:02 218 查看

《Windows Via C/C++》读书笔记之dll隐式链接



一、使用方式

exe要隐式链接一个dll,分阶段的需要.h文件,.lib文件和.dll文件。
编译阶段:.h文件提供函数定义及变量定义
链接阶段:.lib文件提供导出函数和变量的符号名称
运行阶段:.dll文件提供代码和数据

TIPS: 查看exe所需的dll,可以使用VC带的dumpbin -imports xxx.exe来查看,或者使用Total Commander查看。

二、理解加载过程

loader扫描exe的import section,加载其所需的dll,这是一个递归的过程,loader也会检查dll的import section,递归load所需的dll。这个过程中,loader会对这些dll保持跟踪,一个dll只会被加载一次,即使多个模块都需要这个dll。

loader在将所有需要的dll加载到地址空间后,开始resolve所有imported symbols,将RVA加上dll加载的基址,保存到exe的import section。当这些完成后,exe引用这些imported symbols就只需要查找exe的imported section,然后把地址取出,就可以直接访问这些symbols了。

三、理解.lib文件

动态库的.lib文件不包含函数或者变量,仅仅是列出了导出函数和变量的符号名称。在链接阶段用于符号resolve。

静态库的.lib文件包含了函数和代码,相当于是目标文件,会被编进PE文件。

四、dll搜索顺序

exe加载dll时的搜索顺序:
1、exe文件所在目录
2、windows系统目录,可用GetWindowsDirectory()获取
3、对于16位系统,在windows目录下的System子目录
4、windows目录,可用GetSystemDirectory()获取
5、进程的当前目录,可用GetCurrentDirectory()获取
6、PATH环境变量指定的目录
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: