美文网首页
动态库和PIC[转]

动态库和PIC[转]

作者: chandarlee | 来源:发表于2017-05-23 18:33 被阅读147次

Linux共享库两种加载方式简述

动态库技术通常能减少程序的大小,节省空间,提高效率,具有很高的灵活性,对于升级软件版本也更加容易。与静态库不同,动态库里面的函数不是执行程序本身 的一部分,而是在程序执行时按需载入,其执行代码可以同时在多个程序中共享。由于在编译过程中无法知道动态库函数的地址,所以需要在运行期间查找,这对程 序的性能会有影响。

共享库

对于共享库来讲,它只包括2个段:只读的代码段 和可修改的数据段。堆和栈段,只有进程才有。如果你在共享库的函数里,分配了一块内存,这段内存将被算在调用该函数的进程的堆中。代码段由于其内容是对每 个进程都是一样的,所以它在系统中是唯一的,系统只为其分配一块内存,多个进程之间共享。数据段由于其内容对每个进程是不一样的,所以在链接到进程空间 后,系统会为每个进程创建相应的数据段。也就是说如果一个共享库被N个进程链接,当这N个进程同时运行时,同时共享一个代码段,每个进程拥有一个数据段,系统中共有N个数据段。PIC即position independent code,使.so文件的代码段变为真正意义上的共享。如果编译时不加-fPIC,则加载.so文件的代码段时,代码段引用的数据对象需要重定位, 重定位会修改代码段的内容,这就造成每个使用这个.so文件代码段的进程在内核里都会生成这个.so文件代码段的copy。

加载方式
  1. 静态加载

    在程序编译的时候加上“-l”选项,指定其所依赖的动态库,这个库的名字将记录在ELF文件的.dynamic节。在程序运行时,loader会预先将程序所依赖的所有动态库都加载在进程空间中。
    优点:动态库的接口调用简单,可以直接调用。
    缺点:动态库的生存周期等于进程的生存周期,其加载时机不灵活。

  2. 动态加载
    在程序中编码来指定加载动态库的时机,经常使用的函数dlopen和dlclose。
    优点:动态库加载的时机非常灵活,可以非常细致的定义动态库的生存周期。
    缺点:动态库的接口调用起来比较麻烦,同时还要关注动态库的生存周期。

#include <dlfcn.h>
void * dlopen( const char * *pathname*, int *mode* );**

函数描述:
  在dlopen的()函数以指定模式打开指定的动态连接库文件,并返回一个句柄给调用进程。使用dlclose()来卸载打开的库。
mode:分为这两种
   RTLD_LAZY 暂缓决定,等有需要时再解出符号
   RTLD_NOW 立即决定,返回前解除所有未决定的符号。
返回值:
   打开错误返回NULL
   成功,返回库引用
   编译时候要加入 -ldl (指定dl库)
在dlopen一个共享库时:
a、进程会加载该共享库的代码段和数据段,同时为这个共享库计数加1。
b、进程查找该共享库的dynamic节,查看其所依赖的共享库。

c、首先检查所依赖库是否已经被加载,如果已被加载,则为这个共享库计数加1。如果未被加载,则加载其代码段和数据段,然后为这个共享库计数加1。
d、再查找这些库所依赖的库。最终进程会为每个加载的共享库维护一个依赖的计数。

int dlclose (void *handle);

函数描述:
**dlclose用于关闭指定句柄的动态链接库,只有当此动态链接库的使用计数为0时,才会真正被系统卸载。
在dlclose共享库时:
a、首先将该共享库的计数减1,如果该共享库依赖计数为0,则卸载该共享库。
b、在dynamic节中,查找其所依赖的共享库。
c、为每个共享库的计数减1,如果该共享库依赖计数为0,则卸载该共享库。
d、重复上面的步骤。
优点:
a、可以在程序启动的时候,减少加载库的数量,这样可以加快进程的启动速度和减少加载库的内存使用。
b、为进程提供了卸载共享库的机会,这样就可以回收共享库代码段和数据段所占用的内存。
缺点:

对于程序员编码来讲,会产生一定的疑惑。一个static的对象的生存周期是贯穿在进程始终的,实际上不是这样。在动态库中的static对象,其生命周期等于该动态库的生命周期。采用静态链接的方式,动态库的生命周期等于进程的生命周期;而采用动态加载的方式,则是不同的。

原文地址:http://blog.csdn.net/yeahguyewen/article/details/6275292

共享库中的位置无关代码(PIC)

相关文章

  • 动态库和PIC[转]

    Linux共享库两种加载方式简述 动态库技术通常能减少程序的大小,节省空间,提高效率,具有很高的灵活性,对于升级软...

  • iOS静态库及动态库

    2018-06-19 浅析静态库链接原理编译原理以及什么是静态库和动态库 转之: iOS 静态库和动态库(库详解)...

  • Linux动态库

    深入探讨Linux静态库与动态库的详解(一看就懂)Linux下动态库的生成和使用Linux下动态库生成和使用转-u...

  • iOS 静态库和动态库的制作

    静态库和动态库 一、静态库和动态库的存在形式 静态库: .a 和 .framework 动态库: .dylib 和...

  • (转)iOS 静态库和动态库(库详解)

    原文地址:https://www.cnblogs.com/junhuawang/p/7598236.html 什么...

  • 通过dlopen使用动态库

    动态库制作dlopen 动态加载Frameworks使用dlopen和dlsym方法动态加载库和调用函数动态库使用...

  • iOS-SDK从无到有

    A、关于静态库和动态库 静态库:.a和.framework ,动态库:.dylib和.framework。.fra...

  • 打包SDK和Framework

    库:分为动态库和静态库(目前苹果不支持上传动态库) 静态库:.a和.framework 动态库:.dylib和.f...

  • iOS 静态库封装

    静态库和动态库 静态库和动态库存在形式 静态库:以.a 和 .framework为文件后缀名。 动态库:以.tbd...

  • 静态库和动态库

    静态库和动态库的存在形式静态库:.a 和 .framework动态库:.dylib 和 .framework 静态...

网友评论

      本文标题:动态库和PIC[转]

      本文链接:https://www.haomeiwen.com/subject/dzsgxxtx.html