C++静态库与动态库执行过程深入
静态库与动态库
静态库
基本使用
静态库是将一组完整的功能,如一个提供了完整运算的计算器,进行封装为一个.a或.lib文件。
使用时仅需要在使用处include这个静态库的头文件。而后在编译时添加-L与-l选项,如静态库位置在
/usr/local, 名称为libmath.aLinux静态库命名规范,必须是”lib[your_library_name].a”:lib为前缀,中间是静态库名,扩展名为.a。
执行命令为:
g++ mycode.cpp - L /usr/local -lmath,这回使静态库被链接到最终的可执行文件中缺陷
静态库被不同的文件引用时会有多个在内存中的拷贝,可能会造成体积庞大,因此较大的文件应该尽量使用动态库;
静态库对程序的更新、部署和发布页会带来麻烦。如果静态库更新了,所有使用它的应用程序都需要重新编译、发布给用户
动态库

或者合为一个命令:
g++ -fPIC -shared -o libdynmath.so DynamicMath.cpp
执行过程
一个程序的执行阶段都会有一个叫代码段的内存段,也就是说程序要执行哪个函数要会去代码段里面寻址,查函数地址。
那么代码段里面存的函数地址的值是怎么计算?这就是link阶段做的(其中一件)事:计算函数地址偏移量。
于是:
所谓的“静态库”就是说这个函数地址偏移量在link阶段计算好了,所以函数地址要相对整个代码段的地址在执行阶段是不变的,最终看起来每个进程“独享”函数库地址。(link阶段已经把静态库放到了最终的可执行文件中)
“动态库”就是说这个函数地址具体是多少,则是在执行阶段才计算好。(执行阶段)函数地址相对进程的内存段是会变化的。
这么做当然是有用的:对于一个内存不充足,抑或是平台开发,动态库都方便开发,不用link出庞大的二进制包,代价就是执行阶段运行会慢些。
而在跨平台,你不知道新平台是否有完善的动态库时,静态库这时候就起作用,你link出的二进制包不怕库缺失,代价就是二进制包占空间比较大,但是运行速度快。
摘自https://www.zhihu.com/question/457186986/answer/1863306428
静态库执行过程
静态库如果是一个函数,那么这个函数的偏移地址是固定的。函数会复制到该进程代码段中固定偏移地址的位置,从而形成一个完整的程序
动态库执行过程
- 查找动态库:首先,进程需要知道要调用的函数在哪个动态库中。这个信息在编译阶段就已经确定了。
- 加载动态库:在程序运行时,动态链接器会把需要的动态库加载到内存中。
- 查找函数地址:当进程第一次调用某个函数时,动态链接器会在动态库中查找这个函数的地址。这个过程叫做延迟绑定。
- 使用GOT和PLT:为了实现延迟绑定,进程会使用两个表:全局偏移表 (Global Offset Table, GOT) 和过程链接表 (Procedure Linkage Table, PLT)。这两个表中存储了函数的地址信息。(对于模块外部引用的全局变量和全局函数,用 GOT 表的表项内容作为地址来间接寻址)
- 更新GOT:当函数被第一次调用时,动态链接器会把函数(不在代码段中)的真实地址写入GOT。之后的调用就可以直接从GOT中读取地址,而不需要再次查找。
C++静态库与动态库执行过程深入的更多相关文章
- Windows下静态库、动态库的创建和调用过程
静态库和动态库的使用包括两个方面,1是使用已有的库(调用过程),2是编写一个库供别人使用(创建过程).这里不讲述过多的原理,只说明如何编写,以及不正确编写时会遇见的问题. //注:本文先从简单到复杂, ...
- 动态库连接器–动态库链接信息(Mach-O文件格式和程序从加载到执行过程)
section cmd 说明 举例 __text 主程序代码 __stubs 用于动态库链接的桩 __stub_helper 用于动态库链接的桩 __cstring 常亮字符串符号表描述信 ...
- C++ 系列:静态库与动态库
转载自http://www.cnblogs.com/skynet/p/3372855.html 这次分享的宗旨是——让大家学会创建与使用静态库.动态库,知道静态库与动态库的区别,知道使用的时候如何选择 ...
- C++静态库与动态库
C++静态库与动态库 这次分享的宗旨是--让大家学会创建与使用静态库.动态库,知道静态库与动态库的区别,知道使用的时候如何选择.这里不深入介绍静态库.动态库的底层格式,内存布局等,有兴趣的同学,推荐一 ...
- Linux下Gcc生成和使用静态库和动态库详解(转)
一.基本概念 1.1什么是库 在windows平台和linux平台下都大量存在着库. 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行. 由于windows和linux的平台不同( ...
- VS中Debug和Realease、及静态库和动态库的区别整理(转)
原文出自:http://www.cnblogs.com/chensu/p/5632486.html 一.Debug和Realease区别产生的原因 Debug 通常称为调试版本,它包含调试信息,并且不 ...
- 在Linux下如何使用GCC编译程序、简单生成 静态库及动态库
最近在编写的一个Apache kafka 的C/C++客户端,,在看他写的 example中,他的编译是用librdkafka++.a和librdkafka.a 静态库编译的,,,而我们这 ...
- VS中Debug和Realease、及静态库和动态库的区别整理
一.Debug和Realease区别产生的原因 Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序.Release 称为发布版本,它往往是进行了各种优化,使得程序在代码 ...
- Linux下Gcc生成和使用静态库和动态库详解
参考文章:http://blog.chinaunix.net/uid-23592843-id-223539.html 一.基本概念 1.1什么是库 在windows平台和linux平台下都大量存在着库 ...
- C语言中静态库和动态库笔记
库 库,故名思议,是存放东西的地方,其中存放的东西可以被多个人公用. 程序中借用库的概念,描述将代码进行抽取,这种代码被大多数程序使用, 其过程具有一定的模块化.封装.抽象的特征. 按照库的使用方式, ...
随机推荐
- java方法的定义与执行
java中的方法在类中定义. 定义方法格式: 访问修饰符 返回值类型 方法名(参数列表){ ... 执行内容 ... return 返回值; } 访问修饰符:表示方法在哪里能被 ...
- NC65元数据添加七彩版时注意点
元数据添加七彩版时注意点 元数据七彩版模式 --- 主要添加Xml文件调整格式 添加时注意点如下 手动创建Panel时 自动生成的实现方法中有一个方法的返回值一定要为true 该方法主要是控制显不显示 ...
- IDEA插件(1 UI美化)
一.IDEA 插件怎么安装?(图文讲解) IntelliJ IDEA 支持丰富的插件,熟练使用相关插件,能够有效提高我们的开发效率以及用户体验.那么,要如何在 IDEA 中安装插件呢?这里有两种方式: ...
- CentOS7 安装Python3.9以上版本时。编译报错,原因是openssl版本低
openssl-1.1.1安装 1.前因 python 导入clickhouse_driver需要import ssl和_ssl,报错 File"/home/oracle/python3/l ...
- 6.elasticsearch中search template和alias
什么是search template 顾名思义,查询模版,就是提前设定好查询的DSL,再次查询时,只需要指定对应的模版,然后传入相应的参数就好.一是可以每次不用构建复杂的DSL,二是可以供开发直接使用 ...
- AI与低代码解锁无限可能
前言 近年来,人工智能(AI)和低代码开发技术逐渐成为数字化转型的重要推动力.AI作为一项具有革命性潜力的技术,正在改变我们生活的方方面面.而低代码开发则提供了一种快速构建应用程序的方法,使得开发者无 ...
- 借问变量何处存,牧童笑称用指针,Go lang1.18入门精炼教程,由白丁入鸿儒,go lang类型指针(Pointer)的使用EP05
指针是指什么?指针是存储另一个变量的内存地址的变量.变量是一种使用方便的占位符,用于引用计算机内存地址,一个指针变量可以指向任何一个值的内存地址它指向那个值的内存地址.类比的话,指针就是书籍中的目录, ...
- 华为IoT首席架构师王启军:全栈工程师“养成记”
在王启军的公众号里,有一篇<My Team>的文章,里面记录了早年他所带团队成长的心得. 这个被他称为完美组合的团队,并不是来自大厂名企,彼时王启军给不起高待遇,团队核心成员中还有很多人是 ...
- openGauss数据库在CentOS上的安装实践
本文分享自华为云社区<openGauss数据库在CentOS上的安装实践>,作者:Gauss小松鼠 . 1.安装前准备 安装数据库前先要有已安装centOS 7.6的服务器+数据库安装包. ...
- 【新春特辑】发压岁钱、看贺岁片、AI写春联……华为云社区给大家拜年了
摘要:充电团聚云上见,顺便攒攒压岁钱. 春!节!倒!计!时!啦! 农历新年即将到来,热闹的过年氛围逐渐弥漫,华为云社区先给大家拜个早年,祝所有小伙伴们新春快乐,牛年大吉! 回望2020年,社区涌现了许 ...