动态链接,程序内部的共享单车

前言

在之前说过,程序的编译过程是,编译,汇编,链接,前面的两种方式我们已经充分的理解过了,现在我们来说说我们的链接过程,我们很多时候要做到代码的复用,我们就需要链接不同的库。

这么来说,我们链接的过程就有点像生活中标准化,模块化的生产,我们通过工厂去生产一致的螺帽,最后通过链接去直接使用他们即可

但是,这其中有一个问题就是我们不能为了每一个程序都将零件给他装上,这样实在是太费内存了,就像我们在公路上一样,我们都有出行的需要,但要是给每一个人都配一辆自行车的话,就显得太过拥挤了。

动、静链接,共享运行来省内存

在上面一篇文章我们使用内存交换,虚拟内存,分页的方式解决了内存转载的问题,其中很多就是因为内存空间不够的原因,所以我们在想,能不能通过一种方式,可以将重复的代码,只在用的时候加载到内存中去。就好比我们的共享单车,我们在需要使用的时候去路边扫码就好了,而不是一直带个自行车在身边

人们根据这个思路就推出了一个新想法,就是动态链接,相应的,我们之前执行代码的方式是静态链接

这里,我们链接的不是放在硬盘上的库代码,而是加载到内存中的共享库中。在使用的时候去共享的库中取东西

这个加载到内存中的共享库会被多个程序调用到,在windows下这些文件为.dll文件,也就是 Dynamic-Link Libary(DLL,动态链接库)。在 Linux 下,这些共享库文件就是.so 文件,也就是 Shared Object(一般我们也称之为动态链接库)。这两大操作系统下的文件名后缀,一个用了“动态链接”的意思,另一个用了“共享”的意思,正好覆盖了两方面的含义。在这里插入图片描述

地址无关代码

我们知道,一个函数要运行,必须要有函数的入口地址,在一些特定的函数中,我们需要他在固定的地址,才能运行,比如我们使用的main函数,他就是操作系统规定的一个固定地址,其他地址不行。而地址无关地址则是不管在哪里都能运行,我们编译出来的共享库就是地址无关码

其实大多数程序都是地址无关码,你只需要给他的一个值,他经过处理,返回一个值,就达到了我们的目的
在这里插入图片描述
对于所有链接的共享库来说,虽然我们使用的是同一段物理内存地址,但是在不用的应用程序中,虚拟地址是不同的

那么我们怎么让编译出来的都为地址无关码呢,我们通常使用的为相对地址,各种指令的相对与当前的偏移量即可

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值