GCC选项_-Wl,-soname
http://blog.csdn.net/gohome520/article/details/7259450
-Wl选项告诉编译器将后面的参数传递给链接器。
-soname则指定了动态库的soname(简单共享名,Short for shared object name)
soname的关键功能是它提供了兼容性的标准:
当要升级系统中的一个库时,并且新库的soname和老库的soname一样,用旧库链接生成的程序使用新库依然能正常运行。这个特性使得在Linux下,升级使得共享库的程序和定位错误变得十分容易。
在Linux中,应用程序通过使用soname,来指定所希望库的版本,库作者可以通过保留或改变soname来声明,哪些版本是兼容的,这使得程序员摆脱了共享库版本冲突问题的困扰。
可以通过readelf -d来查看每个动态库的SONAME
1. 声明libto.so.1,并生成libto.so.1.2
- [root@localhost c]# gcc -fPIC -shared -Wl,-soname,libto.so.1 -o libto.so.1.2 to.c
- [root@localhost c]# ls -lh
- -rwxr-xr-x 1 root root 4268 Jan 10 17:22 libto.so.1.2
- [root@localhost c]# ldconfig -n ./
- lrwxrwxrwx 1 root root 12 Jan 10 17:23 libto.so.1 -> libto.so.1.2
- -rwxr-xr-x 1 root root 4.2K Jan 10 17:22 libto.so.1.2
- [root@localhost c]# readelf -d libto.so.1.2
- Dynamic section at offset 0x504 contains 21 entries:
- Tag Type Name/Value
- 0x00000001 (NEEDED) Shared library: [libc.so.6]
- 0x0000000e (SONAME) Library soname: [libto.so.1]
- 0x0000000c (INIT) 0x2cc
- 0x0000000d (FINI) 0x4c4
- 0x6ffffef5 (GNU_HASH) 0xb4
- 0x00000005 (STRTAB) 0x1b4
- 0x00000006 (SYMTAB) 0xf4
- 0x0000000a (STRSZ) 150 (bytes)
- 0x0000000b (SYMENT) 16 (bytes)
- 0x00000003 (PLTGOT) 0x15d8
- 0x00000002 (PLTRELSZ) 24 (bytes)
- 0x00000014 (PLTREL) REL
- 0x00000017 (JMPREL) 0x2b4
- 0x00000011 (REL) 0x294
- 0x00000012 (RELSZ) 32 (bytes)
- 0x00000013 (RELENT) 8 (bytes)
- 0x6ffffffe (VERNEED) 0x264
- 0x6fffffff (VERNEEDNUM) 1
- 0x6ffffff0 (VERSYM) 0x24a
- 0x6ffffffa (RELCOUNT) 1
- 0x00000000 (NULL) 0x0
2. 声明libto.so.1,并生成libto.so.1.3
- [root@localhost c]# gcc -fPIC -shared -Wl,-soname,libto.so.1 -o libto.so.1.3 to.c
- [root@localhost c]# ls -lh
- lrwxrwxrwx 1 root root 12 Jan 10 17:23 libto.so.1 -> libto.so.1.2
- -rwxr-xr-x 1 root root 4.2K Jan 10 17:22 libto.so.1.2
- -rwxr-xr-x 1 root root 4.2K Jan 10 17:23 libto.so.1.3
- [root@localhost c]# ldconfig -n ./
- lrwxrwxrwx 1 root root 12 Jan 10 17:24 libto.so.1 -> libto.so.1.3 #重新ldconfig,指向新的库文件
- -rwxr-xr-x 1 root root 4.2K Jan 10 17:22 libto.so.1.2
- -rwxr-xr-x 1 root root 4.2K Jan 10 17:23 libto.so.1.3
- [root@localhost c]# readelf -d libto.so.1.3
- Dynamic section at offset 0x504 contains 21 entries:
- Tag Type Name/Value
- 0x00000001 (NEEDED) Shared library: [libc.so.6]
- 0x0000000e (SONAME) Library soname: [libto.so.1]
- 0x0000000c (INIT) 0x2cc
- 0x0000000d (FINI) 0x4c4
- 0x6ffffef5 (GNU_HASH) 0xb4
- 0x00000005 (STRTAB) 0x1b4
- 0x00000006 (SYMTAB) 0xf4
- 0x0000000a (STRSZ) 150 (bytes)
- 0x0000000b (SYMENT) 16 (bytes)
- 0x00000003 (PLTGOT) 0x15d8
- 0x00000002 (PLTRELSZ) 24 (bytes)
- 0x00000014 (PLTREL) REL
- 0x00000017 (JMPREL) 0x2b4
- 0x00000011 (REL) 0x294
- 0x00000012 (RELSZ) 32 (bytes)
- 0x00000013 (RELENT) 8 (bytes)
- 0x6ffffffe (VERNEED) 0x264
- 0x6fffffff (VERNEEDNUM) 1
- 0x6ffffff0 (VERSYM) 0x24a
- 0x6ffffffa (RELCOUNT) 1
- 0x00000000 (NULL) 0x0
3. 声明libto.so.2,并生成libto.so.1.4
- [root@localhost c]# gcc -fPIC -shared -Wl,-soname,libto.so.2 -o libto.so.1.4 to.c
- [root@localhost c]# ls -lh
- lrwxrwxrwx 1 root root 12 Jan 10 17:24 libto.so.1 -> libto.so.1.3
- -rwxr-xr-x 1 root root 4.2K Jan 10 17:22 libto.so.1.2
- -rwxr-xr-x 1 root root 4.2K Jan 10 17:23 libto.so.1.3
- -rwxr-xr-x 1 root root 4.2K Jan 10 17:24 libto.so.1.4
- [root@localhost c]# ldconfig -n ./
- lrwxrwxrwx 1 root root 12 Jan 10 17:24 libto.so.1 -> libto.so.1.3 #重新ldconfig,不指向新的库文件,因为新库(1.4)的soname为libto.so.2
- -rwxr-xr-x 1 root root 4.2K Jan 10 17:22 libto.so.1.2
- -rwxr-xr-x 1 root root 4.2K Jan 10 17:23 libto.so.1.3
- -rwxr-xr-x 1 root root 4.2K Jan 10 17:24 libto.so.1.4
- lrwxrwxrwx 1 root root 12 Jan 10 17:24 libto.so.2 -> libto.so.1.4
- [root@localhost c]# readelf -d libto.so.1.4
- Dynamic section at offset 0x504 contains 21 entries:
- Tag Type Name/Value
- 0x00000001 (NEEDED) Shared library: [libc.so.6]
- 0x0000000e (SONAME) Library soname: [libto.so.2]
- 0x0000000c (INIT) 0x2cc
- 0x0000000d (FINI) 0x4c4
- 0x6ffffef5 (GNU_HASH) 0xb4
- 0x00000005 (STRTAB) 0x1b4
- 0x00000006 (SYMTAB) 0xf4
- 0x0000000a (STRSZ) 150 (bytes)
- 0x0000000b (SYMENT) 16 (bytes)
- 0x00000003 (PLTGOT) 0x15d8
- 0x00000002 (PLTRELSZ) 24 (bytes)
- 0x00000014 (PLTREL) REL
- 0x00000017 (JMPREL) 0x2b4
- 0x00000011 (REL) 0x294
- 0x00000012 (RELSZ) 32 (bytes)
- 0x00000013 (RELENT) 8 (bytes)
- 0x6ffffffe (VERNEED) 0x264
- 0x6fffffff (VERNEEDNUM) 1
- 0x6ffffff0 (VERSYM) 0x24a
- 0x6ffffffa (RELCOUNT) 1
- 0x00000000 (NULL) 0x0
总结:程式库主要的升级会破坏相容性;而次要的升级则可能不会;那麽以下面的方式来连结,所有的一切就都会相安无事了。
gcc -shared -Wl,-soname,libfoo.so.major -o libfoo.so.major.minor
直观理解,加上soname之后,要想修改这个名字,只能用软链接到这个库,修改软链接的名字。连接到可执行文件中去的名字还是soname
GCC选项_-Wl,-soname相关推荐
- GCC选项_-Wl,-soname 及 DT_NEEDED 的解释
-Wl选项告诉编译器将后面的参数传递给链接器. -soname则指定了动态库的soname(简单共享名,Short for shared object name) soname的关键功能是它提供了兼容 ...
- gcc选项 和 gdb 使用
CC 编译详解 GNU CC(简称为Gcc)是GNU项目中符合ANSI C标准的编译系统,能够编译用C.C++和Object C等语言编写的程序.Gcc不仅功能强大,而且可以编译如C.C++.Obje ...
- -wl,-soname的作用
-wl,-soname指定so的别名,很有用.如果不知道别名,链接了该so的文件中会包含路径. opencv遇到这种问题,修改编译目录下的link.txt文件指定 -wl,-soname即可去掉路径 ...
- 嵌入式linux开发笔记: gcc选项
fatal error: sys/cdefs.h No such file or directory 解决方案 在64位的ubuntu系统,使用gcc想编译出32位的应用程序,需要使用gcc - ...
- gcc选项-g与-rdynamic的异同
gcc 的 -g ,应该没有人不知道它是一个调试选项,因此在一般需要进行程序调试的场景下,我们都会加上该选项,并且根据调试工具的不同,还能直接选择更有针对性的说明,比如 -ggdb .-g是一个编译选 ...
- linux gcc 示例_最好的Linux示例
linux gcc 示例 Linux is a powerful operating system that powers most servers and most mobile devices. ...
- [转]gcc -ffunction-sections -fdata-sections -Wl,–gc-sections 参数详解
背景 有时我们的程序会定义一些暂时使用不上的功能和函数,虽然我们不使用这些功能和函数,但它们往往会浪费我们的ROM和RAM的空间.这在使用静态库时,体现的更为严重.有时,我们只使用了静态库仅有的几个功 ...
- gcc -ffunction-sections -fdata-sections -Wl,–gc-sections 参数详解
背景 有时我们的程序会定义一些暂时使用不上的功能和函数,虽然我们不使用这些功能和函数,但它们往往会浪费我们的ROM和RAM的空间.这在使用静态库时,体现的更为严重.有时,我们只使用了静态库仅有的几个功 ...
- win10系统如何恢复服务器,win10如何打开恢复选项_网站服务器运行维护
win10打开或关闭系统图标界面网络显示灰色_网站服务器运行维护 win10打开或关闭系统图标界面网络显示灰色的解决方法是:1.首先使用[ctrl+shift+esc]组合键打开任务管理器:2.然后切 ...
最新文章
- Angel:深度学习在腾讯广告推荐系统中的实践
- SAP Web Intelligence初探
- mysql数据导入、导出
- oracle LPDA,oracle中自动增长列的设置
- build libusb for Android
- t oracle删除吗,Oracle 11g 手工建库与删库
- opengl 安装_一步步学OpenGL(34) -《GLFX,一个OpenGL效果库》
- ServiceMash服务网格--理解lstio/envoy
- 使用SignalR和SQLTableDependency进行记录更改的SQL Server通知
- html异步 post,Jquery中Ajax/Post同步和异步请求
- PCurve - Curve on Surface
- 《机器学习》周志华--第5章神经网络。 笔记+习题
- 毕业设计 STM32单片机的GPS定位系统 - 物联网
- element ui table样式
- 一文读懂nginx gzip_static
- HTML嵌入JavaScript代码的三种方式
- c语言考试题型分数,强校-2018年计算机等级考试各科考试题型和分值
- 操作系统中的几种I/O控制方式
- RN:真机调试无线调试
- 线性代数之特征值与特征向量的求法
热门文章
- 十五、深入Python输入和输出
- keras从入门到放弃(十一)电影评价预测
- 更好的对比样本选择,更好的对比效果
- 超大规模智能模型相关工作总结:编程实现框架、算法模型、微调技术和应用...
- 3D Human相关研究总结:人体、姿态估计、人体重建等
- 叮!您有一份来自平安人寿的真AI情书
- POJ 1584 A Round Peg in a Ground Hole 判断凸多边形,点到线段距离,点在多边形内
- win10无线投屏_日臻薄技 | 手机如何投屏到电脑
- 【Linux部署】Greenplum数据库6.13.0单机版 [CRITICAL]:-Error occurred: non-zero rc: 1(报错详情+问题处理:内存释放)
- Zookeeper知识梳理