关于静态链接库和动态链接库

 在通常情况下,对函数库的链接是在编译的时候完成的,所有的objcet file和相关的libraty被链接成一个可执行文件 ,程序运行时已经与库没有关系,因为objcet file中所有对库的调用,已经使用库中的相应代码代替,这叫静态 链接,libray叫做静态链接库,在linux 中是类似于*.a的文件。
    其实我们也可以在程序运行时(run time)对库进行动态的调用,也就是在用到库函数时,再将其load进来,这就是动态链接库 了,在linux中类似于*.so的都是动态链接库。同时动态链接的实现也有两种方式,一种是编译的时候将对动态库的依赖关系编译进程序,另外一种就是在程序运行到需要调用的地方的时候,将动态链接库load进来,不管使用哪种方式,程序中都不会包括库函数的实现代码。
     在动态链接库中用到了一个PIC的概念(Position Independ Code),对于这个概念,我们可以看看HP的解释:

    Position-independent code (PIC ) is a form. of absolute object code that doesnot contain any absolute addresses and therefore does not depend on where it is loaded in the process's virtual address space. This is an important property for building shared libraries.

    In order for the object code in a shared library to be fully shareable, it must not depend on its position in the virtual address space of any particular process. The object code in a shared library may be attached at different points in different processes, so it must work independent of being located at any particular position, hence the term position-independent code.

     我的理解就是说,共享库(动态链接库)里的object在程序运行的时候会被映射到不同进程的不同的虚拟地址上,所以其object 是与进程载入的虚拟地址无关的,不具备绝对地址。

     当一个程序需要调用动态链接库的时候,操作系统 首先会检查内存,看内存总是否存在着这个库的拷贝(即动态链接库是否载入),如果有就会共享这个拷贝,即在进程中映射出一份这段代码的拷贝,只有在没有才链接载入。

      动态链接库不一定会减小内存的使用量,因为动态链接的过程需要带来一定的开销,那为什么使用动态链接库呢,主要原因有一下几点:

      1、首先因为程序中不存在库代码的副本,所以节省了空间 ,提高了效率,尤其当很多程序都需要调用同一个库的实现的时候,动态链接比静态链接尤其提高效率

      2、动态链接有助于提高程序的可扩展性和模块化,最方便的就是改变的库的实现,只要接口不变,应用 程序也不需要改变

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值