soname and real name
[1] https://wiki.openssl.org/index.php/OpenSSL_1.1.0_Changes#Backward_compatibility
[2] https://akkadia.org/drepper/dsohowto.pdf, how to write shared libraries, 2011
[3] https://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html, 背下来,搜soname, real name, major, minor, release, compat, pic
The GNU linker uses the -hname or -soname=name to specify the library name field. Internally, the linker will create a DT_SONAME field and populate it with name.
-- soname - Wikipedia
gcc -fPIC -g -c -Wall a.c
gcc -fPIC -g -c -Wall b.c
gcc -shared -Wl,-soname,libmystuff.so.1
-o libmystuff.so.1.0.1 a.o b.o -lc
-- Shared Libraries[3]
soname提供了backward-compatible信息;如果soname不变,说明可以兼容。
下面RHEL7上的示例可以看出:
- so软链接规范,命名规范
- 第二层文件名与soname一致
- openssl-1.0.2与openssl-1.1不兼容[1]。openssl的版本号与一般linux动态库不太一样,openssl3已回归潮流。
- ld链接的实际上是第二层文件名(共3层),带了版本号;可以认为是major版本号,保证兼容性。
$ ls -l /usr/lib64/libssl.so*
lrwxrwxrwx 1 root root 16 Jun 7 13:48 /usr/lib64/libssl.so -> libssl.so.1.0.2k
lrwxrwxrwx. 1 root root 16 Sep 19 2018 /usr/lib64/libssl.so.10 -> libssl.so.1.0.2k
-rwxr-xr-x. 1 root root 470360 Apr 11 2018 /usr/lib64/libssl.so.1.0.2k
$ objdump -p /usr/lib64/libssl.so.1.0.2k | grep -i name
SONAME libssl.so.10
$ objdump -p /lib/x86_64-linux-gnu/libssl.so.1.1 | grep -i name
SONAME libssl.so.1.1
$ ls -l /usr/lib64/libpcre.so*
lrwxrwxrwx. 1 root root 16 Jul 10 22:59 /usr/lib64/libpcre.so -> libpcre.so.1.2.0
lrwxrwxrwx. 1 root root 16 Jul 10 16:47 /usr/lib64/libpcre.so.1 -> libpcre.so.1.2.0
-rwxr-xr-x. 1 root root 402384 Aug 2 2017 /usr/lib64/libpcre.so.1.2.0
$ objdump -p /usr/lib64/libpcre.so.1.2.0 | grep -i name
SONAME libpcre.so.1
$ ldd /usr/bin/ssh
linux-vdso.so.1 => (0x00007ffc693e6000)
libfipscheck.so.1 => /lib64/libfipscheck.so.1 (0x00007fc341f60000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x00007fc341d39000)
libcrypto.so.10 => /lib64/libcrypto.so.10 (0x00007fc3418d6000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007fc3416d2000)
libldap-2.4.so.2 => /lib64/libldap-2.4.so.2 (0x00007fc34147d000)
liblber-2.4.so.2 => /lib64/liblber-2.4.so.2 (0x00007fc34126e000)
libutil.so.1 => /lib64/libutil.so.1 (0x00007fc34106b000)
libz.so.1 => /lib64/libz.so.1 (0x00007fc340e55000)
libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007fc340c1e000)
libresolv.so.2 => /lib64/libresolv.so.2 (0x00007fc340a04000)
libgssapi_krb5.so.2 => /lib64/libgssapi_krb5.so.2 (0x00007fc3407b7000)
libkrb5.so.3 => /lib64/libkrb5.so.3 (0x00007fc3404ce000)
libk5crypto.so.3 => /lib64/libk5crypto.so.3 (0x00007fc34029b000)
libcom_err.so.2 => /lib64/libcom_err.so.2 (0x00007fc340097000)
libc.so.6 => /lib64/libc.so.6 (0x00007fc33fcc9000)
libpcre.so.1 => /lib64/libpcre.so.1 (0x00007fc33fa67000)
/lib64/ld-linux-x86-64.so.2 (0x00007fc342421000)
libsasl2.so.3 => /lib64/libsasl2.so.3 (0x00007fc33f84a000)
libssl.so.10 => /lib64/libssl.so.10 (0x00007fc33f5d8000)
libssl3.so => /lib64/libssl3.so (0x00007fc33f37b000)
libsmime3.so => /lib64/libsmime3.so (0x00007fc33f153000)
libnss3.so => /lib64/libnss3.so (0x00007fc33ee1e000)
libnssutil3.so => /lib64/libnssutil3.so (0x00007fc33ebee000)
libplds4.so => /lib64/libplds4.so (0x00007fc33e9ea000)
libplc4.so => /lib64/libplc4.so (0x00007fc33e7e5000)
libnspr4.so => /lib64/libnspr4.so (0x00007fc33e5a7000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fc33e38b000)
libfreebl3.so => /lib64/libfreebl3.so (0x00007fc33e188000)
libkrb5support.so.0 => /lib64/libkrb5support.so.0 (0x00007fc33df78000)
libkeyutils.so.1 => /lib64/libkeyutils.so.1 (0x00007fc33dd74000)
librt.so.1 => /lib64/librt.so.1 (0x00007fc33db6c000)
ABI-compatible检测工具
- https://lvc.github.io/abi-compliance-checker/
- https://wiki.openssl.org/index.php/Binary_Compatibility
soname and real name的更多相关文章
- GCC选项_-Wl,-soname 及 DT_NEEDED 的解释
-Wl选项告诉编译器将后面的参数传递给链接器. -soname则指定了动态库的soname(简单共享名,Short for shared object name) soname的关键功能是它提供了兼容 ...
- linux soname
在linux下使用动态库时,经常会发现明明编译时指定的是libA.so,可是程序运行时或通过ldd查看依赖却是libA.so.XXX, 原因跟linux下so库的soname有关,查看so库的sona ...
- linux dll hell--链接库real name, soname, link name
DLL hell 是指 Windows 系统上动态库的新版本覆盖旧版本,且新版本不能兼容旧版本的问题. 例如:装新软件,但原有的软件运行不起来了. Linux 系统下也同样面临着和 Windows ...
- linux下动态库中的soname
soname( Short for shared object name) 其是应用程序加载dll 时候,其寻找共享库用的文件名.其格式为 lib + math+.so + ( major versi ...
- 动态库中的soname
soname( Short for shared object name) 其是应用程序加载dll 时候,其寻找共享库用的文件名.其格式为 lib + math+.so + ( major versi ...
- TokuDB存储引擎
TokuDB是Tokutek公司开发的基于ft-index(Fractal Tree Index)键值对的存储引擎. 它使用索引加快查询速度,具有高扩展性,并支持hot scheme modifica ...
- Percona TokuDB
Percona TokuDB Percona TokuDB 1. TokuDB说明 2. TokuDB安装 3. 使用TokuDB 3.1 快速插入和富索引 3.2 聚集sec ...
- [MySQL Reference Manual] 18 复制
18 复制 18 复制 18.1 复制配置 18.1.1 基于Binary Log的数据库复制配置 18.1.2 配置基于Binary log的复制 18.1.2.1 设置复制master的配置 18 ...
- [MySQL Reference Manual]15. 其他存储引擎
15. 其他存储引擎 15. 其他存储引擎 15.1 设置存储引擎 15.2 MyISAM存储引擎 15.2.1 MyISAM启动选项 15.2.2 Key的空间要求 15.2.3 MyISAM表存储 ...
随机推荐
- 中国唯一入选 Forrester 领导者象限,阿里云 Serverless 全球领先
3 月 26 日消息,权威咨询机构 Forrester 发布 2021 年第一季度 FaaS 平台评估报告,阿里云函数计算凭借在产品能力.安全性.战略愿景和市场规模等方面的优势脱颖而出,产品能力位列全 ...
- Visual Studio Docker调试端口设置
一.前言 在Visual Studio 调试程序时,Docker中的容器端口和主机端口映射随机生成,导致每次调试都需要修改前端API接口的地址 二.解决方案 1.修改Docker调试启动参数,找到启动 ...
- 使用Mybatis的一些基本配置及Mybatis与数据库交互测试验证
1.简介 什么是MyBatis? MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.My ...
- redis编译安装、哨兵、集群
编译安装 #下载源代码解压 wget https://download.redis.io/releases/redis-5.0.13.tar.gz -P /home/ tar -xvf /home/r ...
- 洛谷4755 Beautiful Pair (分治)
题目描述 小D有个数列 \(a\),当一个数对 \((i,j)(i\le j)\) 满足\(a_i\)和\(a_j\)的积 不大于 \(a_i \cdots a_j\) 中的最大值时,小D认为这个数对 ...
- 洛谷4035 JSOI2008球形空间产生器 (列柿子+高斯消元)
题目链接 qwq 首先看到这个题,感觉就应该从列方程入手. 我们设给定的点的坐标矩阵是\(x\),然后球心坐标\(a_1,a_2....a_n\) 根据欧几里得距离公式,对于一个\(n维空间\)的第\ ...
- 利用ps在光污染地图上寻找最近的观星地区
城市灯光对于天文观测和天文摄影是有害的,进行这两类活动之前应提前规划地点,下面是笔者尝试的一种利用ps在光污染地图上进行规划的方法. 目前大部分的光污染地图都是基于WA 2015绘制的,可以结合VII ...
- 【Takin使用日记】记一次TransmittableThreadLocal引起的业务异常
对于常见的 WEB 容器,Takin 通过增强 org.apache.catalina.core.StandardHostValve#invoke 方法,拦截并解析方法入参的 Request 对象中的 ...
- 92.反转链表II
题目 给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right .请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 . ...
- 运维常用python库&模块
sutil:是一个跨平台库(https://github.com/giampaolo/psutil)能够实现获取系统运行的进程和系统利用率(内存,CPU,磁盘,网络等),主要用于系统监控,分析和系统资 ...