[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. The art of multipropcessor programming 读书笔记-硬件基础2

    本系列是 The art of multipropcessor programming 的读书笔记,在原版图书的基础上,结合 OpenJDK 11 以上的版本的代码进行理解和实现.并根据个人的查资料以 ...

  2. equals之List

    School类 package com.collection.equals; /* * 定义一个学校类 相当于一个学校模板 * 状态: 1.学校id 2.学校名称 * */ public class ...

  3. 【Azure 云服务】Azure Cloud Service 为 Web Role(IIS Host)增加自定义字段 (把HTTP Request Header中的User-Agent字段增加到IIS输出日志中)

    问题描述 把Web Role服务发布到Azure Cloud Service后,需要在IIS的输出日志中,把每一个请求的HTTP Request Header中的User-Agent内容也输出到日志中 ...

  4. 洛谷4322 SHOI2014 三叉神经树(LCT+思维)

    好久之前做的题了QWQ 现在来补一发博客 一道神仙题啊..qwq 首先,我们可以看出来,我们如果对于每个点维护一个\(val\),表示他的直系儿子中有几个表现为1的. 那么\(val[x]>&g ...

  5. bzoj2037 Sue的小球(区间dp,考虑到对未来的贡献)

    ​​​​​​​​​​​​​​大致意思就是现在你要不断的奔跑到不同的地点去接球,每一秒可以移动一个单位长度,而你接到一个球的动作是瞬间的,收益是y[i]-t*v[i] 然后呢,要求分数最高. 起初看这个 ...

  6. final和static的区别

    static作用于成员变量用来表示只保存一份副本 final的作用是用来保证变量不可变.下面代码验证一下 public class FinalTest { public static void mai ...

  7. fpic 和 fPIC

    fpic 和 fPIC 区别 Code Gen Options (Using the GNU Compiler Collection (GCC)) 综下所述,生成适用于共享库的位置无关代码(PIC)时 ...

  8. JavaScript中的函数、参数、变量

    高中大学数学很差,学JavaScript,发现根本不理解其中的函数.参数.变量等概念. 李永乐老师教学视频:<高三数学复习100讲>函数 bilibili.com/video/av5087 ...

  9. PCB中,Solder Mask与Paste Mask有啥区别呢?

    Solder Mask Layers: 即阻焊层.顾名思义,他的存在是为了防止PCB在过波峰焊的时候,不应涂锡的地方粘上锡. 可以简单理解为一个洞,该区域(洞)以外的地方,都不允许有焊锡,即只能涂绿油 ...

  10. 小白自制Linux开发板 九. 修改开机Logo

    许久不见啊,今天我们继续来修改我们的系统. 通过前面的几篇文章我们已经能轻松驾驭我们的开发板了,但是现在都是追求个性化的时代,我们在开发板上打上了自己的Logo,那我们是否可以改变开机启动的Logo呢 ...