程序员的自我修养第七章——动态链接 (上)

news2025/1/16 12:37:20

       继续更新《程序员的自我修养》这个系列,主要是夏天没把它看完,补上遗憾。本篇来自书中第七章。

        再说动态链接前,我们先阐明为什么要动态链接:

        动态链接的产生来自静态链接的局限性。随着静态链接的发展,其限制也越来越大,如浪费空间、模块更新困难等问题暴露了出来。使得人们不得不寻找其他方法,动态链接应运而生。

目录

7.1 动态链接基本介绍

7.2 简单的动态链接

7.3 地址无关代码

未完待续


7.1 动态链接基本介绍

        如上图,静态链接中,progran1和program2都用到了Lib.o,他们分别将Lib.o加到代码内容里并在运行时内存中有两份Lib.o分别来自这两个程序。

        对于程序的开发和发布,静态链接有两个缺点:1. 如果Lib.o来自其他开发团队,他们更新了其中的bug并修改重新发版了,我们作为使用方必须跟进发版,如果我们使用到类似Lib.o的其他lib呢,是不是每个lib发版我们都跟进呢?2. 如果我们使用到了20个公共库里的lib,静态链接将其都装在起来就是20M,这还不算我们自己开发的内容。

动态链接简介:

        动态链接的思想是将程序分割开来,以上图为例:系统将program1装载到内存中,发现它依赖Lib.o,于是将Lib.o也装进去,如果还有什么别的依赖通通装载进去,这个过程和静态链接一样。不同的地方在将program2装载进去后,系统发现内存里已经有了一份Lib.so,那么程序只需将program2和内存里的Lib.o链接起来就好了。

对于程序的拓展性与兼容性来讲。动态链接思想就是插件思想,只有在使用时才装载到内存,可以使用插件思想做程序拓展。动态链接还加强程序的兼容性,如A操作系统和B操作系统对于printf的实现不同,只需操作系统A和B都能提供一个printf的动态链接库。

动态链接在操作系统的实际实现上更为复杂,主流操作系统都支持动态链接,在Linux中被称为动态共享对象(dynamic shared objects),一般以.so为结尾。windows中叫动态链接库(dynamic linking library),文件名以.dll结尾。本质上讲执行程序和动态链接程序本质上都是指令和数据,我们尽可以将其看作他们为平等的程序模块。

linux系统中C语言运行库为glibc,他的动态链接库在/lib下,名字为libc.so,当程序被装载时,系统的动态链接器会将程序所需要的动态链接库装载到地址空间,并将所有未决议的符号绑定到动态链接库中,最后进行重定位工作。这块可以理解为将运行程序中没有找到实现的部分去动态链接库里找,如果没找到,外部链接报错,在visual stadio中很常见了。

我们都知道不可能三角,在程序中也同样成立,动态链接也不是一味的好。首先,早期的动态链接由于协议不全、规范不统一导致互相不兼容。其次,动态链接相比静态链接,链接过程在程序装载的时候,程序每次装载前都要重新链接,对程序运行效率有影响。

7.2 简单的动态链接

简单的例子四段代码:program1.c、program2.c、lib.h、lib.c.

使用命令gcc -fPIC -shared -o Lib.so Lib.c生成Lib.so

再编译program1和program2:

gcc -o program1 program1.c ./Lib.so

gcc -o program2 program2.c ./Lib.so


过程图:

        链接器在符号链接时找到foobar。

        对比静态链接的虚拟地址映射到物理地址,动态链接更复杂。静态链接只将一个文件整体映射到物理内存中。

为了方便查看地址空间,修改代码:

        查看虚拟地址空间分布:

        用readIf来查看Lib.so的装载属性和普通执行文件没区别,但是它地址是从0x00000000开始的,实际不是从这,这意味着动态链接地址在编译时不确定,在装载时根据当前空间去分配。

7.3 地址无关代码

        装载时重定位。

     我们在静态链接时提到过链接重定位(link time relocation),现在为装载重定位(load time relocation),在windows 这种装载时重定位又叫做基址重制(Rebasing),linux的GCC支持这种装载时重制的方法,使用-shared那么输出对象就是使用装载时重定位方法。

        地址无关代码

       

 

        汇编分析:

  1. 模块内部调用跳转:

未完待续

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/178426.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

十二、创建和管理表

文章目录一、基础知识1.1 一条数据存储的过程1.2 标识符命名规则1.3 数据类型及数据库操作二、创建表三、查看表结构3.1 使用 SHOW COLUMNS 语句查看3.2 使用 DESCRIBE 语句查看3.3 查看表详细结构语句 SHOW CREATE TABLE四、修改表结构4.1 添加新字段和修改字段定义4.2 修改字…

用户画像增量更新系列二

进行用户日志数据处理 原始日志数据 结果: 思路:按照user_id的行为一条条处理,根据用户的行为类型判别。 由于sqlDF每条数据可能会返回多条结果,我们可以使用rdd.flatMap函数或者yield 格式:["user_id", "action…

总结:计算机中字符串比较大小的规则

总结:计算机中字符串比较大小的规则一背景:二Unicode编码表:字符越靠后,对应的十进制值越大三单个字符之间比较规则:四案例演示:单个字符与单个字符之间比较大小1.前提:汉字“一”与汉字“万”&…

Elasticsearch:Elasticsearch percolate 查询

Elasticsearch 通常如何工作? 我们将文档索引到 Elasticsearch 中并对其运行查询以获得满足提供的搜索条件的文档。 我们构造一个匹配或术语查询作为输入,匹配查询的文档作为结果返回。 但这不是 percolate query 的情况..... 让我们看看这篇文章中的 p…

10.Java方法学习知识点大全

文章目录前言一、什么是方法1.什么是方法?2.实际开发中,什么时候用到方法?3.实际开发中,方法有什么好处?二、最简单的方法定义和调用1.方法的格式2.方法的调用3.看代码说结果4.为什么要有带参数的方法呢?三、带参数的方法定义和调用1.带参数的方法定义和调用2.形参和实参3.…

NuSphere PhpED Pro 19.5 Crack

PhpED是PHP(PHP IDE),HTML,CSS,XML,SMARTY,XHTML等的I ntegated Development Environment。 高级代码编辑器、可靠的 dbg 调试器、高效的数据库连接客户端以及快速安全的部署能力的平衡组合使 P…

90. 注意力分数及代码实现

1. 注意力分数 2. 拓展到高维度 3. Additive Attention ps: 这种的好处是,key,value,query的长度可以不一样 4. Scaled Dot-Product Attention n个query,m个key-value 对最后的结果是n x m的矩阵,第i行就表…

LeetCode[684]冗余连接

难度:中等题目:树可以看成是一个连通且 无环 的 无向 图。给定往一棵 n个节点 (节点值 1~n) 的树中添加一条边后的图。添加的边的两个顶点包含在 1到 n中间,且这条附加的边不属于树中已存在的边。图的信息记录于长度为 n的二维数组…

Python 压缩 css 文件,第三方模块推荐

本篇博客为大家详细介绍一下如何在 Python 中压缩 CSS 文件。 正式开始前,需要准备一个未压缩过的 CSS 文件。 Python 压缩 csscsscompressor 库使用在 Flask 中压缩 css 文件cssmin 库的用法rcssmin 库的用法总结csscompressor 库使用 在 Python 中可以使用多种方…

CSS之浮动以及清除浮动的几种方式

一. 什么是 CSS Float(浮动) CSS 的 Float(浮动),会使元素向左或向右移动,其周围的元素也会重新排列。 Float(浮动),往往是用于图像,但它在布局时一样非常有…

【大数据管理】Java实现字典树TireTree

实现字典树,支持插入和删除,能够打印每一层的数据示例数据“SJ”, “SHJ”, “SGYY”,"HGL" ,将这些数据插入前缀树,打印树,修改SHZ为SHHZ 解题思路 Trie树即字典树,又称单词查找树或键树,是一…

Linux下进程控制详解

目录 一、进程创建 1.1 初识fork 1.2 函数返回值 1.3 写时拷贝技术 1.4 fork函数的使用场景 1.5 fork函数的失败原因 二、进程终止 2.1 进程退出场景 2.2 进程退出码 2.3 进程正常退出方法 2.3.1 exit函数 2.3.2 _exit函数 2.3.3 return方法 2.3.4 方法分析对比 …

【LINUX修行之路】——工具篇gcc/g++的使用和自动化构建工具make/makefile

学习范围:✔️LINUX ✔️ gcc/g✔️make/makefile作者 :蓝色学者 文章目录一、前言二、概念什么是gcc/g?什么是make/makefile?三、教程3.1gcc/g命令3.2make/makefile依赖关系依赖方法编写makefile文件四、资源一、前言 欢迎大家来…

谷粒学院——Day20【项目总结】

❤ 作者主页:欢迎来到我的技术博客😎 ❀ 个人介绍:大家好,本人热衷于Java后端开发,欢迎来交流学习哦!( ̄▽ ̄)~* 🍊 如果文章对您有帮助,记得关注、点赞、收藏、…

计算机组成原理实验-logisim实现自动售糖机

一.作业内容; 二.设计分析: 首先我们先确定输入和输出,根据题目的提示很明显可以看出因为每次可以投入10元或者5元硬币,当总钱数达到15元或者超过15元的时候,自动出糖,并且机器不找零,所以可以看出最大的钱…

基于 V2G 技术的电动汽车实时调度策略(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

第九层(2):STL之string类

文章目录前情回顾string类string类的本质string与char*的区别string类的特点string类的构造函数string类内的字符串追加函数string类内的字符串查找函数string类内的字符串替换函数string类内的字符串比较函数string类内的字符单个访问函数string类内的插入函数string类内的删除…

最小化最大值+拓扑排序要点+概率

今天嫖来的两道题: D.ScoreofaTreeD. Score of a TreeD.ScoreofaTree E.EdgeReverseE. Edge ReverseE.EdgeReverse DDD题是比较离谱的一道题,你在做的时候好像是dp,但是选择的情况太多了,其实对于每一个节点来说,除了叶…

fpga实操训练(fpga和cpu之间的配合)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 cpu和fpga之间,各有各的优势,cpu开发比较快捷,程序员比较好找;fpga对于基础运算效率高,但是找人不好找。实际产品的开发中,一般cpu负责需要接口定义和个性化定制的地方,而fp…

【Datewhale一起吃瓜 Task3】啃瓜第四章

文章目录决策树学习过程预测过程如何划分信息熵信息增益增益率基尼指数泛化能力关键:剪枝预剪枝后剪枝比较缺失值处理:样本赋权,权重划分决策树 决策树基于“树”结构进行决策 每个内部节点对应于某个属性上的测试每个分支对应于该属性的某个…