GCC选项_-Wl,-soname

转载 2016年06月01日 17:11:47

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

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

[plain] view plain copy
  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 plain copy
  1. [root@localhost c]# readelf -d libto.so.1.3  
  2.   
  3.   
  4. Dynamic section at offset 0x504 contains 21 entries:  
  5.   Tag        Type                         Name/Value  
  6.  0x00000001 (NEEDED)                     Shared library: [libc.so.6]  
  7.  0x0000000e (SONAME)                     Library soname: [libto.so.1]  
  8.  0x0000000c (INIT)                       0x2cc  
  9.  0x0000000d (FINI)                       0x4c4  
  10.  0x6ffffef5 (GNU_HASH)                   0xb4  
  11.  0x00000005 (STRTAB)                     0x1b4  
  12.  0x00000006 (SYMTAB)                     0xf4  
  13.  0x0000000a (STRSZ)                      150 (bytes)  
  14.  0x0000000b (SYMENT)                     16 (bytes)  
  15.  0x00000003 (PLTGOT)                     0x15d8  
  16.  0x00000002 (PLTRELSZ)                   24 (bytes)  
  17.  0x00000014 (PLTREL)                     REL  
  18.  0x00000017 (JMPREL)                     0x2b4  
  19.  0x00000011 (REL)                        0x294  
  20.  0x00000012 (RELSZ)                      32 (bytes)  
  21.  0x00000013 (RELENT)                     8 (bytes)  
  22.  0x6ffffffe (VERNEED)                    0x264  
  23.  0x6fffffff (VERNEEDNUM)                 1  
  24.  0x6ffffff0 (VERSYM)                     0x24a  
  25.  0x6ffffffa (RELCOUNT)                   1  
  26.  0x00000000 (NULL)                       0x0  

3. 声明libto.so.2,并生成libto.so.1.4
[plain] view plain copy
  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 plain copy
  1. [root@localhost c]# readelf -d libto.so.1.4  
  2.   
  3.   
  4. Dynamic section at offset 0x504 contains 21 entries:  
  5.   Tag        Type                         Name/Value  
  6.  0x00000001 (NEEDED)                     Shared library: [libc.so.6]  
  7.  0x0000000e (SONAME)                     Library soname: [libto.so.2]  
  8.  0x0000000c (INIT)                       0x2cc  
  9.  0x0000000d (FINI)                       0x4c4  
  10.  0x6ffffef5 (GNU_HASH)                   0xb4  
  11.  0x00000005 (STRTAB)                     0x1b4  
  12.  0x00000006 (SYMTAB)                     0xf4  
  13.  0x0000000a (STRSZ)                      150 (bytes)  
  14.  0x0000000b (SYMENT)                     16 (bytes)  
  15.  0x00000003 (PLTGOT)                     0x15d8  
  16.  0x00000002 (PLTRELSZ)                   24 (bytes)  
  17.  0x00000014 (PLTREL)                     REL  
  18.  0x00000017 (JMPREL)                     0x2b4  
  19.  0x00000011 (REL)                        0x294  
  20.  0x00000012 (RELSZ)                      32 (bytes)  
  21.  0x00000013 (RELENT)                     8 (bytes)  
  22.  0x6ffffffe (VERNEED)                    0x264  
  23.  0x6fffffff (VERNEEDNUM)                 1  
  24.  0x6ffffff0 (VERSYM)                     0x24a  
  25.  0x6ffffffa (RELCOUNT)                   1  
  26.  0x00000000 (NULL)                       0x0  


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


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

相关文章推荐

gcc的 -Wl参数的作用

http://stackoverflow.com/questions/2954387/can-i-mix-static-and-shared-object-libraries-when-linking...
  • bsnry
  • bsnry
  • 2015年09月15日 09:17
  • 1323

gcc编译选项-Wl

-Wl选项告诉编译器将后面的参数传递给链接器。 -soname则指定了动态库的soname(简单共享名,Short for shared object name) -Wl 表示后面的参数也就是-s...

GCC选项_-Wl,-soname

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

动态库对应用程序的影响&ldd -u&gcc -Wl,--as-needed

linux 下有动态库和静态库,动态库以.so为扩展名,静态库以.a为扩展名。二者都使用广泛。本文主要讲动态库方面知识。        基本上每一个linux 程序都至少会有一个动态库,查...

GCC警告选项例解

  • 2012年03月28日 09:10
  • 57KB
  • 下载

gcc 编译器选项

  • 2017年05月02日 11:32
  • 24KB
  • 下载

gcc中的-w -W和-Wall选项

今天在看一个makefile时看到了gcc -W -Wall....这句,不明其理,专门查看了gcc的使用手册。-w的意思是关闭编译时的警告,也就是编译后不显示任何warning,因为有时在编译之后编...
  • m7548352
  • m7548352
  • 2015年10月30日 23:20
  • 12492

GCC警告选项例解

  • 2013年05月03日 10:32
  • 2.98MB
  • 下载

gcc的中文版使用说明和选项

使用gcc -v --help可以列出gcc的所有可选项 用法:gcc [选项] 文件... 选项: -pass-exit-codes 在某一阶段退出时返回最高的错误码 --...
  • earbao
  • earbao
  • 2016年11月13日 23:46
  • 3593
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:GCC选项_-Wl,-soname
举报原因:
原因补充:

(最多只允许输入30个字)