DLL动态链接

来源:互联网 发布:windows窗口高级编程 编辑:程序博客网 时间:2024/06/11 03:18

1.  DLL

Windows 下的DLL 文件和EXE 文件实际上是一个概念,都是PE 格式的二进制文件。

利用DLL实现共享数据

在一个DLL中需要进程间共享的变量分离出来,放到另外一个数据段中,然后将这个数据段设置成进程间可以共享的, 一个DLL 中有两个数据段,一个是用于进程共享的,另外一个是用于私有的。

导出符号: __declspec(dllexport)

最终链接时,我们必须把与DLL一起产生的lib, .obj 文件链接,这个lib里面不是真正包含代码和数据,而是用来描述dll的导出符号和一些代码,以前一直认为最终链接的时候是dll.obj做链接,看来还是与.lib做链接比较正常。

 

LoadLibrary,装载DLL到进程的地址空间,

GetProcAddress,查找某个符号,

FreeLibrary 释放DLL

 

2.  符号导出导入表

所有函数名是按照ASCII顺序排序的,以便于动态链接器查找函数名字时可以速度更快(2分查找)

 

导出表的查找过程:

 

先利用函数名去查找相应的序号,然后通过序号去查找地址。

 

Windows 修改导入表里面ITA的序号变为真实地址的做法是

在装载时,将导入表所在的位置的页面修改成读写的,一旦导入表的ITA被改写完毕,再将这些页面设回至只读属性。

 

3.  DLL优化

Rebasing

ELF PIC(代码无关)相比,DLLrebasing 相当简单,只是简单rebase了加载的DLL的基地址(如果这个DLL的基地址被占用(一般的DLL加载的基地址是0X1000000)).所以速度肯定比上ELFPIC,GOT这样的方案,内存消耗也很多,在进程共享上也无法与ELF相比。

4.  C++与动态链接

不用C++写共享库的原因:1.C++ABI级别的规定,至规定了语言层面的规定,

2.CC++之间如何相互操作(extern”C”)

 

Com 本质论 那个例子很生动。

 

Windows XP 开始, Application Manifest 这个东西,用于控制Application需要加载的DLL,一般是系统的DLL