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