共享库soname机制
前言
在使用第三方库时,我们会发现第三方库会提供一组文件,他们的后缀一般是.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.z,x,y,z分别代表主版本号,次版本号和发布版本号。 - 一般拥有此名称的文件就是共享库的源文件
- 在库文件生成时使用下面命令可以指定realname:
gcc -shared -o $(realname) $(dependencies) $(flags)
soname
- 形如
libname.so.x,x代表主版本号 - 作用于用户程序运行时的加载阶段,动态链接器会根据用户程序编译时记录的
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机制的更多相关文章
- C语言的本质(35)——共享库
库用于将相似函数打包在一个单元中.然后这些单元就可为其他开发人员所共享,并因此有了模块化编程这种说法- 即,从模块中构建程序.Linux支持两种类型的库,每一种库都有各自的优缺点.静态库包含在编译时静 ...
- Linux共享库、静态库、动态库详解
1. 介绍 使用GNU的工具我们如何在Linux下创建自己的程序函数库?一个“程序函数库”简单的说就是一个文件包含了一些编译好的代码和数据,这些编译好的代码和数据可以在事后供其他的程序使用.程序函数库 ...
- linux共享库的版本控制
前几天看到一篇介绍linux共享库版本控制及使用的文章,觉得不错,这里就与大家分享一下. 1. Linux约定 经常看到Linux中,共享库的名字后面跟了一串数字,比如:libperl.so.5.18 ...
- binary hacks读数笔记(共享库)
共享库从文件结构上来讲,与共享对象没什么区别.Linux下,共享库就是普通的ELF共享对象. 1.共享库命名: libname.so.x.y.z :其中最前面使用前缀lib,中间是库的名字和后缀&qu ...
- 链接(extern、static关键词\头文件\静态库\共享库)
原文链接:http://www.orlion.ga/781/ 一. 多目标文件的链接 假设有两个文件:stack.c: /* stack.c */ char stack[512]; int top = ...
- linux共享库
linux共享库 linux中共享库一般以.so.x.y.z 命名,其中x,y,z分别为主版本号.次版本号.发布版本号.同一个库,主版本号不同则相互不兼容:主版本相同,次版本号高的库比次版本号低的库有 ...
- linux下的共享库(动态库)和静态库
1.什么是库在windows平台和linux平台下都大量存在着库.本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行.由于windows和linux的本质不同,因此二者库的二进制是不 ...
- 动态共享库(so)开发精悍教程
动态共享库(so)开发精悍教程 翻译并根据实际情况进行了小小修改,仅关注Linux下动态共享库(Dynamic shared library .so)的开发. 1 简单的so实例 源文件 //test ...
- 在Linux使用GCC编译C语言共享库
在Linux使用GCC编译C语言共享库 对任何程序员来说库都是必不可少的.所谓的库是指已经编译好的供你使用的代码.它们常常提供一些通用功能,例如链表和二叉树可以用来保存任何数据,或者是一个特定的功能例 ...
- Linux命令(十二)制作静态库和共享库
1. 静态库 静态库文件命名:libxxxx.a 1.1 步骤: ar rcs libCalc.a *.o 1.2 用nm查看文件内容 1.3 发布并使用 gcc main.c -o mycpp.ou ...
随机推荐
- wxPython==4.2.1 aui.AuiToolBar 如何去掉烦人的抓手?
aui.AuiToolBar 如何去掉烦人的抓手? 最近在用wxPython做一些GUI小应用,发现工具栏总有几个点(抓手),很影响美观,如下: 目前官方没有提供隐藏抓手的功能,需要更改源码的auib ...
- 如果个人pc上要装不同社区版本的pycharm,安装时需要注意的一点
pycharm下载地址[包含了目前发行的所有版本]:https://www.jetbrains.com/pycharm/download/other.html 选择指定的版本,点击 勾选uninsta ...
- 用 AI 速读海量文档!5款 AI 阅读工具推荐
在当今信息爆炸的时代,我们在手动搜集和处理信息时面临着几个挑战: 浩如烟海的信息量远远超出了我们的阅读能力. 信息的复杂性要求我们重复筛选和过滤. 专业或难以理解的内容需要被翻译成易懂的语言. 需要从 ...
- Dockerfile-NGINX镜像制作
1 NGINX镜像制作: 1.1 NGINX-dockerfile FROM centos:7 LABEL maintainer www.chenleilei.net RUN useradd www ...
- Python保姆级教程 数据类型—新手小白入门必看系列
推荐使用压缩软件和杀毒软件 7 - zip 使用火绒 一.基本数据类型与变量(上) 2.1 注释 优点: 代码说明 没注释的代码 有注释的代码 不让解释器执行注释的那句话 2.2 单行注释 单行注释快 ...
- 鸿蒙HarmonyOS实战-ArkTS语言基础类库(XML)
前言 数据传输的数据格式有以下几种常见的格式: JSON(JavaScript Object Notation):JSON是一种轻量级的数据交换格式,可读性高且易于解析.它使用键值对的方式表示数据,并 ...
- 滚动条小实验 BOM时间操作
<div class="top">我是吸顶div</div> <p class="back">返回顶部</ ...
- Scaling Memcache at Facebook
Memcached 是一种众所周知的.简单的内存缓存解决方案.本文描述了 Facebook 如何利用 memcached 作为构建块来构造和扩展一个分布式键值存储支持世界上最大的社交网络. 1.I ...
- 模拟登录之web监控
1.什么是web监控 zabbix除了能通过 脚本+自定义key,实现服务器数据提取监控以外 也支持对网页的HTTP请求.响应监控. 2.web监控需求 以zabbix-UI页面的登录监控,模拟登录, ...
- 自建yum源
自定义yum本地仓库 你不需要依赖外网的yum仓库,可能导致该仓库无法访问,下载软件失败.. 大公司,会自建yum仓库 防止出现网络问题,自建了yum仓库,本地yum仓库 你可以去阿里云上,部署一个在 ...