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的。
看完了^.^,如果觉得这篇文章对你有用或者有
问题,请留言告诉我,thank you !
文章为原创的话,转载请注明出处.不敢流泪-《Dll的两种链接方式与LIB》
3 Comments are ready?
我现在在学着hook api,你的两篇文章对我帮助很大,谢谢啦!!!呵呵…………博主加油哦!!
[回复]
boluor 回复 于 四月 19th, 2010 at 17:58
^/^ 想当年我也学过hook呢,呵呵。你也+U~
有条件看看《windows核心编程》。
[回复]
嗯!我在图书馆借不到《windows核心编程》,所以下了本电子书。昨天看了点,是写得很详细。博主经常上线不哦,以后有问题了,还望博主不吝赐教呀!!嘿嘿…………
[回复]
boluor 回复 于 四月 19th, 2010 at 18:10
发邮件吧~~我IM上聊的时间不多。boluor[AT]gmail.com。
[回复]
好的。嘿嘿…………
[回复]