动态链接库

参考:琢石成器

 

今天看《琢石成器》第11章,动态链接库和钩子,特此记录一下。

 

1、静态链接库

lib.exe工具将多个obj文件组合成一个lib文件,当程序需要用到这个lib文件中的子程序时,只需要指定子程序名,链接器就可以将代码插入到可执行程序中,这就是静态链接。

缺点:

1)、当多个程序要用到一段相同子程序时,就会存在相同代码,浪费空间(包括磁盘空间和多个程序装入内存的内存空间);

2)、如果用到的子程序有修改,所有的程序都需要重新编译。

 

2、动态链接库

动态链接库的代码在程序链接时不会插入到代码中,在程序运行时才将整个库中的代码调入内存,所以叫动态链接。

 

动态链接库的代码在内存中永远只有一份,它会映射到不同进程的地址空间中,而数据段还是会映射到不同的内存中,有多少个程序使用动态链接库,就有多少段数据段(如果想实现数据共享,需要将数据放在一个节中,并且在链接时需要指定该节属性为共享,如:/section:.bss,S).

 

3、实现动态链接库

1)、入口点

入口函数的结构: DllEntry proc hInstDll, dwReason, dwReserved

hInstDll:动态链接库的模块实例句柄,需要保存来对动态链接库进行操作,该入口函数是获得该句柄的唯一途径。在库中用GetModuleHandle获得的是动态链接库所属程序的句柄;

dwReason:根据所传的值进行初始化或者其他操作(有四个值);

dwReserved:保留字

 

入口函数是供操作系统调用的,通过dwReason值说明是哪种情况,分别进行处理,并返回成功与否;

 

2)、导出函数

动态链接库设计需要一个*.def文件,用来告诉链接器哪些函数是可以被其他程序调用的,格式:

EXPORTS methodName1

methodName2

由于dll是PE格式的,链接器就将def文件中EXPORTS所指定的函数加入到PE文件的导出表中,指明这些函数可以归其他程序调用;

 

3)、链接时必须使用/Dll 和 /Def选项

 

4)、链接结果:除了生成dll文件外,链接器还将生成两个文件:lib和exp文件,其中lib文件就是动态链接库的导入库文件,如果dll是程序的一部分,则不需要该lib文件;但是如果dll需要开发使用,则必须提供导入库文件,也就是includelib指定的。

为了能让不同语言使用动态链接库,需要提供支持不同语言的头文件。

 

4、使用动态链接库

1)、直接使用:如在win32中,include和includelib动态链接库的inc和导入库lib就行了;

2)、动态装入:需要用三个api函数装载、释放动态链接库和获取导出函数地址,分别是:LoadLibrary, FreeLibrary, GetProcAddress,这样就不需要include头文件和导入库了,动态装载。

在Free共同使用的一个库时,各个程序间不会有影响,操作系统为每个库维护一个装入计数器,装入递增,Free递减,只有计数器为0时, 也就是库没被任何程序使用时,操作系统才会将它从内存真正释放,否则,仅是将库从某个程序的进程空间中删除映射而已。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值