1. 程式人生 > >gcc編譯選項-Wl

gcc編譯選項-Wl

-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