Dll的两种链接方式与LIB

      终于搞清楚DLL的两种加载方式以及一个特别容易混淆的概念,DLL的静态链接方式和静态连接库lib。

       静态链接库LIB文件包含了函数等的具体实现,是编译好的二进制代码,可以看做.obj文件。当某个程序中声明连接LIB文件时,程序在链接阶段将LIB文件中的二进制代码一并生成到目标程序中。所以,目标程序不需要额外的依赖就可以运行。比如C中的printf等函数,通常是以这种方式链接到目标程序中去的。

VS2005中,如果需要连接某个静态链接库,可以在工程中设置LINKER,或者添加代码:

#pragma comment(lib,”my.lib”)

      而动态链接库DLL是在运行时才被链接到目标程序中的。硬盘上的可执行程序中并没有在编译连接的时候就将DLL链接到一起,所以在运行时需要DLL文件,加入DLL文件找不到,那么程序就不能继续运行。

      程序调用DLL有两种方式,隐式链接和显式链接。在之前我已经总结过了DLL基础 。隐式链接的用法和静态链接库LIB的用法一样,不过特别注意的是其本质跟静态链接库完全不同。Dll的LIB只是包含了一些跳转指令之类的,在程序中需要调用DLL中的函数时,就跳转到具体的实现DLL中,它本身并不包含实现。

      不论是DLL的静态链接方式和动态链接方式,在程序加载DLL时,都会将DLL映射到进程的地址空间中去。用IceSword查看进程的模块信息中可以看到。但是有一点需要特别注意,如果采用了DLL的静态链接方式,但是代码中并没有调用DLL中的任何变量或者是函数,那么编译器会做一些优化,从而程序并不加载这个DLL,验证的话用IceSword查看时是看不到模块中有这个DLL的。

3 Comments are ready?

  1. jerry said on: 2010年04月19日 16:46

    我现在在学着hook api,你的两篇文章对我帮助很大,谢谢啦!!!呵呵…………博主加油哦!!

    [回复]

    boluor 回复  于   

    ^/^ 想当年我也学过hook呢,呵呵。你也+U~

    有条件看看《windows核心编程》。

    [回复]

  2. jerry said on: 2010年04月19日 18:02

    嗯!我在图书馆借不到《windows核心编程》,所以下了本电子书。昨天看了点,是写得很详细。博主经常上线不哦,以后有问题了,还望博主不吝赐教呀!!嘿嘿…………

    [回复]

    boluor 回复  于   

    发邮件吧~~我IM上聊的时间不多。boluor[AT]gmail.com。

    [回复]

  3. jerry said on: 2010年04月19日 18:46

    好的。嘿嘿…………

    [回复]

Post a Comment

Your email is never published nor shared. Required fields are marked *

*

*

click to changeSecurity Code