[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检测工具

soname and real name的更多相关文章

  1. GCC选项_-Wl,-soname 及 DT_NEEDED 的解释

    -Wl选项告诉编译器将后面的参数传递给链接器. -soname则指定了动态库的soname(简单共享名,Short for shared object name) soname的关键功能是它提供了兼容 ...

  2. linux soname

    在linux下使用动态库时,经常会发现明明编译时指定的是libA.so,可是程序运行时或通过ldd查看依赖却是libA.so.XXX, 原因跟linux下so库的soname有关,查看so库的sona ...

  3. linux dll hell--链接库real name, soname, link name

    DLL hell 是指 Windows 系统上动态库的新版本覆盖旧版本,且新版本不能兼容旧版本的问题. 例如:装新软件,但原有的软件运行不起来了.   Linux 系统下也同样面临着和 Windows ...

  4. linux下动态库中的soname

    soname( Short for shared object name) 其是应用程序加载dll 时候,其寻找共享库用的文件名.其格式为 lib + math+.so + ( major versi ...

  5. 动态库中的soname

    soname( Short for shared object name) 其是应用程序加载dll 时候,其寻找共享库用的文件名.其格式为 lib + math+.so + ( major versi ...

  6. TokuDB存储引擎

    TokuDB是Tokutek公司开发的基于ft-index(Fractal Tree Index)键值对的存储引擎. 它使用索引加快查询速度,具有高扩展性,并支持hot scheme modifica ...

  7. Percona TokuDB

    Percona TokuDB Percona TokuDB 1.     TokuDB说明 2.     TokuDB安装 3.     使用TokuDB 3.1 快速插入和富索引 3.2 聚集sec ...

  8. [MySQL Reference Manual] 18 复制

    18 复制 18 复制 18.1 复制配置 18.1.1 基于Binary Log的数据库复制配置 18.1.2 配置基于Binary log的复制 18.1.2.1 设置复制master的配置 18 ...

  9. [MySQL Reference Manual]15. 其他存储引擎

    15. 其他存储引擎 15. 其他存储引擎 15.1 设置存储引擎 15.2 MyISAM存储引擎 15.2.1 MyISAM启动选项 15.2.2 Key的空间要求 15.2.3 MyISAM表存储 ...

随机推荐

  1. 中国唯一入选 Forrester 领导者象限,阿里云 Serverless 全球领先

    3 月 26 日消息,权威咨询机构 Forrester 发布 2021 年第一季度 FaaS 平台评估报告,阿里云函数计算凭借在产品能力.安全性.战略愿景和市场规模等方面的优势脱颖而出,产品能力位列全 ...

  2. Visual Studio Docker调试端口设置

    一.前言 在Visual Studio 调试程序时,Docker中的容器端口和主机端口映射随机生成,导致每次调试都需要修改前端API接口的地址 二.解决方案 1.修改Docker调试启动参数,找到启动 ...

  3. 使用Mybatis的一些基本配置及Mybatis与数据库交互测试验证

    1.简介 什么是MyBatis? MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.My ...

  4. redis编译安装、哨兵、集群

    编译安装 #下载源代码解压 wget https://download.redis.io/releases/redis-5.0.13.tar.gz -P /home/ tar -xvf /home/r ...

  5. 洛谷4755 Beautiful Pair (分治)

    题目描述 小D有个数列 \(a\),当一个数对 \((i,j)(i\le j)\) 满足\(a_i\)和\(a_j\)的积 不大于 \(a_i \cdots a_j\) 中的最大值时,小D认为这个数对 ...

  6. 洛谷4035 JSOI2008球形空间产生器 (列柿子+高斯消元)

    题目链接 qwq 首先看到这个题,感觉就应该从列方程入手. 我们设给定的点的坐标矩阵是\(x\),然后球心坐标\(a_1,a_2....a_n\) 根据欧几里得距离公式,对于一个\(n维空间\)的第\ ...

  7. 利用ps在光污染地图上寻找最近的观星地区

    城市灯光对于天文观测和天文摄影是有害的,进行这两类活动之前应提前规划地点,下面是笔者尝试的一种利用ps在光污染地图上进行规划的方法. 目前大部分的光污染地图都是基于WA 2015绘制的,可以结合VII ...

  8. 【Takin使用日记】记一次TransmittableThreadLocal引起的业务异常

    对于常见的 WEB 容器,Takin 通过增强 org.apache.catalina.core.StandardHostValve#invoke 方法,拦截并解析方法入参的 Request 对象中的 ...

  9. 92.反转链表II

    题目 给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right .请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 . ...

  10. 运维常用python库&模块

    sutil:是一个跨平台库(https://github.com/giampaolo/psutil)能够实现获取系统运行的进程和系统利用率(内存,CPU,磁盘,网络等),主要用于系统监控,分析和系统资 ...