Windows下的动态链接
DLL文件的扩展名不一定是.dll,也可能是别的,比如.ocx(OCX控件)或者是.CPL(控制面板程序)。
DLL的设计目的与共享对象有些出入,DLL更加强调模块化,即微软希望通过DLL机制加强软件的模块化设计,使得各种模块之间能够松散地组合、重用和升级。
一、声明导出函数的方法
使用_declspec( dllexport)扩展,或者使用模块定义(.def)文件声明;
使用.def文件来描述DLL文件的导出属性的好处:首先,可以控制导出符号的符号名,其次是可以控制一些链接的过程。
二、EXP文件的作用
创建DLL时,会产生一个EXP文件,这个文件实际上是链接器在创建DLL时的临时文件。链接器在创建DLL时采用两遍扫描过程,DLL一般都有导出符号,链接器在第一遍时会遍历所有的目标文件并且收集所有导出符号的信息并且创建DLL的导出表,为了方便起见,链接器把这个导出表存放在一个临时的目标文件中叫做“.edata”的段中,这个目标文件就是EXP文件,EXP文件实际上是一个标准的PE/COFF目标文件,只不过它的扩展名不是.obj而是.exp。
三、DLL怎样做到在多个模块之间共享
Linux下的ELF文件,通过GOT机制实现共享对象的地址无关性,但是Windows下的PE DLL的代码段并不是地址无关的,它通过重定基地址的方法实现DLL共享;
"__declspec(dllimport)"的作用:一旦一个函数被声明为“__declspec(dllimport)”,那么编译器就知道它是外部导入的,以便于产生相应的指令形式。