`

Linux下库相关的概略介绍及动态库的搜索路径优先级

阅读更多

(本文主要针对动态连接库,内容来源网络,重新整理之,高亮部分的请重点关注)

 

一. 基本知识
  总 体来说, 库可以有三种使用的形式: 静态、共享和动态. 静态库的代码在编译时就已连接到开发人员开发的应用程序中, 而共享库只是在程序开始运行时才载入. 在编译时, 只是简单地指定需要使用的库函数. 动态库则是共享库的另一种变化形式. 动态库也是在程序运行时载入, 但与共享库不同的是, 使用的库函数不是在程序运行开始, 而是在程序中的语句需要使用该函数时才载入. 动态库可以在程序运行期间释放动态库所占用的内存, 腾出空间供其它程序使用. 由于共享库和动态库并没有在程序中包括库函数的内容, 只是包含了对库函数的引用,因此代码的规模比较小.

  而Linux下的库文件分为共享库和静态库两大类, 它们两者的差别仅在程序执行时所需的代码是在运行时动态加载的, 还是在编译时静态加载的. 区分库类型最好的方法是看它们的文件后缀,通常共享库以.so(Shared Object的缩写)结尾, 静态链接库通常以.a结尾(Archive的缩写). 在终端缺省情况下, 共享库通常为绿色, 而静态库为黑色.

  已经开发的大多数库都采取共享库的方式. ELF格式的可执行文件使得共享库能够比较容易地实现, 当然使用旧的a.out模式也可以实现库的共享. Linux系统中目前可执行文件的标准格式为ELF(Executable and Linkable Format) 格式(可点击查看此定义).

  .a的是为了支持较老的a.out格式的可执行文件.
  .so的是支持elf格式的可执行文件的库.

    .a是静态库文件, 可以用ar 命令生成.
  .so是动态库文件, 编译时加上指定的选项即可生成.

 

二.命名规则
      GNU库的使用必须遵守Library GNU Public License(LGPL许可协议). 该协议与GNU许可协议略有不同, 开发人员可以免费使用GNU库进行软件开发, 但必须保证向用户提供所用的库函数的源代码.

  系统中可用的库都存放在/usr/lib和/lib目录中. 库文件名由前缀lib和库名以及后缀组成. 根据库的类型不同, 后缀名也不一样.
  共享库的后缀名由.so和版本号组成, 静态库的后缀名为.a.

   libname.so.major.minor.patchlevel

   name : 可以是任何字符串, 用来唯一标识某个库. 该字符串可以是一个单字、几个字符、甚至一个字母.
   major : 主版本号
   minor : 次版本号

   patchlevel : 补丁版本

 

三.库操作 (具体操作本文不详述)
   ldd( Library Dependency Display ) : 显示一个executable program对库的依赖关系 .
 

   ldconfig - configure dynamic linker run-time bindings : 他的作用就是为了让动态链接库被系统所认识及共享 .
   默认搜寻/lib /usr/lib 以及动态库配置文件/etc/ld.so.conf 内所列的目录, 创建出动态装入程序(ld.so )所需的连接和缓存文件 (/etc/ld.so.cache )
—————————————————————————————————————
   关于 ld.so 此处多说几句
   共享库装载器& 动态连接器 : 当程序被调用的时候, Linux 共享库装载器也自动被调用. By the way , ‘ 共享库装载器’ 这个名词的定义不知正确否. 但无论是什么 , 它的作用是保证程序所需要的所有适当版本的库都被调入内存. 而可能的共享库装载器的名字就是 ld.so 或者是 ld-linux.so (取决于 Linux libc 的版本)
—————————————————————————————————————

四.动态库的搜索路径优先级

   Section 3 提到*.so被寻在/lib /usr/lib 以及/etc/ld.so.conf 内所列的目录中 , 这就涉及到优先搜索哪个路径文件夹的问题 . 于是 , 解渴先 :
   动态链接器ld.so按照下面的顺序来搜索需要的动态共享库:

   1.ELF可执行文件中动态段中DT_RPATH所指定的路径. 这实际上是通过一种不算很常用, 却比较实用的方法所设置的: 编译目标代码时, 可以对gcc加入链接参数“-Wl,-rpath”指定动态库搜索路径;
   2.环境变量LD_LIBRARY_PATH 指定的动态库搜索路径;
   3./etc/ld.so.cache中所缓存的动态库路径(如果支持ld.so.cache的话) . 这可以通过修改配置文件/etc/ld.so.conf中指定的动态库搜索路径来改变;
   4.默认的动态库搜索路径/lib;
   5.默认的动态库搜索路径/usr/lib.
    
   Comment : 在嵌入式Linux系统的实际应用中, 1和2被经常使用, 也有一些相对简单的的嵌入式系统会采用4或5的路径来规范动态库. 3在嵌入式系统中使用的比较少, 因为有很多系统根本就不支持ld.so.cache.

   if(!you care about how i get this result){
         echo The End . BYEBYE!
   }
   else
         # gcc -o pos main.c -L. -lenvpos

         #

               void pos();
                   int main()
                   {
                        pos();
                        return 0;
                   }
         然后在上述5种或者更多的路径下,分别编译出libenvpos.o(注意要同名啊).

—————————————————————————————————————
        # gcc -c pos_env.c
                      # gcc -shared -fPCI -o libenvpos.so pos_env.o
                      #

                      #include
                        void pos()
                        {
                               printf(”/yourURL/lib\n”);
                       }
                        program: pos_env.c
—————————————————————————————————————
          执行./pos 看输出结果 , 输出一个结果后就到结果指向的目录下删除*.so之 . 一次这样顺序的搞定也就知道搜索的优先级了 .

          好了 , 就到这里吧 . 各位师兄们有嘛好方法和相关知识点 , 请麻烦给我留言 .

          也在此处发布: http://www.emsym.com/blog/?p=631
—————————————————————————————————————

     Click here to read more about this Topic (en)    &  Click here to download some papers about Dynamic Link Mechanism in Linux(zh-cn)

分享到:
评论

相关推荐

    LINUXCNC源程序概略笔记.pdf

    这是一份对初学者很有帮助的源代码笔记,大概罗列了整个代码框架的功能示意描述,包括一些作者阅读后的笔记...并没有很系统的对整个程序框架进行梳理,不过对初步接触LinuxCNC的人来说,这个也是一份不错的阅读指引了。

    基于图论路径的边角网概略坐标推算

    在图论的基础上,通过控制网邻接矩阵,寻找出经过所有点的一条路径,利用观测边长、观测角度及已知信息,提出了一种基于图论路径的边角网概略坐标推算方法。详细介绍了图论路径的提取方法,最后通过算例验证了该方法的...

    GPS广播星历计算卫星概略位置

    标题中的“GPS广播星历计算卫星概略位置”是指通过GPS全球定位系统中广播星历数据来估算卫星的大致位置。GPS系统由一系列地球轨道上的卫星组成,它们不断地广播自己的位置和时间信息,用户设备接收这些信号后可以...

    linux 5 Books bible

    概略的书籍,这个是一本总体概略的书籍The follow Book is reproduced below with the goal of providing information that is as accurate and reliable as possible. Regardless, purchasing this eBook can be ...

    Netbackup 概略介紹

    本概略介绍将涵盖 NetBackup 的核心组件、关键功能以及一些高级选项和代理。 首先,NetBackup 的核心组件包括主服务器(Master Server)、媒体服务器(Media Server)和客户端(Clients)。主服务器是整个系统的...

    创业计划书-60万吨醇氨全厂概略流程-GSP图

    《创业计划书-60万吨醇氨全厂概略流程-GSP图》是一个与化工生产相关的文档,主要涉及的是醇氨生产工厂的设计和运营规划。在这个项目中,GSP图(General Stream Process Diagram)是关键,它是一种用来展示化工过程...

    基于卫星概略星历的GPS内部可靠性预报.pdf

    概述:本文介绍了一种基于卫星概略星历的GPS内部可靠性预报方法。该方法通过使用YUMA概略星历进行卫星预报,并提出了一种内部可靠性预报的具体方法。文章详细介绍了使用YUMA概略星历进行卫星预报的流程,并给出了一...

    生物特征安全概略构造:理论与实践

    概略一致拒绝率和不一致接收率的界 采 用 纠错码实现了安全概略的构造计算了不同纠错能力下安全概略 一 致<br /> 拒绝率和不一致接收率分析了实际实现算法与理论界限产生差距的原因指出了现有安全概略构造在...

    预算概略计算表.xls

    预算概略计算表.xls

    从概略到点子.ppt

    从概略到点子.ppt

    文明论概略有感.doc

    文明论概略有感.doc

    项目管理知识体系概略.zip

    "项目管理知识体系概略.zip"这个压缩包文件内包含的"项目管理知识体系概略.pptx"很可能是一个详细的介绍,旨在帮助理解并掌握项目管理的核心概念、流程和最佳实践。 项目管理知识体系(Project Management Body of ...

    营销与广告策划概略.pptx

    【营销与广告策划概略】 营销与广告策划是企业成功的关键环节,涉及到多个层面的知识点。首先,我们来看影响市场营销的四大因素,也被称为4P:产品(Product)、价格(Price)、促销(Promotion)和地点(Place)。产品是指...

    项目管理知识体系概略.ppt

    项目管理知识体系概略.ppt

    侗族良性习惯法概略.doc

    侗族良性习惯法概略.doc

    手机项目管理概略程式

    手机项目管理概略程式是针对手机开发过程中的各个阶段进行详细规划和管理的流程,旨在确保项目的高效执行和成功推出。整个过程分为四个主要阶段:立项阶段、项目开发阶段、项目追踪阶段和阶段性项目资料输出。 立项...

    项目管理的入门级介绍:项目管理体系概略

    项目管理的入门级介绍: 为什么要学习项目管理 美国项目管理协会(PMI)简介 项目的定义 什么是项目管理 项目管理理论的发展 项目管理的环境 项目管理的关键概念 项目管理的结构 项目管理在实践中的应用

    JAVA反射参数传递概略

    通过反射,我们可以在不知道具体类的情况下,动态地获取类的信息并调用其方法。这篇博客文章“JAVA反射参数传递概略”将深入探讨如何使用反射来处理方法参数,尤其是涉及到参数传递的细节。 首先,让我们理解什么是...

Global site tag (gtag.js) - Google Analytics