gcc编译选项-Wl
轉(zhuǎn)自:
https://blog.csdn.net/wang_hufeng/article/details/53899120
-Wl選項(xiàng)告訴編譯器將后面的參數(shù)傳遞給鏈接器。
-soname則指定了動(dòng)態(tài)庫(kù)的soname(簡(jiǎn)單共享名,Short for shared object name)
-Wl 表示后面的參數(shù)也就是-soname,libhello.so.1直接傳給連接器ld進(jìn)行處理。實(shí)際上,每一個(gè)庫(kù)都有一個(gè)soname,當(dāng)連接器發(fā)現(xiàn)它正 在查找的程序庫(kù)中有這樣一個(gè)名稱(chēng),連接器便會(huì)將soname嵌入連結(jié)中的二進(jìn)制文件內(nèi),而不是它正在運(yùn)行的實(shí)際文件名,在程序執(zhí)行期間,程序會(huì)查找擁有 soname名字的文件,而不是庫(kù)的文件名,換句話(huà)說(shuō),soname是庫(kù)的區(qū)分標(biāo)志。
這樣做的目的主要是允許系統(tǒng)中多個(gè)版本的庫(kù)文件共存,習(xí)慣上在命名庫(kù)文件的時(shí)候通常與soname相同
libxxxx.so.major.minor
其中,xxxx是庫(kù)的名字,major是主版本號(hào),minor 是次版本號(hào)
簡(jiǎn)單的來(lái)說(shuō),soname指定了庫(kù)的名字,而不去管生成的是什么名字的庫(kù),在做連接是將這個(gè)soname指定的名字加入執(zhí)行文件中,而程序運(yùn)行是也是去加載soname指定的庫(kù)文件名。所以如果程序連接了新升級(jí)的庫(kù),只需要將這個(gè)新庫(kù)拷貝到目錄下面后,對(duì)其以soname做一個(gè)符號(hào)鏈接就能調(diào)用。
如果庫(kù)升級(jí)了,但是程序依舊使用舊的鏈接庫(kù),那么只需對(duì)這個(gè)將舊庫(kù)名字軟鏈接到新升級(jí)的庫(kù)中去即可。
soname的關(guān)鍵功能是它提供了兼容性的標(biāo)準(zhǔn):
當(dāng)要升級(jí)系統(tǒng)中的一個(gè)庫(kù)時(shí),并且新庫(kù)的soname和老庫(kù)的soname一樣,用舊庫(kù)鏈接生成的程序使用新庫(kù)依然能正常運(yùn)行。這個(gè)特性使得在Linux下,升級(jí)使得共享庫(kù)的程序和定位錯(cuò)誤變得十分容易。
在Linux中,應(yīng)用程序通過(guò)使用soname,來(lái)指定所希望庫(kù)的版本,庫(kù)作者可以通過(guò)保留或改變soname來(lái)聲明,哪些版本是兼容的,這使得程序員擺脫了共享庫(kù)版本沖突問(wèn)題的困擾。
可以通過(guò)readelf -d來(lái)查看每個(gè)動(dòng)態(tài)庫(kù)的SONAME
總結(jié)
以上是生活随笔為你收集整理的gcc编译选项-Wl的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 店铺选址、六大要素
- 下一篇: 手机游戏服务器使用UDP还是TCP