Linux共享库组织

1. 版本组织

    Linux共享库版本组织主要分为共享库版本和符号版本:

    1) 共享库版本:

    共享库采用x.y.z的方式标识共享库版本,x为主版本号,y为次版本号,z为发布版本号;

    当主版本号发生变化时,代表共享库版本发生了不兼容的变化,如函数签名变化、接口数据结构变化、函数行为变化等;

    当次版本号发生变化时,代表共享库版本增加了新特性,但已有的函数、数据结构等保持兼容;

    当发布版本号发生变化时,代表共享库版本修正了BUG,或改进了性能。

    因此,如果应用程序使用的共享库的主版本发生了变化,应用程序可能会无法运行;如果仅是次版本号或发布版本号升级,则应用程序不会受影响。

 

    应用程序依赖的共享库的主版本号相同,但次版本号偏低,则应用程序可能可以运行,也有可能不能运行,这取决于应用程序是否使用了新版本中增加提供的接口或数据结构。

    因为在运行应用程序时,操作系统如果发现共享库的次版本号偏低,可能采用不允许程序运行的策略,但实际上应用程序可能根本就没有使用较高次版本号中的接口。

    为了解决此问题引入了符号版本。

 

2) 符号版本:

    符号版本,即对于每一个符号都有一个版本号。共享库在发布时,标识出了每个符号的最新版本号。如:

    VERS_1.2 {

       global:

           func2;

       local:

            *

    }

 

    VERS_1.1 {

       global:

           func1;

       local:

            *

    }

    func2的符号版本为1.2,而func1的符号版本为1.1。

    在生成应用程序时,将会在应用程序文件中根据使用到的符号记录需要的符号版本。在使用动态链接库时,如果发现符号版本低于应用程序要求的版本,将无法运行。

    另外,上图中的global和local关键字的作用时用于标识动态库中哪些符号是全局的,哪些是共享库的内部符号。对于共享库内部符号,则不允许应用程序使用。

 

2. SO-NAME

    应用程序需要指定依赖的共享库,因为相同主版本号的共享库是向后兼容的,因此不需要指定共享库的完整版本,而只需要指定它的主版本。

    共享库的名称加上它的主版本号,就构成了共享库的SO-NAME,比如libc.so.1.5.3,它的SO-NAME为libc.so.1。

    在通过libconfig安装共享库时,会为共享库创建一个软链接文件,并以它的SO-NAME命名。比如上例中,就会生成一个libc.so.1的链接文件,指向libc.so.1.5.3文件。

 

3. 共享库的路径

    共享库文件通常放在下面三个路径中的一个:

    /lib: 存放系统最关键和基础的共享库,比如动态链接器,C运行库等。这些库主要是/bin和/sbin下的程序要用到的库,还有系统启动时需要的库;

    /usr/lib:存放非系统运行时需要的关键的共享库,主要是开发时需要的共享库文件;

    /usr/local/lib:存放与操作系统无关的共享库,如第三方运行时库。比如在安装python时,python需要的共享库文件就会在/usr/local/lib/python下。

 

4. 共享库的查找

    应用程序在加载时,会到共享库的存放路径下查找共享库文件。查找的顺序为:

    1)  LD_LIBRARY_PATH中指定的路径

    2)  /etc/ld.so.cache中指定的路径

    再通过ldconfig安装共享库时,ldconfig会自动在/etc/ld.so.cache中加入安装的共享库。这个文件主要是为了提高共享库文件的查找速度。

    3)  默认共享库目录,先/usr/lib再/lib

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Linux动态链接是一种在程序运行时动态加载的文件,它包含了一些可被程序调用的函数和变量。与静态链接不同,动态链接在程序运行时才会被加载,可以减小程序的体积,提高程序的灵活性和可移植性。动态链接可以被多个程序共享,从而节省系统资源。在Linux系统中,动态链接的文件名通常以“.so”结尾。 ### 回答2: Linux动态链接是一种在运行时加载的共享,它可以被多个程序共享使用,提供可重用的代码和功能。与静态链接相比,动态链接允许程序在运行时加载,并在内存中共享已加载的。这种方式可以减少内存占用,提高系统性能,并降低可执行文件的大小。 Linux动态链接分为两种类型:系统级动态链接和用户级动态链接。系统级动态链接例如libc,libpthread等,它们提供了操作系统的基本功能和系统调用的封装。用户级动态链接则是由开发者自行编写的共享,它包含了特定功能的代码,可以被多个程序调用和重用。 动态链接的使用有以下优势: 1. 代码重用:多个程序可以共享同一个动态链接,避免了重复代码的编写和维护。 2. 系统升级:当动态链接的代码需要更新时,只需要替换文件,而不需要重新编译所有使用该的程序。 3. 空间节省:动态链接在内存中只需加载一次,并被多个程序共享使用,减少了内存占用和可执行文件的大小。 4. 运行时动态性:程序可以在运行时加载或卸载动态链接,增加了程序的灵活性和扩展性。 然而,使用动态链接也存在一些注意事项: 1. 依赖关系:程序需要正确的动态链接版本,否则会导致运行错误或崩溃。 2. 性能开销:动态链接的加载和链接需要额外的时间和开销,可能会稍微降低程序的执行速度。 3. 安全性:动态链接易受到恶意代码的攻击,因此需要确保的来源和完整性。 总之,Linux动态链接是一种强大的机制,可以提高代码的重用性和灵活性,在系统开发和维护中起到了重要的作用。 ### 回答3: Linux动态链接(Dynamic Link Library,简称DLL)是指一种在Linux操作系统中,将不同的代码以动态链接的方式组合在一起,供程序调用的机制。 在Linux中,动态链接是以共享(shared library)的形式存在的。它与静态链接(static library)相比,可以在程序运行时动态加载和卸载,并且可以被多个程序同时共享使用。 Linux动态链接的特点有以下几点: 1. 节省内存空间:相比静态链接,动态链接只需在内存中加载一次,就可以被多个程序共享使用,节省了内存空间。 2. 灵活更新:由于动态链接是以单独的文件存在的,所以可以通过替换或更新动态链接文件,实现对其功能的升级或修复,而不用重新编译和链接整个程序。 3. 高度可移植性:动态链接可以跨平台使用,只需在目标系统中存在相同的动态链接文件即可。 4. 动态加载和卸载:在程序运行时,可以通过动态链接的加载和卸载机制,动态添加或删除某个功能模块,实现程序的动态扩展和精简。 5. 提高开发效率:动态链接将一些常用的函数和代码进行打包,供多个程序调用,可以提高开发效率,并且减少了代码重复性。 总之,Linux动态链接是一种方便、灵活、可共享的代码组织方式,提高了程序的开发效率和可维护性,也为程序的升级和优化提供了便利。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值