动态链接库基础


一段代码从文本编辑器从编写到执行经历阶段:

  • 编译:编译器通过词法分析,语法分析,语义分析等,将一段代码翻译成汇编语言
  • 汇编:将汇编语言翻译成机器指令
  • 链接:解决符号之间的重定位问题
  • 装载: 将可执行文件加载到内存

在C/C++中,独立的编译单元包括obj文件(一般的源程序编译而成)、lib文件(静态链接的函数库)、dll文件(动态链接的函数库)等。
静态链接方式:在程序执行之前完成所有的组装工作,生成一个可执行的目标文件(EXE文件)
动态链接方式:在程序已经为了执行被装入内存之后完成链接工作,并且在内存中一般只保留改编译单元的一份拷贝

1. 静态链接

静态链接就是在装载之前完成所有的符号引用的一种链接方式。
静态链接的处理过程分为2个步骤:

  • 空间与地址的分配。扫描所有的目标文件,合并相似段,收集当中所有的符号信息
  • 符号解析与重定位。调整代码位置

实现。在完成静态链接之后,可执行文件中代码段、数据段等虚拟地址已经确定。

静态链接的优缺点

  • 优点
    1. 执行速度比动态链接库快
  • 缺点
    1. 浪费内存和磁盘空间、模块更新困难
    2. 会给程序的更新、部署和发布带来麻烦

2.动态链接

基本思想就是将对符号的重定位推迟到程序运行时才进行。

  • 优点
    1. 在运行时重定位,如果在运行过程中调用了公共库函数或者其他模块的函数,系统只需要在内存中维护一份公共库代码即可,只要将不同应用程序对公共库函数的调用地址设置成相同即可。解决了内存占用。
    2. 理论上只要将需要替换的模块更新,无需将整个应用程序打包。方便更新、部署。
  • 动态链接库的两种链接方法:
    1. 装载时动态链接(Load-time Dynamic Linking):这种用法的前提时在编译之前已经明确知道要调用DLL中的哪几个函数,编译时在目标文件中只保留必要的链接信息,而不含DLL函数的代码;当程序执行时,调用函数的时候利用链接信息加载DLL函数代码并在内存中将其链接入调用程序的执行空间中(全部函数加载进内存),其主要目的时便于代码共享。
    2. 运行时动态链接(Run-time Dynamic Lingking):这种方式是指在编译之前并不知道将会调用哪些DLL函数,完全是指运行过程中根据需要决定应调用哪个函数,将其加载到内存中(只加载调用的函数进内存),并标识内存地址,其他程序也可以使用该程序,并用LoadLibrary和GetProcaddress动态获得DLL函数的入口地址。

相关