Linux入门---动静态链接
创始人
2025-05-30 07:35:09

目录标题

  • 背景了解
  • 举例了解动态库
  • 举例了解静态库
  • 动态库的优缺点
  • 静态库的优缺点
  • 如何查看动静态链接
  • 如何使用静态链接
  • 系统给我们的支持

背景了解

我们写的代码在运行的的时候会经历四个阶段分别为:预处理,编译,汇编,链接。其中前三个阶段干的事情就是将我们写的高级语言代码翻译成为计算机看的懂的二进制语言,虽然第三个阶段生成的文件中的内容是二进制的,但是该文件依然是无法正常的运行,这是因为我们写的代码中用到了很多c标准库中的函数比如说main,printf,scanf等等,这些函数没有在我们写的代码完成定义,所以汇编生成的二进制文件是无法正常运行的,所以这里就会存在第四步:链接。c语言中有个东西叫做c标准库,在这库里面定义了c语言中所有的函数,我们说汇编生成的二级制文件中缺乏函数的定义,而c标准库中又恰好存在函数的定义,所以第四步的链接就是将这个库中的内容和我们自己写的代码关联起来,这样就能生成一个可执行程序,而我们这篇文章要讨论的就是有哪些关联的方式,以及不同的关联方式所带来的优缺点有哪些,好接下来我们先通过一个例子来带大家了解了解不同的链接方式,

举例了解动态库

在这里插入图片描述
小王是一个高中生,他的高中是xxx一中,这个高中是一个封闭式高中,该高中里面的每个学生都必须得住宿,并且这个学校放假也放的非常的离谱,每一个月才放一次假并且每次只放一天假,而小王他的家离学校非常的远,来回一趟得耗时8个小时,所以每次学校放假的时候小王都不会回家而是在寝室里面自己安排计划来消磨时光。学校的大门往前走100米然后右拐再走200米有一个个黑网吧,这个网吧允许未成年人前来上网所以每次放假都会有很多该学校的人前来上网来放松放松。小王是一个十分有计划的人,每次放假的前一天都会先把计划安排好再按照顺序一个一个的执行。在放假前一天小王这么安排了明天的计划,上午学习语文英语数学英语,下午就想上个网,等到晚上的时候就去吃个饭,最后刷个题睡觉,没过多久就放假了小王开始按照自己的计划一个一个的执行,由于小王在宿舍所以对于上午的计划他完成的得心应手因为宿舍中有他需要的资料以及课本所以他很快就完成了上午的计划,可是到了下午小王就犯了难,他给自己安排的计划是上网,但是学校里面没有任何高级一点的电脑,所以这时他就拿起自己的洛基亚给去过校外的黑网吧的同学打了个电话询问了一下网吧的路线,于是小王就按照同学提供的路线前往了那个黑网吧,在里面开了一台13代i9加4090的机子开始执行了自己的计划,过了几个小时小王结束了自己的上网时间,按照来时候的路线原路返回了自己的学校,开始完成自己接下来的任务。到这里我们的故事就讲了一半了,这里的任务清单就相当于我们写的各种程序,程序从上到下依次执行,在程序执行的过程中有一部分是他自己可以做的,但是有些部分却得借助其他的帮助,这就相当于故事中小王可以一个人在宿舍里学习语文英语数学和刷题因为有书有资料有资源,但是小王要是想上网的话就必须得借助网吧的帮助因为学校里面什么都没有,这里的网吧就相当于c语言的库,这里的小王想去上网得出校门到网吧里去就相当我们的程序执行到一定的位置,发现有个函数调用这里没有,那么计算机就会跑到库里面去查找这个函数并执行对应的函数调用,最后将计算的结果进行放回值并执行往后的其他操作那么我们把这里的由本程序跳转到库函数,再由库函数跳转到本程序的过程称之为库函数跳转。当年你打电话给你的学长这里的学长就相当于编译器内部的链接器。你的学长告诉你网吧的路线,那么这里的路线就相当于跟库建立链接。小王每次上网都得先下宿舍楼然后出校门,按照指定的路线前往网吧,然后跟网管进行沟通并开机,最后上完网按照来时候的路线进行返回的链接方式称之为动态链接。

举例了解静态库

有一天小王依然在寝室里面完成自己的计划,然后就当小王准备约着同学去网吧一起happy的时候,同学就跟他说那个网吧已经被警察查封了我们不能去上网了,这时小王就一下子心灰意冷感觉人生不值得了,但是没过一会小王的爸爸大王突然来到了他们寝室给小王带来了一款跟网吧一摸一样的电脑,经过询问小王知道了原来网吧在被警察查封了以后,网吧的老板就把当年小王最喜欢的电脑卖给了大王,然后大王就带着这个电脑来到了小王的宿舍帮小王安装好各种网线电源之类的设备 ,这样小王就可以在宿舍里面使用电脑上网打游戏了,不用大老远的前往外面的网吧,那么这种将网吧里面的电脑放到自己宿舍里面,不用大老远跑去网吧里面完成自己的计划的方式我们就称之为静态链接,静态链接在链接的时候不是产生关联而是将我们程序的内部要用到的方法,给我的程序拷贝一份,就完成了静态连接

动态库的优缺点

我们来思考几个问题:

  1. 网吧可能会进行升级改造,那这个升级改造会影响小王上网吗?
  2. 如果有一天网吧被取缔了,被警方查封换了一家正规的网吧的话,会影响小王上网吗?
  3. 小王每次上网都要出校门走很长的路,那么行走的这段过程会影响小王的时间吗?

我们都知道门面在装修升级的时候都是无法营业的,所以当网吧升级改造的时候肯定会影响到小王上网。当网吧被取缔的时候小王的上网肯定会受到很大的影响,毕竟学校方圆10公里内没有任何的网吧。小王每次上网都得出校门走很长时间的路,小王又没有电动车所以小王在上网的时候肯定会浪费很多宝贵的时间在路上。那么这里的几个问题对应到我们的操作系统上就是当我们的动态库在升级的时候,当动态库不小心被我们给删除的时候都会影响我们的程序正常的运行,但是动态库有个优点就是动态链接生成的可执行程序十分的小非常的节省磁盘和内存的空间,并且这个程序在被别人下载的时候也会节约很多的时间。

静态库的优缺点

同样有这么几个问题:

  1. 网吧可能会进行升级改造,那这个升级改造会影响小王上网吗?
  2. 如果有一天网吧被取缔了,被警方查封换了一家正规的网吧的话,会影响小王上网吗?
  3. 小王每次上网都要出校门走很长的路,那么行走的这段过程会影响小王的时间吗?
  4. 小王将电脑搬到自己的寝室里面会占用空间吗?

小王这个时候有了电脑,所以不管网吧是升级改造还是被警察查封都不会影响到小王的正常上网,因为有了电脑所以小王在上网的时候就不用走很长路前往网吧,所以小王很多的时间就不会被浪费在路上,但是小王在寝室里面安装了一个电脑,这个电脑有主机有显示屏还得有个桌子来盛放电脑,而且寝室的空间还不大,所以这个电脑会占用很多的空间使我们的寝室变得非常的狭窄。那么这里对应在操作系统的意义就是静态链接不受库升级或者被删除的影响,劣势就是形成的可执行程序的大小很大,会在内存磁盘上占有很多的空间,并且别人在下载这个程序的还会浪费很多的时间,还有个缺点就是当我们写了10个程序这10个程序都使用了printf函数并使用静态链接的话,那这里是不是就要将库中的printf函数的定义拷贝10遍到你的10个文件里面呀,那这样的话是不是就会照成其中的9遍的拷贝都是多余的啊,如果是这样的话是不是就会照成代码的冗余的情况啊,所以这也是一个缺点。

如何查看动静态链接

首先我们随便写一个c语言程序并将其运行:
在这里插入图片描述
在这里插入图片描述
然后大家使用file指令查看这个文件的时候就可以看到这里有这么一句话:dynamiclly link
在这里插入图片描述

那么这句话表示的意思就是该文件采用的链接方式是动态链接,然后在这句话的后面有个括号,这个括号里面的内容是uses share libs表明的意思就是这个文件依赖了库,如果我们想要查看这个文件依赖的是哪个库的话就可以使用下面的这个指令:ldd mytest
在这里插入图片描述
我们可以看到这个指令显示了mytest这个文件依赖了哪些库,这里大家要知道的一点就是动态库的形式为:libXXXXX.so,静态库的形式为libYYYYY.a,我们去掉形式的前缀和后缀剩下的就是这个库的名称,那么这里库的形式为libc.so.6,我们去掉前缀lib再去掉后缀.so.6那么剩下的就是c,所以这里库的名字就是c,所以这个可执行程序所依赖的库就是c标准库,我们平时使用的头文件stdio和一些printf scanf函数都会调用这个c标准库,并且上述的ldd指令还显示了这个库所在的位置为:/lib64/libc.so.6那么这里我们就可以使用ls指令加-l选项来查看一下这个文件的属性:
在这里插入图片描述
我们可以看到这个文件是一个链接文件,并且链接的文件是lib-2.17.so,我们再来使用ls指令加 -al选项查看一下这个被链接的文件就可以可以看到真正的c标准库:
在这里插入图片描述
ldd指令可以查看文件所依赖的库是什么,那么这里我们可以用ldd指令查看一些我们平时使用的指令依赖的都是什么库:
在这里插入图片描述
仔细的观察大家不难发现我们平时使用的基本指令都会依靠动态的c标准库,那么这里就会有个问题,既然我们知道c标准库的位置,那我们能删除这里的c标准库吗?答案很明显是不能的,因为用这个标准库的程序非常的多,但是这个标准库却只有一份,如果我们删除了这个c标准库的话就会导致很多可执行程序无法正常的运行,并且因为这个库只存在一份所以我们所有用c语言写的程序,都不会出现重复的库代码,所以我们又把动态库称之为共享库,以后我们要是下载一个c语言写的程序的时候就不用再下载c语言标准库,所以这在一定的程度上节约了我们下载所需要的空间和时间。并且在默认生成可执行程序的情况下,操作系统一般都是采用动态链接的方式来进行链接。

如何使用静态链接

gcc默认采用的链接方式是动态链接,如果我们想要采用静态链接来生成可执行程序的话就得加上-static选项,比如说下面的操作:
在这里插入图片描述
但是这里编译的时候出现了错误,原因是因为当前的机器上面没有静态的c标准库,所以要想生成静态链接的可执行程序,我们就得先下载静态的c标准库:

sudo yum install -y glibc-static

下载完之后我们再执行以下上面的操作就可以看到这里可以正常的生成静态的文件:
在这里插入图片描述
大家仔细观察就可以看到这个静态文件的大小非常非常的大比动态链接的大小大很多,并且我们使用file查看这个文件的时候可以看到下面不再显示dynamiclly link 而是statically linked,那么这就表示的是静态链接
在这里插入图片描述
静态链接在拷贝的时候拷贝的并不是.so内部的代码,而是系统中必须存在的.a结尾的静态库中的代码。
在这里插入图片描述
这个就是c语言的静态库,一般而言系统都会自动携带动态库因为系统的运行得需要动态库支持,但是静态库有些机器上是没有的,如果没有的话大家得自行下载。

系统给我们的支持

系统给我们提供了标准库也就是.h结尾的文件,这个文件的主要作用是告诉我们使用者这些函数该如何去使用,系统还给我们提供了标准的动静态库.so .a 这个库告诉我们的意思就是这些函数的方法实现我都有,如果你要用的话你得通过链接的方式来找我,那么我们写程序的过程就是用着别人告诉我们的用法,然后使用别人实现的方法来执行我们自己写的程序,也就是:我的代码+库的代码=可执行程序。那么这就是系统提供给我们的支持。

相关内容

热门资讯

【实验报告】实验一 图像的... 实验目的熟悉Matlab图像运算的基础——矩阵运算;熟悉图像矩阵的显示方法࿰...
MATLAB | 全网最详细网... 一篇超超超长,超超超全面网络图绘制教程,本篇基本能讲清楚所有绘制要点&#...
大模型落地比趋势更重要,NLP... 全球很多人都开始相信,以ChatGPT为代表的大模型,将带来一场NLP领...
Linux学习之端口、网络协议... 端口:设备与外界通讯交流的出口 网络协议:   网络协议是指计算机通信网...
kuernetes 资源对象分... 文章目录1. pod 状态1.1 容器启动错误类型1.2 ImagePullBackOff 错误1....
STM32实战项目-数码管 程序实现功能: 1、上电后,数码管间隔50ms计数; 2、...
TM1638和TM1639差异... TM1638和TM1639差异说明 ✨本文不涉及具体的单片机代码驱动内容,值针对芯...
Qt+MySql开发笔记:Qt... 若该文为原创文章,转载请注明原文出处 本文章博客地址:https://h...
Java内存模型中的happe... 第29讲 | Java内存模型中的happen-before是什么? Java 语言...
《扬帆优配》算力概念股大爆发,... 3月22日,9股封单金额超亿元,工业富联、鸿博股份、鹏鼎控股分别为3.0...
CF1763D Valid B... CF1763D Valid Bitonic Permutations 题目大意 拱形排列࿰...
SQL语法 DDL、DML、D... 文章目录1 SQL通用语法2 SQL分类3 DDL 数据定义语言3.1 数据库操作3.2 表操作3....
文心一言 VS ChatGPT... 3月16号,百度正式发布了『文心一言』,这是国内公司第一次发布类Chat...
CentOS8提高篇5:磁盘分...        首先需要在虚拟机中模拟添加一块新的硬盘设备,然后进行分区、格式化、挂载等...
Linux防火墙——SNAT、... 目录 NAT 一、SNAT策略及作用 1、概述 SNAT应用环境 SNAT原理 SNAT转换前提条...
部署+使用集群的算力跑CPU密... 我先在开头做一个总结,表达我最终要做的事情和最终环境是如何的,然后我会一...
Uploadifive 批量文... Uploadifive 批量文件上传_uploadifive 多个上传按钮_asing1elife的...
C++入门语法基础 文章目录:1. 什么是C++2. 命名空间2.1 域的概念2.2 命名...
2023年全国DAMA-CDG... DAMA认证为数据管理专业人士提供职业目标晋升规划,彰显了职业发展里程碑及发展阶梯定义...
php实现助记词转TRX,ET... TRX助记词转地址网上都是Java,js或其他语言开发的示例,一个简单的...
【分割数据集操作集锦】毕设记录 1. 按要求将CSV文件转成json文件 有时候一些网络模型的源码会有data.json这样的文件里...
Postman接口测试之断言 如果你看文字部分还是不太理解的话,可以看看这个视频,详细介绍postma...
前端学习第三阶段-第4章 jQ... 4-1 jQuery介绍及常用API导读 01-jQuery入门导读 02-JavaScri...
4、linux初级——Linu... 目录 一、用CRT连接开发板 1、安装CRT调试工具 2、连接开发板 3、开机后ctrl+c...
Urban Radiance ... Urban Radiance Fields:城市辐射场 摘要:这项工作的目标是根据扫描...
天干地支(Java) 题目描述 古代中国使用天干地支来记录当前的年份。 天干一共有十个,分别为:...
SpringBoot雪花ID长... Long类型精度丢失 最近项目中使用雪花ID作为主键,雪花ID是19位Long类型数...
对JSP文件的理解 JSP是java程序。(JSP本质还是一个Servlet) JSP是&#...
【03173】2021年4月高... 一、单向填空题1、大量应用软件开发工具,开始于A、20世纪70年代B、20世纪 80年...
LeetCode5.最长回文子... 目录题目链接题目分析解题思路暴力中心向两边拓展搜索 题目链接 链接 题目分析 简单来说࿰...