2.动态链接( dynamic-linking) 在装入或运行时进行链接。通常被链接的共享代码称为动态链 接库(DLL, Dynamic-Link Library)或共享库( shared library) 优 共享:多个进程可以共用一个DLL,节省内存,减少文件 交换 部分装入:一个进程可以将多种操作分散在不同的DLL中 实现,而只将当前操作相应的DLL装入内存。 便于局部代码修改:即便于代码升级和代码重用;只要函 数的接口参数(输入和输出)不变,则修改函数及其DLL, 无需对可执行文件重新编译或链接。 便于运行环境适应:调用不同的DLL,就可以适应多种使 用环境和提供不同功能。如:不同的显示卡只需厂商为其 提供特定的DLL,而OS和应用程序不必修改。 缺点: 链接开销:增加了程序执行时的链接开销; 管理开销:程序由多个文件组成,增加管理复杂度
2. 动态链接(dynamic-linking) • 优点 – 共享:多个进程可以共用一个DLL,节省内存,减少文件 交换。 – 部分装入:一个进程可以将多种操作分散在不同的DLL中 实现,而只将当前操作相应的DLL装入内存。 – 便于局部代码修改:即便于代码升级和代码重用;只要函 数的接口参数(输入和输出)不变,则修改函数及其DLL, 无需对可执行文件重新编译或链接。 – 便于运行环境适应:调用不同的DLL,就可以适应多种使 用环境和提供不同功能。如:不同的显示卡只需厂商为其 提供特定的DLL,而OS和应用程序不必修改。 • 缺点: – 链接开销:增加了程序执行时的链接开销; – 管理开销:程序由多个文件组成,增加管理复杂度。 在装入或运行时进行链接。通常被链接的共享代码称为动态链 接库(DLL, Dynamic-Link Library)或共享库(shared library)
6.1.4.2 Windows n动态链接库 1.构造动态链接库 DLL是包含函数和数据的模块,它的调用模块可为EXE或DLL, 它由调用模块在运行时加载;加载时,它被映射到调用进程的 地址空间。在VC中有一类工程用于创建DLL。 库程序文件C:相当于给出一组函数定义的源代码; ·模块定义文件DEF:相当于定乂链接选项,也可在源 代码中定义;如:DLL中函数的引入和引出( dllimport 和 dllexport) ·编译程序利用C文件生成目标模块OBJ 库管理程序利用DEF文件生成DLL输入库LB和输出 文件EXP 链接程序利用OBJ和.EXP文件生成动态链接库DLL
6.1.4.2 Windows NT动态链接库 返回 • 库程序文件 .C:相当于给出一组函数定义的源代码; • 模块定义文件 .DEF:相当于定义链接选项,也可在源 代码中定义;如:DLL中函数的引入和引出(dllimport 和dllexport)。 • 编译程序利用 .C文件生成目标模块 .OBJ • 库管理程序利用 .DEF文件生成DLL输入库 .LIB和输出 文件 .EXP • 链接程序利用 .OBJ和 .EXP文件生成动态链接库 .DLL。 1. 构造动态链接库 DLL是包含函数和数据的模块,它的调用模块可为EXE或DLL, 它由调用模块在运行时加载;加载时,它被映射到调用进程的 地址空间。在VC中有一类工程用于创建DLL
2.DLL的装入方法 装入时动态链接(oad-time 在编程时显式调用某个DLL函数,该DLL函数在可 执行文件中称为引入( Import)函数 链接时需利用LB文件。在可执行文件中为引入的 每个DLL建立一个 IMAGE IMPORT DESCRIPTOR 结构。 在装入时由系统根据该DLL映射在进程中的地址改 写 Import Address Table中的各项函数指针。Hit是 DLL函数在DL文件中的序号,当DLL文件修改后 就未必指向原先的DLL函数。在装入时,系统会查 找相应DLL,并把它映射到进程地址空间,获得 DLL中各函数的入口地址,定位本进程中对这些函 数的引用;
2. DLL的装入方法 • 装入时动态链接(load-time): – 在编程时显式调用某个DLL函数,该DLL函数在可 执行文件中称为引入(import)函数。 – 链接时需利用 .LIB文件。在可执行文件中为引入的 每个DLL建立一个IMAGE_IMPORT_DESCRIPTOR 结构。 – 在装入时由系统根据该DLL映射在进程中的地址改 写Import Address Table中的各项函数指针。Hint是 DLL函数在DLL文件中的序号,当DLL文件修改后, 就未必指向原先的DLL函数。在装入时,系统会查 找相应DLL,并把它映射到进程地址空间,获得 DLL中各函数的入口地址,定位本进程中对这些函 数的引用;
装入时动态链接过程 H noName IMAGE IMPORT DESCRIPTOR #O Import Address Array Hint me Table Characteristics 44GetMessage TimeDatestamp 72 LoadIcon ForwarderChain 19 TranslateMessage Na ame +"USER32. EXE 95 IsWindow FirstThunk 注: Import Address Table是在装入时 依据DIL模块的加载位置确定
IMAGE_IMPORT_DESCRIPTOR #0 Characteristics TimeDateStamp ForwarderChain Name FirstThunk HintName Import Address "USER32.EXE" 44 72 95 19 GetMessage LoadIcon TranslateMessage IsWindow Array Hint Name Table 装入时动态链接过程 注:Import Address Table是在装入时 依据DLL模块的加载位置确定
DLL函数的调用过程 Application Process 00040042 bfc0847d Import Address table 00014408: jmp dword ptr [00040042 。。· or IP-call 00014408(call to GetMessage) call dword ptr [00040042 USER32. EXE bfc0847d: GetMessage(entry
DLL函数的调用过程 Application Process bfc0847d jmp dword ptr [00040042] call 00014408(call to GetMessage) ……… 00040042: 00014408: IP Import Address Table or call dword ptr [00040042] USER32.EXE bfc0847d: GetMessage() entry