《Windows Via C/C++》读书笔记之dll隐式链接
《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环境变量指定的目录
这是最好的时代,这是最坏的时代;这是智慧的年代,这是愚蠢的年代;这是信仰的时期,这是怀疑的时期;我们的前途拥有一切,我们的前途一无所有。