Linux共享库概述

共享库是一种将库函数打包成一个单元使之能够在运行时被多个进程共享的技术。这种技术能够节省磁盘空间和RAM。

在继续阐述共享库之前,先来说说静态库,它是比共享库更早的存在。静态库也称为归档文件,它的作用就是将一组经常被用到的目标文件组织进单个库文件,这样以来,就可以使用它来构建多个可执行程序,并且在构建各个应用程序的时候无需重新编译原来的源代码。

从以上的描述中,可以看出,静态库必须和可执行文件一起被链接进目标文件中,这样的话,不同的可执行程序使用了相同的目标模块时,每个可执行程序都有自己的一份静态库副本,这样做有以下几个缺点:

  • 存储同一目标模块会浪费磁盘空间,并且实际上浪费的空间还是很大的。
  • 如果使用了同一模块的几个不同的可执行程序在同一时刻运行,那么每个程序会独立地在虚拟内存中保存一份目标模块的副本,从而提高了系统中虚拟内存的使用量。
  • 若是需要修改静态库中的错误,那么需要重新生成静态库,再链接合并到目标文件中。

每一种新生事物的出现都是为了解决之前已经存在的问题,所以这里就引出了动态库,它就是来解决以上这些问题的:

  • 共享库的关键思想就是目标木块的单个副本由所有需要这些模块的程序共享,目标模块不会被复制到链接过的可执行文件中,而是,当第一个需要共享库的木块的程序启动时,库的单个副本就会在运行时被加载进内存。当后面使用同一共享库的其他程序启动时,它们会使用已经加载进内存的库的副本。使用共享库,就意味着可执行程序需要的磁盘空间和虚拟内存更少了,这就解决了一个问题。
  • 由于目标模块没有被复制进可执行文件中,而是在共享库中集中维护,因此在修改目标模块时,无需重新链接程序,甚至正在运行的程序正在使用现有版本共享库的时候也能够进行这样的变更。

下面一张图示,很形象具体地说明了从创建动态库到链接进可执行文件的过程:

接下来的另一图示则是很形象具体地说明克创建程序被加载进内存时执行:

## 使用共享库的有用工具

接下来介绍一些和共享库相关的有用工具

  • ldd

    ldd(列出动态依赖)命令显示了一个程序所需的共享库,执行如下:

$ ldd xxx

它会以library-name => resolves-to-path的形式将程序所使用的动态库列举出来

  • objdump

该命令可以获取到各类信息,具体请参数函数命令手册

  • nm

nm命令会列出目标库或者可执行程序中定义的一组符号。这个命令的一个作用是找出哪些库定义了一个符号

共享库的运行

为了能够在运行时找到共享库,动态链接库遵循了一组标准的搜索规则,其中包括搜索一组大多数共享库安装的目录(如:/lib/ //usr/lib 等),当然也可以在用户自定义的目录下搜索,这一点,可以参考相关参考。

共享库的一些特性

动态加载库

当一个可执行文件开始运行后,动态链接器会加载程序的动态依赖列表中的所有共享库,但有些时候,延迟加载库是比较有用的,如只在需要的时候再加载一个插件,动态链接器是通过一组函数来实现的。先总体认识下这些函数:

dlopen();dlsym();dlclose();dlerror();

打开共享库

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

以上函数通过用户传入的地址目录,打开了一个共享库,并返回了一个供后续调用使用的句柄。

获取符号的地址

#include <dlfcn.h>void *dlsym(void * linfilename,char * symbol);

该函数实际上利用刚才返回的调用句柄,并传入函数名,这样就可以调用共享库中提供的函数了。

关闭共享库

#include <dlfcn.h>void *dlclose(void * handle);

该函数会减小handle的引用的库的打开的引用系统计数,如果这个引用技术变成了0,并且其他库已经不需要用到该库中的符号,那么就会卸载这个库。系统会在这个库的依赖树中的库执行(递归)同样地过程。值得注意的是,当进程终止时,会隐式地对所有库执行dlclose()。

错误判断

#include <dlfcn.h>void *dlerror(void );

该函数主要是在dlopen调用错误后,获取到一个表明错误原因的字符串指针。

后话

应用开发的话,我们经常会使用ndk,使用ndk-build脚本来生成共享库,有时会发生一些莫名其妙的问题。因为共享库的相关内容与gcc有莫大关系,gcc的编译参数可谓繁杂,我在学习共享库相关内容时,有这么一个思考,有时候一些莫名其妙的问题是否与一些默认的编译参数与我们所需要的是否是不一样导致的?这只是一点不成熟的思考,希望有兴趣的各位能一起讨论!

Linux共享库概述相关推荐

  1. linux共享库位置配置(LD_LIBRARY_PATH环境变量 或者 更改/etc/ld.so.conf)

    linux共享库位置配置(LD_LIBRARY_PATH环境变量 或者 更改/etc/ld.so.conf) 转载于:https://www.cnblogs.com/RichardLee/archiv ...

  2. linux共享库 == windows动态库

    linux共享库  == windows动态库     之间基本等同.

  3. Linux共享库路径配置

    Linux共享库路径配置 Linux下找不到共享库文件的典型现象为明明已经安装某个软包(如libnet,MySQL),编译链接可以正常进行,但是在运行时出现如"error while loa ...

  4. linux共享库及/etc/ld.so.conf文件的应用

    Linux 共享库 Linux 系统上有两类根本不同的 Linux 可执行程序.第一类是静态链接的可执行程序.静态可执行程序包含执行所需的所有函数 -换句话说,它们是"完整的".因 ...

  5. Linux 共享库:LD_LIBRARY_PATH 与ld.so.conf_爱过了就好_新浪博客

    Linux 共享库:LD_LIBRARY_PATH 与ld.so.conf_爱过了就好_新浪博客 Linux 共享库:LD_LIBRARY_PATH 与ld.so.conf     (2009-07- ...

  6. UNIX 环境高级编程(二)—— linux共享库,/etc/ld.so.conf 及 ld.so.conf.d/libc.conf

    1. Linux 共享库(/etc/ld.so.conf) 这个文件记录了编译时使用的动态链接库的路径.默认情况下,编译器只会使用 (1)/lib. (2)/usr/lib 这两个目录下的库文件. 如 ...

  7. Linux命令把共享库export,Linux Linux共享库

    so文件在linux中为共享库,与windows下的dll类似. so文件中的函数可供多个进程调用,最大可能的提供二进制代码复用. 共享库可以使代码的维护工作大大简化,当修正了一些错误或者添加了新特性 ...

  8. 程序员的自我修养--链接、装载与库笔记:Linux共享库的组织

    共享库(Shared Library)概念:其实从文件结构上来讲,共享库和共享对象没什么区别,Linux下的共享库就是普通的ELF共享对象.由于共享对象可以被各个程序之间共享,所以它也就成为了库的很好 ...

  9. Linux动态加载共享库,Linux共享库的动态加载(附测试案例)

    共享库的动态加载是指可以在程序运行的过程中去加载所需的共享库.常用于某些系统或者应用程序的自动升级. 在C语言的源程序动态加载共享库,需要调用一组特殊的函数,它们被声明于一个专门的头文件dlfcn.h ...

最新文章

  1. 身为程序员的你一定要学会Python这个神操作,会这个想单身都难
  2. 使用聚类算法(Kmeans)进行数据降维并作为分类算法逻辑回归(logistic Regression)的数据预处理步骤实战
  3. string截取某个字符串之前的_python String字符串操作
  4. 设计模式读书笔记-----代理模式
  5. Bootstrap组件_警告框
  6. Android开机自启监听网络改变源码
  7. 偶也要去上海Tech一把了
  8. 网络爬虫--10.使用正则表达式的爬虫
  9. 内部矩阵维度必须一致simulink_深度学习/目标检测之numpy——向量和矩阵乘法相关...
  10. 实例变量和局部变量区别
  11. 奥鹏19春计算机应用基础,19春西南交《计算机应用基础》在线作业二(答案)-...
  12. 用Python自动发送邮件
  13. IPSEC 001 --- 原理简介
  14. 一名Java高级工程师需要学什么?
  15. 炫酷 雨滴桌面设置工具
  16. 奥维 html api,【教程】在奥维中,个人如何申请天地图API秘钥(手机端操作)
  17. Linux时间同步(NTP)
  18. laravel 框架使用hdjs 实现单图上传功能
  19. 地震 位错模型 matlab,地球物理学论文范文参考 地球物理学毕业论文范文[精选]...
  20. 驾驶证机动车查询验证WebSerivce调用编程接口说明及示例代码

热门文章

  1. HDU-4037-线段树-区间开根号
  2. 高性能服务器dyna软件重启动,LSDYNA 中的完全重启动是什么功能,实际使用过程中,如何实现完全重启动...
  3. Mysql磁盘空洞的成因以及重建表的几种方式
  4. Python环境搭建(一)
  5. PPT的备注区字体太小,还改不了?
  6. 计算机一级考试ps知识点,计算机一级考试PS备考训练题及答案
  7. 王者里的高清绝美海报(别再用黑乎乎的背景了)
  8. 教你编写第一个生成式对抗网络GAN
  9. 《论文阅读》Multi-Task Learning of Generation and Classification for Emotion-Aware Dialogue Response Gener
  10. TypeScript 学习笔记(一)—— 参考哔哩哔哩整理的笔记