首页 > 其他分享 >共享库soname机制

共享库soname机制

时间:2024-07-16 16:07:58浏览次数:9  
标签:文件 soname 版本号 链接 so 共享 机制

目录

前言

在使用第三方库时,我们会发现第三方库会提供一组文件,他们的后缀一般是.so(如libname.so),.so.x.so.x.y.z。本文讨论他们之间的关系。

共享库版本号

共享库一般会由于修复bug或增加接口等原因不断更新,有些更新是向下兼容的,有些则不是。一旦不向下兼容,那么当共享库更新后,依赖该库(旧版本)的程序将无法运行,需要重新编译。

为了避免上述情况,就要对共享库进行版本控制。根据更新内容的不同可以划分不同的版本号:

  • 主版本号(Major Version Number):主版本号表示库的重大升级,即更新的内容会导致不再与旧版本兼容(如接口变更),需要用户做出代码上的修改来适应新版本(或者仍使用旧版的共享库)。
  • 次版本号(Minor Version Number):次版本号表示库的增量升级,即更新的内容向下兼容,不会影响用户程序,但提供了额外的功能或改进。用户不需要做出代码更改仍可继续使用该库。
  • 发布版本号(Release Version Number):发布版本号表示库的一些错误的修正、性能的改进等,接口不做变化,不添加新功能。向下兼容。

不同的版本号在文件命名上就可以体现。
对于一个名为aaa的库,它的共享库文件名可能为:libaaa.so.x.y.z,其中:

  • lib:固定前缀
  • aaa:库名称
  • .so:共享库固定后缀
  • .x:主版本号
  • .y:次版本号
  • .z:发布版本号

例如libjsoncpp.so.1.7.4就代表着jsoncpp的共享库文件,版本号为1.7.4

共享库命名机制

然而若一个共享库改变了版本号并更新文件。那么对于使用旧版本共享库的用户程序来说,运行时就无法找到共享库文件了(因为名称已改变),还需要重新编译链接才可以。这就这大大增加了系统维护的复杂度和成本。

于是就诞生了soname命名机制,方便管理共享库的版本。

此机制设计了3类命名方式:

realname

  • 形如libname.so.x.y.zx,y,z分别代表主版本号,次版本号和发布版本号。
  • 一般拥有此名称的文件就是共享库的源文件
  • 在库文件生成时使用下面命令可以指定realname:
    gcc -shared -o $(realname) $(dependencies) $(flags)
    

soname

  • 形如libname.so.xx代表主版本号
  • 作用于用户程序运行时的加载阶段,动态链接器会根据用户程序编译时记录的soname查找对应的共享库文件
  • 通常是$(realname)文件的软链接,在库安装或更新后由库的维护者或系统管理员通过包管理器更新软链接的指向,一般不由单个用户手动进行软链接。
  • 在库文件生成时使用下面命令可以指定其soname
    gcc -shared -o $(realname) $(dependencies) $(flags) −Wl,−soname,$(soname)
    
  • 对于一个共享库文件,我们可以通过readelf -d命令查看其soname

linkname

  • 形如libname.so,是没有任何版本编号的文件名
  • 作用于用户程序编译阶段,链接器使用linkname来寻找对应的共享库(GCC中使用-l选项指定库,如-laaa,链接器就会去找libaaa.so),然后将共享库的soname记录在用户程序的动态链接信息中。
  • 通常是$(realname)文件或$(soname)文件的软链接,在库安装或更新后由库的维护者或系统管理员通过包管理器更新软链接的指向,一般不由单个用户手动进行软链接。

总结

总的来说,对于Linux下的用户程序,soname命名机制主要参与了以下两个过程:

链接阶段:编译器按照搜索路径优先级,根据linkname去找对应的.so文件,如果找到了就会在生成的可执行文件中记录.so文件指向的共享库文件的soname;如果没有找到就会去找静态库文件选择静态链接。

加载阶段:程序运行时,动态链接器按照搜索路径优先级,根据可执行文件中记录的soname去找对应的*.so.x文件,如果找到了就会加载其指向的共享库;没找到就报错。

这样的处理确保了应用程序在运行时能够找到合适的库版本,同时允许系统管理员在不影响已有应用程序的情况下更新库文件。

参考文章

1.Linux下动态链接库文件的realname、soname和linkname
2.Program Library HOWTO-Shared Libraries
3.Shared objects: sonames, real names, and link names
4.Linux 共享库的 soname 命名机制

标签:文件,soname,版本号,链接,so,共享,机制
From: https://www.cnblogs.com/paw5zx/p/18305473

相关文章

  • 三分钟了解共享门店模式
    共享店铺,作为一种创新的商业模式,正悄然改变着传统零售与服务业的格局。其核心思想在于构建一个开放共享的平台,将实体店铺内未充分利用的资源——包括工位、员工的专业技能、丰富的运营经验、乃至房屋水电等基础设施,转化为可共享的资产。这一模式巧妙地将拥有客户资源却缺乏实体......
  • 使用Samba在Ubuntu和Windows下共享文件处理
    使用Samba在Ubuntu和Windows下共享文件处理在Ubuntu下安装sambasudoaptupdatesudoapt-getinstallsamba添加用户到Ubuntu中sudoadduserchris:创建系统用户sudosmbpasswd-achris:添加用户到Samba配置Sambavim/etc/samba/smb.conf在最下面添加如下信息:......
  • TCP拥塞机制
     慢启动原理默认,TCP连接,都是慢启动,也可以关闭。因为还不了解网络的带宽,不了解服务器能接受的最大窗口。所以,第一个数据包,一般是1个或者2个MSS那么大,这也就是CWND,拥塞窗口的大小。如果发过去,收到了一个ACK的确认包,发送方就以指数来增长CWND,如果上一次是1次,那下一次就是2的1次方......
  • 注意力机制中三种掩码技术详解和Pytorch实现
    注意力机制是许多最先进神经网络架构的基本组成部分,比如Transformer模型。注意力机制中的一个关键方面是掩码,它有助于控制信息流,并确保模型适当地处理序列。在这篇文章中,我们将探索在注意力机制中使用的各种类型的掩码,并在PyTorch中实现它们。在神经网络中,掩码是一种用于阻止模......
  • vit的自注意力机制的范围
    在VisionTransformer(ViT)中,自注意力机制的范围是指模型在处理图像块时,每个图像块能够与其他哪些图像块进行交互。ViT的自注意力机制具有全局范围,这意味着在自注意力层中,每个图像块都可以与其他所有图像块进行交互,而不管它们在原始图像中的空间位置如何。以下是ViT自......
  • 4、设计共享内存管理接口
    初级代码游戏的专栏介绍与文章目录-CSDN博客我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。这些代码大部分以Linux为目标但部分代码是纯C++的,可以在任何平台上使用。    系统做大了增加很多管理功能是不可避免的,绝不只是几个......
  • 深度学习中的正则化技术 - 参数绑定和参数共享篇
    序言在深度学习的探索之旅中,如何高效地管理模型的参数,以减少计算成本、提升训练效率并防止过拟合,一直是研究者们关注的焦点。参数绑定与参数共享作为两种重要的参数优化策略,应运而生。参数绑定通过构建参数间的直接或间接联系,使模型的不同部分能够共享或依赖某些参数的变化......
  • Java面试八股之Redis哨兵机制
    Redis哨兵机制RedisSentinel(哨兵)模式是一种高可用解决方案,用于监控和自动故障转移Redis主从集群。以下是对哨兵模式详细过程的描述:1.初始化与配置部署哨兵节点:在不同的服务器上部署一个或多个RedisSentinel节点,它们作为独立进程运行,负责监控Redis主从集群的状态。配置......
  • 开发环境搭建及运行机制
    Java开发环境搭建百度搜索JDK,找到下载地址,浏览Oracle的网站。JDK下载地址:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133](https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html)151.html选择版本(我们采......
  • 基于java+springboot+vue实现的共享汽车管理系统(文末源码+Lw)118
    基于SpringBoot+Vue的实现的共享汽车管理系统(源码+数据库+万字Lun文+流程图+ER图+结构图+开题报告+演示视频+软件包)系统功能:本共享汽车管理系统有管理员和用户。管理员功能有个人中心,用户管理,投放地区管理,汽车信息管理,汽车投放管理,汽车入库管理,使用订单管理,汽车归还管理。用......