LINUX 动态库的版本控制

news2024/11/20 0:33:47

Linux库文件名的描述版本信息

library filename = lib + <libaray name> + .so + <libarary version information>

库版本信息通常使用以下格式:

dynamic libarary version information = <M>.<m>.<p>

其中,M用一位或多位数字表示库文件的主版本号,m用一位或多位数字表示库文件的次版本号,而p用一位或多位数字来表示库文件的修订版本号。

库的soname与库的文件名

库的文件名定义:

library filename = lib + <libaray name> + .so + <libarary version information>

库的soname定义:

library soname = lib + <libaray name> +.so + <(only the)library major version digit(s)>

很显然只要有了soname,我们就基本上可以定位某个特定的库文件名了,唯一的问题在于soname只有动态库的主版本号,并不包含完整的版本控制信息。

升级动态库时使用软链接和soname

下面列出升级动态库的过程:

1:当软链接和实际的动态库放置在一个目录下时,将软链接指向实际的动态库文件。

2:软链接的文件名与指向的动态库soname相同,这样一来,软链接实际包含的库文件名会具有松散的版本控制信息。(也就是只包含主版本信息。

3:一般来说,客户二进制文件从来不会链接文件名包含完整版本信息的动态库,相反,你会看到客户二进制文件的构建过程只会有目的性地和文件名包含库soname的文件进行链接

4:采取这种方法的原因很简单:链接时指定完整且精确的动态库版本控制信息将使我们日后无法链接同一个库的新版本,从而引发太对不必要的限制。

但在实际链接的过程中:只将库文件名传递给连接器,而不提供版本控制信息

比如:

gcc -shared <inputs> -lm -ldl -lpthread -lxmlz -lzyz -o <clientBinary>

链接过程如图所示:

soname详解

soname嵌入了二进制文件中,ELF格式预留了一块存储动态库soname信息的字段,在链接阶段,链接器将这个特殊的soname字符串写入ELF格式指定的区域中。

在构建动态库时,你可以使用一条特定的链接器选项来指定库文件的soname

gcc -shared <list of linker inputs> -wl, -soname,<soname> -o <library filename>

链接器会将指定的sonme嵌入二进制文件的DT_SONMA字段中。

gcc -fPIC -c test.c -o test.o
gcc -shared test.o -wl.-soname,libtest.so.1 -o libtest.so.1.0.0

readelf -d libtest.so.1.0.0

###################################################################
tag         type         Name/Value
0x00000001 (NEEDED)  shared  library:[libc.so.6]
0x0000000e (SONAME)  Librara soname :[libtest.so.1]
###################################################################

链接器版本控制脚本

来看下基于动态库libsimple.so 的简单示例,该动态库提供了3个函数如下

simple.c

int first_function(int x)
{
   return (x+1);
}
int second_function(int x)
{
   return (x+2);
}
int third_function(int x)
{
  return (x+3);
}

simpleVersionScript

LIBSIMPLE_1.0{
   global:
       first_function;second_function;
   local:
       *
};

最后构建动态库文件,我们可以通过以下链接器选线将版本控制器脚本文件传递给链接器使用:

gcc -fPIC -c simple.c
gcc -shared simple.o -wl,--version-script,simpleVersionScript -o libsimple.1.0.0

若后面增次版本号:只需要对前面的做细微的改动,如下图,在新的此版本号中增加了fourth_function,只需要在.c和.h增加定义声明后,在版本控制脚本加如下内容:

simpleVersionScript:

LIBSIMPLE_1.0{
   global:
       first_function;second_function;
   local:
       *
};

LIBSIMPLE_1.1{
   global:
       fourth_function;
   local:
       *
};

此时版本控制信息中不仅包含了原来的1.0版本还包含了最新的1.1版本,如图:

readelf -v libsimple.so

#####################################################################
version definition section ‘.gnu.version_d’ contains 3 enteries
0000: rec:1   Flags:BASE  Index:1   Cnt:1    Name:libsimple.so.1.1
001c: rev:1   Flags:none  Index:2   Cnt:1    Name:LIBSIMPLE_1.0
001c: rev:1   Flags:none  Index:3   Cnt:1    Name:LIBSIMPLE_1.1
#####################################################################

若后面增改了主版本函数,如first_function

对应的代码修改如下:

simpleVersionScript:

LIBSIMPLE_1.0{
   global:
       first_function;second_function;
   local:
       *
};

LIBSIMPLE_1.1{
   global:
       fourth_function;
   local:
       *
};
LIBSIMPLE_2.0{
   global:
       first_function;
   local:
       *
};

simple.c 修改内容如下:

...
__asm__(".symver first_function_1_0,first_function@LIBSIMPLE_1.0");
int first_function(int x)
{
   printf("lib:%s\n",__FUNCTION__);
   return (x+1);
}

__asm__(".symver first_function_1_0,first_function@LIBSIMPLE_2.0");
int first_function(int x)
{
   printf("lib:%s\n",__FUNCTION__);
   return 1000*(x+1);
}
...

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

(九)汇编语言——转义指令的原理

&#xff08;九&#xff09;汇编语言——转移指令的原理 文章目录&#xff08;九&#xff09;汇编语言——转移指令的原理转移指令作用分类转移行为转移距离转移指令操作符offsetjmp指令功能原理段间转移段内转移短转移原理长转移原理位移越界转移地址寄存器内存段内转移段间转…

【Linux基础】Linux中的时区和时间

基本概念 首先介绍Linux中会用到的时间概念&#xff1a; UTC&#xff1a;Universal Time Coordinated&#xff0c;协调世界时&#xff0c;又称世界统一时间&#xff0c;世界标准时间&#xff0c;国际协调时间。它是一个与时区相关的时间&#xff0c;目前将世界时区分为24个。…

【练习】Day04(未完成版)

努力经营当下&#xff0c;直至未来明朗&#xff01; 文章目录一、选择二、编程1. 数组中的第K个最大元素2. 组合总数III答案1. 选择2. 编程普通小孩也要热爱生活&#xff01; 一、选择 下面代码运行结果是&#xff08; &#xff09; public class Test{public int add(int a…

传统图像特征描述及提取方法

图像特征描述 图像特征是一幅图像区别于另一幅图像的最基本特征&#xff0c;是其可以作为欸标志性的属性。 图像特征分为两大类: 自然特征&#xff1a;图像本身都具有内在的图像特征&#xff08;如图像的大小、颜色、轮廓、边缘、纹理等&#xff09; 人为特征&#xff1a;便于…

【Linux】基础 IO

文章目录一、文件相关基础知识二、文件操作1、语言层面的文件操作与操作系统层面的文件操作的关系2、C语言文件操作3、操作系统文件操作3.1 比特位传递选项3.2 文件相关系统调用3.3 文件操作接口的使用三、文件描述符1、什么是文件描述符2、文件描述符的分配规则四、重定向1、什…

Docker三剑客——Docker Compose

目录 一、概述 二、Docker Compose工作流程 三、安装Docker Compose 四、Docker Compose管理命令 &#xff08;1&#xff09;docker-compose build &#xff08;2&#xff09;docker-compose kill &#xff08;3&#xff09;docker-compose logs &#xff08;4&#xff…

unity 实现千人同屏

作为开发人员&#xff0c;我们总是关注性能&#xff0c;包括CPU和GPU。随着场景变得越来越大越来越复杂&#xff0c;保持良好的性能变得越来越有挑战性&#xff0c;尤其是当我们添加越来越多的角色时。我和我在上海的同事在帮助客户时经常遇到这个问题&#xff0c;所以我们决定…

springcloud-gateway

网关zuul&#xff1a; https://github.com/Netflix/zuul/wiki Spring Cloud 网关gateway&#xff1a;Spring Cloud Gateway Spring Cloud Gateway Cloud全家桶中有个很重要的组件就是网关&#xff0c;在1.x版本中都是采用的Zuul网关; 但在2.x版本中&#xff0c;zuul的升级—…

【韩顺平Linux】学习笔记4

【韩顺平Linux】学习笔记4一、Linux组的介绍1.1文件/目录所有者1.2 组的创建1.3 其它组1.4 权限的基本介绍1.5 权限说明案例1.6 修改权限-chmod1.7 修改文件/目录所有者-chown/-chgrp二、crond任务调度三、at定时任务一、Linux组的介绍 在Linux中&#xff0c;每个用户都属于一个…

AtCoder Beginner Contest 284.(A--E)

AtCoder Beginner Contest 284A - Sequence of Strings1、问题2、代码B - Multi Test Cases1、问题2、代码C - Count Connected Components1、问题&#xff1a;2、思路&#xff1a;——并查集、DFS3、代码方法1&#xff1a;并查集方法2&#xff1a;DFSD - Happy New Year 20231…

Linux内核学习笔记——内核页表隔离KPTI机制(源码分析)

KPTI(Kernel PageTable Isolation)全称内核页表隔离&#xff0c;它通过完全分离用户空间与内核空间页表来解决页表泄露。 KPTI中每个进程有两套页表——内核态页表与用户态页表(两个地址空间)。 内核态页表只能在内核态下访问&#xff0c;可以创建到内核和用户的映射&#xf…

单体的 TienChin 和微服务的 TienChin 有何异同?

有不少小伙伴希望松哥能整一个微服务的实战项目&#xff0c;微服务这块技术点其实松哥是讲过很多了&#xff0c;图文版的教程视频版的教程都有&#xff0c;不过确实缺乏一个项目&#xff0c;所以我在想等 TienChin 项目搞完之后&#xff0c;和小伙伴们也来一起搞一个微服务的项…

nacos2.0客户端注册流程分析

版本介绍 copy几个jar包出来康康把 spring-cloud-starter-alibaba-nacos-config-2021.0.4.0.jar spring-cloud-starter-alibaba-nacos-discovery-2021.0.4.0.jar nacos-client-2.0.4.jar 注册流程 读取Spring Boot装载配置文件 spring.factories&#xff0c;找到启动类 Nac…

一步一步学爬虫(4)数据存储之Elasticsearch搜索引擎存储

Elasticsearch搜索引擎存储1. Elasticsearch 介绍2. Elasticsearch 相关概念3. 准备工作3.1 下载程序3.2 解压缩&#xff0c;配置文件修改4. 创建索引5. 删除索引6. 插入数据7. 更新数据8. 删除数据9. 查询数据10. 总结想查数据&#xff0c;就免不了搜索&#xff0c;而搜索离不…

【微信小程序】全局数据共享

小程序中的全局数据共享方案在小程序中可以使用mobx-miniprogram配合mobx-miniprogram-bindings实现全局数据共享。● mobx-miniprogram用来创建Store实例对象● mobx-miniprogram-bindings用来把Store中的共享数据或方法&#xff0c;绑定到组件或页面中使用npm install --save…

Python虚拟环境

学习视频&#xff1a;安装不算完事&#xff0c;只有理解了虚拟环境才算真正掌握 Python 环境 同类笔记&#xff1a;Python虚拟环境 目录 一、什么是虚拟环境 二、虚拟环境相关工具的使用和原理 创建虚拟环境 虚拟环境目录分析 虚拟环境的激活 虚拟环境做了什么 退出虚…

【论文精读】360MVSNet

今天读的是发表在WACV2023上的MVS文章&#xff0c;该文章提出了基于全景相机的MVS pipeline。 文章链接&#xff1a;点击前往 代码链接&#xff1a;暂未开源。 文章目录Abstract1. Introduction2. Related works3. Method3.1 Feature Extraction3.2 360 Spherical Sweeping3.2.…

【经典笔试题2】

test1 test2 test3 test4 test5 test1 int main() {int a[5] { 1, 2, 3, 4, 5 };int *ptr (int *)(&a 1);printf( "%d,%d", *(a 1), *(ptr - 1));return 0; } 程序的结果是什么&#xff1f;首先分析代码&#xff0c;a是数组名&#xff0c;是数组首元素…

详解Web服务器与http https协议工作过程

Web服务器 URL URI URL是URI的一个子集 www www所用的协议 http请求报文分析 状态码&#xff08;空行&#xff1a;最后一 个响应头部之后是一个空行&#xff0c;发送回车符和换行符&#xff0c;通知服务器以下不再有响应头部。&#xff09; 网址解析 网址注释实例 HTT…

从工厂方法到注解的小例子

目录一、背景介绍二、思路&方案三、过程过程图一过程图二过程图三过程图四(运行时的图)代码四、总结五、升华一、背景介绍 上篇"自定义注解和注解解析器",通过小例子介绍了自定义注解的运用&#xff1b;本篇继续基于小例子来实现工厂方法&#xff0c;以及注解实…