歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

GCC選項_-Wl,-soname

-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

總結:程式庫主要的升級會破壞相容性;而次要的升級則可能不會;那麽以下面的方式來連結,所有的一切就都會相安無事了。

gcc -shared -Wl,-soname,libfoo.so.major -o libfoo.so.major.minor

Ubuntu 12.04嵌入式交叉編譯環境arm-linux-GCC搭建過程圖解 http://www.linuxidc.com/Linux/2013-06/85902.htm

Ubuntu 12.10安裝交叉編譯器arm-none-linux-gnueabi-GCC http://www.linuxidc.com/Linux/2013-03/82016.htm

Ubuntu下Vim+GCC+GDB安裝及使用 http://www.linuxidc.com/Linux/2013-01/78159.htm

Ubuntu下兩個GCC版本切換 http://www.linuxidc.com/Linux/2012-10/72284.htm

GCC 的詳細介紹:請點這裡
GCC 的下載地址:請點這裡

Copyright © Linux教程網 All Rights Reserved