共享库soname机制

news/2024/11/16 17:58:50/文章来源:https://www.cnblogs.com/paw5zx/p/18305473

目录
  • 前言
  • 共享库版本号
  • 共享库命名机制
    • realname
    • soname
    • linkname
  • 总结
  • 参考文章

前言

在使用第三方库时,我们会发现第三方库会提供一组文件,他们的后缀一般是.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 命名机制

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/744745.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

idea打开/导入maven项目 + 移除

——————如何导入 方法1———— 右侧maven——》点击加号找到要但如项目的pom.xml文件——》ok 方法2———— file——》project structure……modeles——》加号 import module 找到要导入项目的pom.xml文件——》ok 右下角apply——》ok 这两个方法都可以导入 ———…

抢占智能驾驶“智高点”,仿真测试或将是必备的“加速剂”

​在智能驾驶系统的开发中,参考V模型开发流程,仿真测试通常包含多个阶段:MIL(模型在环)—— 用于验证理论模型,软件在环(SIL)—— 测试软件组件,硬件在环(HIL)—— 集成硬件组件进行测试,车辆在环(VIL)—— 模拟车辆与环境的交互,以及实车道路测试(包括封闭场地…

Tita的OKR:产品经理的23个OKR案例(下)

让我们把产品管理和产品负责人的活动分为4个大的领域,有时是一个人垂直地处理所有的问题,有时是战略和战术的责任分工,所以要相应地选择。愿景和战略 构思、调整、验证、优先级确定 构建、衡量、学习 发布和增长接下来我们继续讨论,让我们把这4个大的领域分解成小的领域,让…

咬文嚼图式的介绍二叉树、B树/B-树

网上的很多博客都是只有文字说明,比较抽象,所以笔者决定自己画一些图来解释二叉树,二叉搜索树,B树/B-树。前言 因为本人天资愚钝,所以总喜欢将抽象化的事务具象化表达。对于各类眼花缭乱的树,只需要认知到它们只是一种数据结构,类似数组,切片,列表,映射等这些耳熟能详…

“码”力全开!高效开发就靠这款神器

即构致力于用领先的音视频技术帮助开发者即刻构建实时互动世界。通过大量的用户调研了解到,兼顾高效开发和个性化UI以实现产品快速上线,是许多开发者的共同需求。为此,即构推出了含标准化 UI 的音视频互动 SDK —— UIKits,帮助开发者应对互动应用开发中的各种挑战。基于广…

Linux-awk

awk 3.4.2 功能 过滤 取行 取列 统计计算 数组 函数3.4.3 格式 awk 条件 动作 (找谁 干啥) awk [options] commands filenames awk [options] -f awk-script-file filenames3.4.4 awk处理数据的方式:1、进行逐行扫描文件,从第一行到最后一行 2、寻找匹配的特定模式的…

24 年 “年薪百万” 的 Java 程序员,都要学什么?

前几天我看了一篇由国外的 Java 架构师大佬分享的文章,主题是 “Java 架构师必会的 20 个技术”。 光看这个标题,就知道在国外做 Java 开发,也很卷啊!能学习的技术真的太多了。大家好,我是程序员鱼皮。前几天我看了一篇由国外的 Java 架构师大佬分享的文章,主题是 “Java…

idea 查看项目的git路径

目录 第一种方式: 第二种方式: 第三种方式:第一种方式: 1、打开项目,在工程上右键,选择Show in Explorer; 如下图:2、此时会打开本地的代码路径窗口; 如下图:3、双击工程,会出现git目录文件夹;4、双击进去git目录, 打开config文件夹;5、文件里面的url 属性即为gi…

如何将文本转换为向量?(方法二)

​文本转换为向量有多种方式: 方法一:通过模型服务灵积DashScope将文本转换为向量(推荐) 方法二:通过ModelScope魔搭社区中的文本向量开源模型将文本转换为向量 方法三:通过Jina Embeddings v2模型将文本转换为向量 方法四:通过百川智能向量化模型将文本转换为向量本文介…

2024-07-16 代码高亮插件highlight.js安装使用以及排错日志

highlight.js —— 一个开源语法高亮库,用于在网页上对源代码进行语法高亮显示。 安装npm i highlight.js yarn add highlight.js引入// main.js import { createApp } from vue; import App from "./App.vue"; import hljs from "highlight.js"; // 代码…

安装python方法在Windows环境

一、下载安装包 ​ 下载地址: ​ https://www.python.org/downloads/ ​ 安装注意勾选:​ 注:安装位置可用默认C盘。 二、更改国内源 ​ 更改配置文件:如没有文件创建文件。 ​ 位置:"C:\Users\32974\AppData\Roaming\pip\pip.ini" ​ 添加内容:一条源。 […

520-基于ZU15EG 适配AWR2243的雷达验证底板 XCZU15EG架构高速信号处理板

基于ZU15EG 适配AWR2243的雷达验证底板 一、板卡概述 本板卡系我司自主研发,基于MPSOC系列SOC XCZU15EG-FFVB1156架构,搭载两组64-bit DDR4,每组容量32Gb,最高可稳定运行在2400MT/s。另有1路10G SFP+光纤接口、1路40G QSFP光纤接口、1路USB3.0接口、1路千兆网络接口、1路DP…