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表存储 ...
随机推荐
- 这两个基础seo插件,wordpress网站必装
WordPress对搜索引擎非常友好,这一点很多人都知道.不过我们在制作完成WordPress主题后,还可以在原来的良好基础上,添加两个队seo非常有利的WordPress插件. 第一个插件:Baid ...
- 微信小程序_快速入门01
这段时间,嗯,大四课程已经结束了,工作也已经找到了,但是呢,到公司报道的时间还没到,哈哈,马上就开始人生的第一份工作了,怎么说确实有点期待~ 在这段时间一方面为第一份工作做各种准备,另一方面也没有停止 ...
- python中的 * 和 ** 作用含义
python中的 * 和 ** ,能够让函数支持任意数量的参数,它们在函数定义和调用中,有着不同的目的 一. 打包参数 * 的作用:在函数定义中,收集所有位置参数到一个新的元组,并将整个元组赋值给变量 ...
- 阿里P8面试官:如何设计一个扛住千万级并发的架构?
大家先思考一个问题,这也是在面试过程中经常遇到的问题. 如果你们公司现在的产品能够支持10W用户访问,你们老板突然和你说,融到钱了,会大量投放广告,预计在1个月后用户量会达到1000W,如果这个任务交 ...
- AtCoder Beginner Contest 224
AtCoder Beginner Contest 224 A - Tires 思路分析: 判断最后一个字符即可. 代码如下: #include <bits/stdc++.h> using ...
- [技术博客] 软工-Ruby on Rails 后端开发总结分享
[技术博客] 软工-Ruby on Rails 后端开发总结分享 在这次软件编写中,我们的后端使用了Ruby on Rails (RoR)框架. Rails框架是用Ruby编写的.这意味着当我们为Ru ...
- Vue3+Typescript+Node.js实现微信端公众号H5支付(JSAPI v3)教程--各种填坑
----微信支付文档,不得不说,挺乱!(吐槽截止) 功能背景 微信公众号中,点击菜单或者扫码,打开公众号中的H5页面,进行支付. 一.技术栈 前端:Vue:3.0.0,typescript:3.9.3 ...
- pyinstaller和wordcloud和jieba的使用案列
一.pyinstaller库 1.简介 pyinstaller库:将脚本程序转变为可执行(.exe)格式的第三方库 注意:需要在.py文件所在目录进行以下命令,图标扩展名是.ico 2.格式: pyi ...
- 一张图彻底搞懂Spring循环依赖
1 什么是循环依赖? 如下图所示: BeanA类依赖了BeanB类,同时BeanB类又依赖了BeanA类.这种依赖关系形成了一个闭环,我们把这种依赖关系就称之为循环依赖.同理,再如下图的情况: 上图中 ...
- 如何系统学习C 语言(上)之 基础篇
大话C 语言(一) 初识C 语言 老实说,上大学之前我根本不知道什么是C 语言,所以当初学校开设这门课时,我是充满了好奇,所以当初我翻阅了大量的C 语言入门书籍,千篇一律,都是从一些概念.术语和理论讲 ...