欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

[原创]DLL, lib静态、动态库

[原创]DLL, lib静态、动态库

说一说静态库、静态链接;动态库、动态链接,大牛不要拍砖哟!
1、静态库,分成两类吧,
                 第一种、指包含输出函数声明、实现代码的*.lib;
                 第二种、包含函数声明、函数引用地址的*.lib;
     第一种静态库多出现在DOS操作系统时代,在使用这种静态库时会增加目标PE文件尺寸。
     在win32以后的NT类型操作系统上,使用第二种居多,这一种不会增加目标文件尺寸,不过运行的效率相对低些。
   
     针对第一种静态库,我的理解,使用这种库最终编译链接生成的PE会包含库中实现代码;
     针对第二种静态库,是与DLL一同生成,在被引用时使用,DLL的实现代码不会被链接至目标PE;

2、动态库DLL
     首先,我的理解,无论是动态链接还是静态链接,目标PE内都不会包含DLL导出函数的实现代码,只会包含函数在DLL中的相对地址。动态链接和静态链接的区别在于,动态链接是在PE运行后使用对应的API来初始化、加载、析构,一个是在编译时确定库函数地址。从效率上讲后者编译出来的PE在启动初期会比前者低。
针对DLL的静态链接(或DLL隐式调用),我的解释:在编译时链接生成目标PE时需要提供导入库函数声明、地址,这种方式生成的PE文件依赖库中可以查看到对应的DLL;
针对DLL的动态链接(或DLL显式调用),我的解释:生成的目标PE文件依赖库中不包含对应的DLL信息,而只是在PE运行时使用相应的LoadLibrary, GetProcAddress, FreeLibrary来动态调用DLL中函数;

总结,静态库(文中第二种静态库)不一定会增加目标PE尺寸,而DLL一定不会增加目标PE尺寸。

增加目标PE尺寸定义:包含引用库函数实现代码。
注,红色部分,是我后期增加的。

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功