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等嵌入式开发,喜欢我的文章就关注一波吧,可以看到最新更新和之前的文章哦。

本文来自投稿,不代表天一生活立场,如若转载,请注明出处:http://tiyigo.com/baike/2046.html

(0)
上一篇 2022-11-13 13:45
下一篇 2022-11-13 13:54

相关推荐

  • 借呗利息万2.5要什么条件

    因为我也有借,我也回答下,我的额度没有你多,利息也从来没算过,凑着你的提问我也算算我的,借贷2万,利息是1192,那么平均每月利息是99块钱,这个利息我感觉不是很多啊。 这就好比买…

    2022-11-07
  • 古代大臣常上书某个女人「狐媚于主」,古人真的修炼媚术吗

    首先,如果说一个女子被冠上“狐媚君王”的称号,那这个女子大多是承担了她不应当承担的骂名。 君王好色不理朝政,大臣为了国家着想自然会想尽办法令君王悔改,但在古代,一般没有大臣有胆量直…

    2022-11-04
  • 发挥余热,如果我退休了,如何发挥余热为社会做贡献呢

    退休生活丰富多彩 退休是人活了大半辈子,在办理退休手续后,全身心地放下曾经参加单位工作的任何事情,并全面步入日常自我支配和安排各种活动,从此开始对退休者来说最富有的莫过于赋闲时间了…

    2022-11-24
  • 如何提高大学生就业质量

    为了提高就业可能性,我从以下三个方面进行了解答,希望对你有帮助 怎么感觉问的好矛盾啊!大学生毕业一般不都会就业吗?怎么还来个可能性呀?即使人家没有就业的,人家也是有其它安排的呀?应…

    2023-05-10
  • 孙权的老婆,三国演义孙权老婆

    一代人杰孙权上承父兄开创的基业,更以睿智胆魄,联合刘备,在赤壁战役中一举击败曹操,在江东虎踞龙蟠,奠定了三分天下有其一的政治格局。于公元229年登基称帝,在位共十三年。作为东吴的开…

    2022-11-05
  • 互联网理财产品有哪些,余额类互联网理财产品

    目前互联网理财产品大多数都是跟基金产品挂钩的,这些基金产品大致可以分为三类: 一类是货币基金的产品: 如支付宝推出的余额宝、苏宁的零钱宝和为I型呢理财通等,这类产品的流动性相对高,…

    2023-06-24
  • 许嵩的胡萝卜须讲的是什么

    以下是读后感 —————————————————————— 胡萝卜须抓住鼹鼠 抛向天空 然后盯住它 盯住它直到手脚折断 抽搐翻滚 脑袋也开花 哦 胡萝卜须不够残忍 颤抖了手 热泪也…

    知识百科 2023-07-22
  • 何庆魁高秀敏爱情有那么高大上吗

    谈到何庆魁,就离不开两个女人,然而这两个他生命中最关键的女人先后离他而去了,已经70多岁的何庆魁如今孑然一身,有人说他一生坎坷可怜,有人说他就是渣男,逝者已逝,不想对女人做评判,那…

    2023-06-23
  • 学习韩语

    안녕하세요. 你好(an niong ha se yo)或许你打算赴韩旅行,或许你看了韩剧韩综韩语歌对韩国语产生兴趣~很高兴能和你分享我从零开始学韩语的体会。因为我曾经也是从零开始…

    知识百科 2022-11-22
  • 你为什么喜欢李宇春,为什么有的人喜欢李宇春

    李宇春(Chris Lee),1984年3月10日出生于成都,是一名全面发展的多栖艺人,是中国流行女歌手、演员、词曲创作人、演唱会导演、玉米爱心基金终身形象代言人。 2005年登上…

    2023-06-18