ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

动态链接库基础

2021-09-30 14:36:24  阅读:175  来源: 互联网

标签:调用 函数 基础 DLL 编译 内存 动态链接库 链接


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

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

在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函数的入口地址。

标签:调用,函数,基础,DLL,编译,内存,动态链接库,链接
来源: https://www.cnblogs.com/liuyechang/p/15356630.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有