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

[plain] view plaincopy
  1. [root@localhost c]# gcc -fPIC -shared -Wl,-soname,libto.so.1 -o libto.so.1.2 to.c
  2. [root@localhost c]# ls -lh
  3. -rwxr-xr-x 1 root root 4268 Jan 10 17:22 libto.so.1.2
  4. [root@localhost c]# ldconfig -n ./
  5. lrwxrwxrwx 1 root root   12 Jan 10 17:23 libto.so.1 -> libto.so.1.2
  6. -rwxr-xr-x 1 root root 4.2K Jan 10 17:22 libto.so.1.2
[plain] view plaincopy
  1. [root@localhost c]# readelf -d libto.so.1.2
  2. Dynamic section at offset 0x504 contains 21 entries:
  3. Tag        Type                         Name/Value
  4. 0x00000001 (NEEDED)                     Shared library: [libc.so.6]
  5. 0x0000000e (SONAME)                     Library soname: [libto.so.1]
  6. 0x0000000c (INIT)                       0x2cc
  7. 0x0000000d (FINI)                       0x4c4
  8. 0x6ffffef5 (GNU_HASH)                   0xb4
  9. 0x00000005 (STRTAB)                     0x1b4
  10. 0x00000006 (SYMTAB)                     0xf4
  11. 0x0000000a (STRSZ)                      150 (bytes)
  12. 0x0000000b (SYMENT)                     16 (bytes)
  13. 0x00000003 (PLTGOT)                     0x15d8
  14. 0x00000002 (PLTRELSZ)                   24 (bytes)
  15. 0x00000014 (PLTREL)                     REL
  16. 0x00000017 (JMPREL)                     0x2b4
  17. 0x00000011 (REL)                        0x294
  18. 0x00000012 (RELSZ)                      32 (bytes)
  19. 0x00000013 (RELENT)                     8 (bytes)
  20. 0x6ffffffe (VERNEED)                    0x264
  21. 0x6fffffff (VERNEEDNUM)                 1
  22. 0x6ffffff0 (VERSYM)                     0x24a
  23. 0x6ffffffa (RELCOUNT)                   1
  24. 0x00000000 (NULL)                       0x0

2. 声明libto.so.1,并生成libto.so.1.3

[plain] view plaincopy
  1. [root@localhost c]# gcc -fPIC -shared -Wl,-soname,libto.so.1 -o libto.so.1.3 to.c
  2. [root@localhost c]# ls -lh
  3. lrwxrwxrwx 1 root root   12 Jan 10 17:23 libto.so.1 -> libto.so.1.2
  4. -rwxr-xr-x 1 root root 4.2K Jan 10 17:22 libto.so.1.2
  5. -rwxr-xr-x 1 root root 4.2K Jan 10 17:23 libto.so.1.3
  6. [root@localhost c]# ldconfig -n ./
  7. lrwxrwxrwx 1 root root   12 Jan 10 17:24 libto.so.1 -> libto.so.1.3  #重新ldconfig,指向新的库文件
  8. -rwxr-xr-x 1 root root 4.2K Jan 10 17:22 libto.so.1.2
  9. -rwxr-xr-x 1 root root 4.2K Jan 10 17:23 libto.so.1.3
[plain] view plaincopy
  1. [root@localhost c]# readelf -d libto.so.1.3
  2. Dynamic section at offset 0x504 contains 21 entries:
  3. Tag        Type                         Name/Value
  4. 0x00000001 (NEEDED)                     Shared library: [libc.so.6]
  5. 0x0000000e (SONAME)                     Library soname: [libto.so.1]
  6. 0x0000000c (INIT)                       0x2cc
  7. 0x0000000d (FINI)                       0x4c4
  8. 0x6ffffef5 (GNU_HASH)                   0xb4
  9. 0x00000005 (STRTAB)                     0x1b4
  10. 0x00000006 (SYMTAB)                     0xf4
  11. 0x0000000a (STRSZ)                      150 (bytes)
  12. 0x0000000b (SYMENT)                     16 (bytes)
  13. 0x00000003 (PLTGOT)                     0x15d8
  14. 0x00000002 (PLTRELSZ)                   24 (bytes)
  15. 0x00000014 (PLTREL)                     REL
  16. 0x00000017 (JMPREL)                     0x2b4
  17. 0x00000011 (REL)                        0x294
  18. 0x00000012 (RELSZ)                      32 (bytes)
  19. 0x00000013 (RELENT)                     8 (bytes)
  20. 0x6ffffffe (VERNEED)                    0x264
  21. 0x6fffffff (VERNEEDNUM)                 1
  22. 0x6ffffff0 (VERSYM)                     0x24a
  23. 0x6ffffffa (RELCOUNT)                   1
  24. 0x00000000 (NULL)                       0x0

3. 声明libto.so.2,并生成libto.so.1.4

[plain] view plaincopy
  1. [root@localhost c]# gcc -fPIC -shared -Wl,-soname,libto.so.2 -o libto.so.1.4 to.c
  2. [root@localhost c]# ls -lh
  3. lrwxrwxrwx 1 root root   12 Jan 10 17:24 libto.so.1 -> libto.so.1.3
  4. -rwxr-xr-x 1 root root 4.2K Jan 10 17:22 libto.so.1.2
  5. -rwxr-xr-x 1 root root 4.2K Jan 10 17:23 libto.so.1.3
  6. -rwxr-xr-x 1 root root 4.2K Jan 10 17:24 libto.so.1.4
  7. [root@localhost c]# ldconfig -n ./
  8. lrwxrwxrwx 1 root root   12 Jan 10 17:24 libto.so.1 -> libto.so.1.3  #重新ldconfig,不指向新的库文件,因为新库(1.4)的soname为libto.so.2
  9. -rwxr-xr-x 1 root root 4.2K Jan 10 17:22 libto.so.1.2
  10. -rwxr-xr-x 1 root root 4.2K Jan 10 17:23 libto.so.1.3
  11. -rwxr-xr-x 1 root root 4.2K Jan 10 17:24 libto.so.1.4
  12. lrwxrwxrwx 1 root root   12 Jan 10 17:24 libto.so.2 -> libto.so.1.4
[plain] view plaincopy
  1. [root@localhost c]# readelf -d libto.so.1.4
  2. Dynamic section at offset 0x504 contains 21 entries:
  3. Tag        Type                         Name/Value
  4. 0x00000001 (NEEDED)                     Shared library: [libc.so.6]
  5. 0x0000000e (SONAME)                     Library soname: [libto.so.2]
  6. 0x0000000c (INIT)                       0x2cc
  7. 0x0000000d (FINI)                       0x4c4
  8. 0x6ffffef5 (GNU_HASH)                   0xb4
  9. 0x00000005 (STRTAB)                     0x1b4
  10. 0x00000006 (SYMTAB)                     0xf4
  11. 0x0000000a (STRSZ)                      150 (bytes)
  12. 0x0000000b (SYMENT)                     16 (bytes)
  13. 0x00000003 (PLTGOT)                     0x15d8
  14. 0x00000002 (PLTRELSZ)                   24 (bytes)
  15. 0x00000014 (PLTREL)                     REL
  16. 0x00000017 (JMPREL)                     0x2b4
  17. 0x00000011 (REL)                        0x294
  18. 0x00000012 (RELSZ)                      32 (bytes)
  19. 0x00000013 (RELENT)                     8 (bytes)
  20. 0x6ffffffe (VERNEED)                    0x264
  21. 0x6fffffff (VERNEEDNUM)                 1
  22. 0x6ffffff0 (VERSYM)                     0x24a
  23. 0x6ffffffa (RELCOUNT)                   1
  24. 0x00000000 (NULL)                       0x0

总结:程式库主要的升级会破坏相容性;而次要的升级则可能不会;那麽以下面的方式来连结,所有的一切就都会相安无事了。 
gcc -shared -Wl,-soname,libfoo.so.major -o libfoo.so.major.minor

直观理解,加上soname之后,要想修改这个名字,只能用软链接到这个库,修改软链接的名字。连接到可执行文件中去的名字还是soname

GCC选项_-Wl,-soname相关推荐

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

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

  2. gcc选项 和 gdb 使用

    CC 编译详解 GNU CC(简称为Gcc)是GNU项目中符合ANSI C标准的编译系统,能够编译用C.C++和Object C等语言编写的程序.Gcc不仅功能强大,而且可以编译如C.C++.Obje ...

  3. -wl,-soname的作用

     -wl,-soname指定so的别名,很有用.如果不知道别名,链接了该so的文件中会包含路径. opencv遇到这种问题,修改编译目录下的link.txt文件指定 -wl,-soname即可去掉路径 ...

  4. 嵌入式linux开发笔记: gcc选项

    fatal error: sys/cdefs.h No such file or directory 解决方案   在64位的ubuntu系统,使用gcc想编译出32位的应用程序,需要使用gcc  - ...

  5. gcc选项-g与-rdynamic的异同

    gcc 的 -g ,应该没有人不知道它是一个调试选项,因此在一般需要进行程序调试的场景下,我们都会加上该选项,并且根据调试工具的不同,还能直接选择更有针对性的说明,比如 -ggdb .-g是一个编译选 ...

  6. linux gcc 示例_最好的Linux示例

    linux gcc 示例 Linux is a powerful operating system that powers most servers and most mobile devices. ...

  7. [转]gcc -ffunction-sections -fdata-sections -Wl,–gc-sections 参数详解

    背景 有时我们的程序会定义一些暂时使用不上的功能和函数,虽然我们不使用这些功能和函数,但它们往往会浪费我们的ROM和RAM的空间.这在使用静态库时,体现的更为严重.有时,我们只使用了静态库仅有的几个功 ...

  8. gcc -ffunction-sections -fdata-sections -Wl,–gc-sections 参数详解

    背景 有时我们的程序会定义一些暂时使用不上的功能和函数,虽然我们不使用这些功能和函数,但它们往往会浪费我们的ROM和RAM的空间.这在使用静态库时,体现的更为严重.有时,我们只使用了静态库仅有的几个功 ...

  9. win10系统如何恢复服务器,win10如何打开恢复选项_网站服务器运行维护

    win10打开或关闭系统图标界面网络显示灰色_网站服务器运行维护 win10打开或关闭系统图标界面网络显示灰色的解决方法是:1.首先使用[ctrl+shift+esc]组合键打开任务管理器:2.然后切 ...

最新文章

  1. Angel:深度学习在腾讯广告推荐系统中的实践
  2. SAP Web Intelligence初探
  3. mysql数据导入、导出
  4. oracle LPDA,oracle中自动增长列的设置
  5. build libusb for Android
  6. t oracle删除吗,Oracle 11g 手工建库与删库
  7. opengl 安装_一步步学OpenGL(34) -《GLFX,一个OpenGL效果库》
  8. ServiceMash服务网格--理解lstio/envoy
  9. 使用SignalR和SQLTableDependency进行记录更改的SQL Server通知
  10. html异步 post,Jquery中Ajax/Post同步和异步请求
  11. PCurve - Curve on Surface
  12. 《机器学习》周志华--第5章神经网络。 笔记+习题
  13. 毕业设计 STM32单片机的GPS定位系统 - 物联网
  14. element ui table样式
  15. 一文读懂nginx gzip_static
  16. HTML嵌入JavaScript代码的三种方式
  17. c语言考试题型分数,强校-2018年计算机等级考试各科考试题型和分值
  18. 操作系统中的几种I/O控制方式
  19. RN:真机调试无线调试
  20. 线性代数之特征值与特征向量的求法

热门文章

  1. 十五、深入Python输入和输出
  2. keras从入门到放弃(十一)电影评价预测
  3. 更好的对比样本选择,更好的对比效果
  4. 超大规模智能模型相关工作总结:编程实现框架、算法模型、微调技术和应用...
  5. 3D Human相关研究总结:人体、姿态估计、人体重建等
  6. 叮!您有一份来自平安人寿的真AI情书
  7. POJ 1584 A Round Peg in a Ground Hole 判断凸多边形,点到线段距离,点在多边形内
  8. win10无线投屏_日臻薄技 | 手机如何投屏到电脑
  9. 【Linux部署】Greenplum数据库6.13.0单机版 [CRITICAL]:-Error occurred: non-zero rc: 1(报错详情+问题处理:内存释放)
  10. Zookeeper知识梳理