linux的静态链接和动态链接程序有什么区别

恰好之前我写过一篇文章讨论,下面摘录一部分。

动态链接库和静态链接库

使用我们按照之前几节配置好的 vim 输入以下代码:

// 文件名

t.c

#include <stdio.h>

int main()

{

printf("hello embedTime ");

return 0;

}

这段代码包含了 stdio 头文件,调用了库函数 printf,所以编译它肯定会使用链接库。linux 系统有两种链接库,一种常常被称为“静态链接库(static library)”,还有一种常被称作“动态链接库(shared library)”。

动态链接是应用非常广泛的方式。动态链接库的英文字面意思可以翻译为“共享的库”,的确如此,使用动态链接库的程序在加载时,linux 内核会检查程序用到的库是否已经在内存中,如果在,则 linux 内核不再重新加载库,直接就执行程序了。所以,多个程序可以共享一个库,这实际上可以节约资源。

对于静态链接库来说,程序链接时会将其作为程序的一部分,因此最终生成的可执行程序相比于动态链接方式,会更大一点。

编译上面的程序:

# gcc t.c -o shared.out

这条编译语句使用的是动态链接方式。为 gcc 命令附加 -static 命令,可以以静态链接方式编译程序:

# gcc t.c -static -o static.out

现在我们查看一下这两种链接方式生成的可执行程序大小对比:

# ls -ahltotal 888Kdrwxr-xr-x 3 root root 4.0K Dec 17 22:40 .drwxr-xr-x 8 root root 4.0K Dec 11 10:28 ..drwxr-xr-x 2 root root 4.0K Dec 17 22:39 his-rwxr-xr-x 1 root root 8.4K Dec 17 22:40 shared.out-rwxr-xr-x 1 root root 857K Dec 17 22:40 static.out-rw-r--r-- 1 root root 76 Dec 17 21:37 t.c

很容易看出,使用静态链接方式生成的可执行程序,要比使用动态链接方式生成的可执行程序大 100 多倍。虽然几百 KB 对于大多数 linux 主机来说不算什么,但是嵌入式系统资源一般都非常紧缺,这时再轻易使用静态链接就非常奢侈了。

使用静态链接也是有好处的,生成的可执行程序能够脱离库独立运行,而使用动态链接的可执行程序则不能脱离库独立运行。

静态链接和动态链接的可执行程序,执行过程有哪些不同

上面讨论了 linux 中程序链接的两种方式,既然可执行程序体积相差这么多,那它们的执行过程也应该有所差异了?的确如此,现在我们一起来分析下。在linux中分析程序的执行过程,可以使用 strace 命令。

先分析 shared.out,我们输入 strace ./shared.out,会发现有一大堆输出信息:

# strace ./shared.outexecve("./shared.out", ["./shared.out"], [/* 22 vars */]) = 0brk(0) = 0x1a66000access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3fstat(3, {st_mode=S_IFREG|0644, st_size=33518, ...}) = 0mmap(NULL, 33518, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fe241ff2000close(3) = 0access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3read(3, "ELF>P "..., 832) = 832fstat(3, {st_mode=S_IFREG|0755, st_size=1857312, ...}) = 0mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fe241ff1000mmap(NULL, 3965632, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fe241a10000mprotect(0x7fe241bce000, 2097152, PROT_NONE) = 0mmap(0x7fe241dce000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1be000) = 0x7fe241dce000mmap(0x7fe241dd4000, 17088, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fe241dd4000close(3) = 0mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fe241fef000arch_prctl(ARCH_SET_FS, 0x7fe241fef740) = 0mprotect(0x7fe241dce000, 16384, PROT_READ) = 0mprotect(0x600000, 4096, PROT_READ) = 0mprotect(0x7fe241ffb000, 4096, PROT_READ) = 0munmap(0x7fe241ff2000, 33518) = 0fstat(1, {st_mode=S_IFCHR|0600, st_rdev=makedev(136, 2), ...}) = 0mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fe241ffa000write(1, "hello embedTime ", 16hello embedTime) = 16exit_group(0) = ?+++ exited with 0 +++

这些输出信息即为 linux 执行程序的过程。每一个函数,都可以通过 man 命令查询其手册。几个主要的过程如下:

就是加载库到内存,再执行程序,最后调用系统调用 exit 结束程序。

现在再来看看静态链接的程序 static.out,同样使用 strace 命令查看:

# strace static.out

可以看出,因为链接时,编译器直接把静态库作为程序的一部分了,所以这里相比于动态链接的程序,少了很多将库映射到内存的操作:

到这里,动态链接和静态链接程序执行时的不同点,就清楚了。

欢迎在评论区一起讨论,质疑。文章都是手打原创,每天最浅显的介绍C语言、linux等嵌入式开发,喜欢我的文章就关注一波吧,可以看到最新更新和之前的文章哦。

版权声明:本文来自用户投稿,不代表【小灵猫网】立场,本平台所发表的文章、图片属于原权利人所有,因客观原因,或会存在不当使用的情况,非恶意侵犯原权利人相关权益,敬请相关权利人谅解并与我们联系(邮箱:dandanxi6@qq.com)我们将及时处理,共同维护良好的网络创作环境。

(0)
上一篇 2022年12月02日 09:40
下一篇 2022年12月02日 09:47

相关推荐

  • 欧洲文艺复兴起源于哪个国家

    其实起源很内涵。13世纪以前,欧洲还处在黑暗的中世纪,有多黑暗?教会和骑士领主相互勾结,教会宣传一神论,原罪,赎罪理论,加强其实贵族统治,骑士负责圈地征税,暴力执法。中世纪的教廷生活极其优越,建造巨大的教堂,消费着最顶端的物质和精神资料。而骑士贵族低一个档次,修建城堡、要塞、庄园…

    2023-09-04
  • 2023年注册建筑师有用吗,考一个建筑师证有用吗

    我以为,建筑设计师本质上是艺术家,画家用画笔作二维图像,而建筑师用建筑材料进行三维创作。知名建筑师,就跟著名画家一样,应该带着浓烈的个人风格,建筑只不过是他们表达自我的一种方式。青山周平却说,真正好的建筑师,他的“自我”是很小的。建筑师自己想表达什么,可能是建筑设计中最不重要的因…

    综合百科 2023-09-04
  • 中国历史上寿命最长的皇帝是谁(中国历代皇帝寿命最长是谁)

    盘点中国历史上寿命最长的五个皇帝1、乾隆(1711-1799),姓爱新觉罗,名弘历,是雍正第四子。他25岁登基,在位60年,禅位后又任三年零四个月太上皇,实际掌权长达63年零4个月,是中国历史上实际执掌国家最高权力时间最长的皇帝,同时他以89岁高龄称为中国历史上最长寿的皇帝。乾隆…

    2023-09-04
  • ipad2017是一款怎样的ipad

    iPad2017是苹果于2017年上架的一款平板,之所以说是上架而不是发布,是因为这款平板可以虽然看成是iPad Air 2的升级款,但是有些地方又有所退步。但是如果想购买的话,还是推荐购买的。新iPad使用了与iPhone 6s相同的A9处理器(包含M9协处理器)。因此在速度上…

    2023-09-04
  • 马超死因究竟是什么呢(马超的死因是什么)

    最流行的说法是,马超忧郁过度而去世。马超心情抑郁是肯定的,我们要知道的是,他为什么心情抑郁?是因为刘备对他的冷落?马超归降刘备以后,刘备对他可是敬若上宾的。群臣联名上奏请求朝廷封刘备为“汉中王”时,马超排名首位的;刘备称帝时,封马超为骠骑将军,这可是蜀汉的最高军职了。就连张飞也不…

    2023-09-04
  • 一滴水中有多少微生物答案(一滴水中就有多少微生物)

    在生物课上你可能已经做过这个实验了:从池塘里取一些水来,用滴管吸一些,小心地滴一滴到载玻片上,再盖上盖玻片,然后迫不及待地将其放在显微镜下进行观察……你会看到在这一滴池塘水中,有很多奇妙又微小的生物在里面游动。这些只有在显微镜下才能够被我们观察到的生物,就是“微生物”。 你一定认…

    2023-09-04
  • 王牌特工2好看吗

    一个不可否认的事实是:续集、前传和番外往往被视为“电影已死”的证明,而无论国内外,都如此热衷发展续集电影完全是因为太好赚钱。但话说回来,续集电影并非一无是处,佳作也不在少数。尤其今年年初,好莱坞续集电影的排片陆续发布,我们就知道这是一个“续集大年”。而2015横扫全球的《王牌特工…

    2023-09-04
  • 黑乌龙的功效和作用

    黑乌龙茶不仅对健康有很大的好处,还因为其含有茶多酚,喝完会口齿留香。黑乌龙茶的功效不仅具有提神益思,消除疲劳、生津利尿、解热防暑、杀菌消炎、解毒防病、消食去腻、减肥健美等保健功能,还突出表现在防癌症、降血脂、抗衰老等特殊功效。乌龙茶的药理作用,突出表现在分解脂肪、减肥健美等方面。…

    综合百科 2023-09-04
  • 人类可能移居开普勒452b吗,人类如何到达开普勒452b

    按照目前的科技水平,人类很难移居到开普勒452B星球,首先是因为开普勒452B距离太远,很难搬家。再者即使可以去它也未必宜居,我们具体来分析一下。在距离地球1400光年之外,NASA发现了一颗与地球非常类似的星球开普勒452b,这个星球的直径是地球的1.6倍,而且它所在的恒星系,…

    2023-09-04
  • 计算机系统都有什么,计算机一级查询系统

    计算机系统的组成从诞生至今大体结构没有发生太大变化,主要由两大部分组成:一个是硬件系统,二是软件系统,具体分为:一、计算机硬件系统计算机硬件系统主要分为运算器、控制器、存储器、输入设备、输出设备五大部分。这五大部分密切配合,分工合作完成各种数据处理和计算,我们平时使用电脑不论是工…

    2023-09-04