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表存储 ...
随机推荐
- 实验3:OpenFlow协议分析实践
作业链接:实验3:OpenFlow协议分析实践 一.实验目的 能够运用 wireshark 对 OpenFlow 协议数据交互过程进行抓包: 能够借助包解析工具,分析与解释 OpenFlow协议的数据 ...
- aizhan查询旁IP网站脚本
<?php print_r("-------------------------\r\n"); print_r("-------爱站旁站查询------\r\n&q ...
- 数据库建表权限 CREATE command denied to user for table
今天在表中用Navicat连接服务器上的mysql账号进行建表,报了个这样类似的错, CREATE command denied to user for table 是数据库权限设置的问题,所以无法进 ...
- 13万字详细分析JDK中Stream的实现原理
前提 Stream是JDK1.8中首次引入的,距今已经过去了接近8年时间(JDK1.8正式版是2013年底发布的).Stream的引入一方面极大地简化了某些开发场景,另一方面也可能降低了编码的可读性( ...
- 内网渗透DC-1靶场通关(CTF)
最新博客见我的个人博客地址 DC系列共9个靶场,本次来试玩一下DC-1,共有5个flag,下载地址. 下载下来后是 .ova 格式,建议使用vitualbox进行搭建,vmware可能存在兼容性问题. ...
- Beta阶段第五次会议
Beta阶段第五次会议 时间:2020.5.21 完成工作 姓名 工作 难度 完成度 ltx 1.对小程序进行修改和美化新增页面(新增60行) 中 85% xyq 1.编写技术博客 中 85% xtl ...
- android tcp通讯
Andoird TCP通讯 前言 最近在写一个即时通讯的项目,有一些心得,写出来给大家分享指正一下. 简单描述一下这个项目: 实时查询车辆运行状态的项目,走TCP通迅. 接口采用GZIP压缩. 后台是 ...
- hdu 4288 Coder(单点操作,查询)
题意: 三种操作: 1. add x – add the element x to the set;2. del x – remove the element x from the set;3. su ...
- 六. Go并发编程--WaitGroup
一. 序言 WaitGroup是Golang应用开发过程中经常使用的并发控制技术. WaitGroup,可理解为Wait-Goroutine-Group,即等待一组goroutine结束.比如某个go ...
- 理解前端blob和ArrayBuffer,前端接受文件损坏的问题
1 downloadTemplate().then(res =>{ 2 3 const data = res.data 4 const url = window.URL.createObject ...