6、linux共享庫的組織
共享庫版本
- 1、相容性,為了使共享庫能夠有更好的二進位制相容性,最好做到不要使用c++做介面,如果一定要使用需注意(1)不在介面類中使用虛擬函式;(2)不改變類中任何成員變數的位置和型別
- 2、共享庫版本命名
libname.so.x.y.z
x主版本號,x不同共享庫不相容
y次版本號,表示增量升級,新增新介面
z釋出版本號,修改錯誤和效能方面的問題
- 3、SO-NAME,表示一個庫的介面,體現一個程式依賴的共享庫所需要的最少資訊
libname.so.x
linux中通常是以so-name作為連結,指向一個實際的最新的動態庫,每次按照新共享庫後需執行ldconfig將軟連結指向最新的共享庫
libname.so.x->libname.so.x.y.z
由於歷史原因c語言庫和動態連結器的so-name如下
ld-linux.so->ld-2.6.1.so
libc.so.6->libc-2.6.1.so
符號版本
之所以提出符號版本的概念是因為次版本交會問題,使用SO-NAME在程式執行時只判斷了主版本,但是主版本號相同的共享庫也存在的一定的介面數量的差別,這將導致依賴於SO-NAME並不能保證程式可以正常執行(這個也就是次版本交會問題)。
符號版本的基本思路是讓共享庫的每一個匯入匯出符號都有一個相關聯的版本號,做法上類似名稱修飾的方式。
共享庫的系統路徑
目前大多數linux系統都支援一個叫做FHS(file hierarchy standard)的標準,規定系統中系統檔案應該如何放置,各個目錄的結構、組織和作用
FHS中規定了三個共享庫的放置目錄
- 1、/lib存放系統最關鍵和基礎的共享庫,主要是/bin、/sbin和系統啟動需要使用到的共享庫
- 2、/usr/lib主要存放非系統執行時所需要的關鍵性共享庫,包括一些開發庫等
- 3、/usr/local/lib主要存放第三方應用程式的庫
共享庫的查詢過程
動態連結模組所依賴的模組路徑儲存在.dynamic由DT_NEED型別項表示,通常存放的共享庫的相對路徑,連結在連結時就需要查詢到共享庫的實際位置,查詢順序如下
- 0、LD_LIBRARY_PATH變數所指示的路徑下查詢,這個變數可以臨時修改某個程式的共享庫查詢路徑,指定了該變數連結器在查詢共享庫時會優先查詢該變數所指示的路徑
- 1、查詢/etc/ld.so.cache,由ldconfig建立更新
- 2、查詢/lib和/usr/lib目錄
與連結相關的環境變數
- 1、LD_LIBRARY_PATH
這個變數可以臨時修改某個程式的共享庫查詢路徑,指定了該變數連結器在查詢共享庫時會優先查詢該變數所指示的路徑 - 2、LD_PRLOAD
這個變數可以在程式裝載其他共享庫時,指定預先裝載一些共享庫,優先於LD_LIBRARY_PATH,且無論程式是否依賴該共享庫,均會被載入。(由於該機制的存在,同時還有載入時的全域性符號介入機制,導致可以利用該變數對標準庫或者其他庫中的符號進行替換) - 3、LD_DEBUG
這個變數可以開啟動態連結的除錯功能,檢視到連結的過程中的各種詳細資訊,如共享庫的載入、符號的解析、路徑查詢等過程
共享庫的建立安裝
1、建立
gcc -shared -fPIC -Wl,-soname,my_soname -o libname source_file
-shared 表示生成共享庫
-fPIC表示使用地址無關程式碼技術
-Wl表示把後面的引數傳遞給連結器,例如-soname表示指定共享庫的SO-NAME
2、安裝
複製到/lib或者/usr/lib或者/usr/local/lib目錄下,然後執行ldconfig
3、共享庫指令碼
前面提到共享庫通常是elf的dso檔案,但共享庫也可以是一個符合一定格式的指令碼,通過這種指令碼可以把結構現有的共享庫通過一定的方式組合起來,從使用者的角度就是一個新的共享庫,格式如下
GROUP( /lib/libc.so.6 /lib/libm.so.2)
end~
相關文章
- Linux 核心101:cache組織策略Linux
- 如何組織大型 Rust 程式碼庫Rust
- Linux共享庫、靜態庫、動態庫詳解Linux
- 組織的紀律
- 使用 Calcurse 在 Linux 命令列中組織任務Linux命令列
- 座席組織
- 如何從資料庫提取海波龍的組織主資料資料庫
- 組織知識的方法
- 資料庫實現原理#6(共享記憶體)資料庫記憶體
- 6種測試組織模式,你看好哪一種? | IDCF模式
- .NET C#基礎(6):名稱空間 - 組織程式碼的利器C#
- 程式的定義、組成、組織方式、特徵特徵
- 梳理公司的組織架構 — 組合模式架構模式
- 六種組織CSS的方式CSS
- rust 模組組織結構Rust
- 織夢資料庫_織夢還原資料庫_織夢資料庫很卡資料庫
- CIO指南:未來CIO——數字化韌性框架的6個組織維度框架
- 你不能訪問此共享資料夾,因為你組織的安全策略的解決辦法
- 組織css程式碼CSS
- HomeAssistantOS和docker的組織關係Docker
- 使用 Notmuch 組織你的郵件
- 打造敏捷的自組織團隊敏捷
- 領域邏輯的組織模式模式
- 組織敏捷轉型中的 HR敏捷
- 如何更好的組織你的Laravel模型Laravel模型
- 如何組織軟體模組的程式碼結構?
- Linux共享記憶體的管理Linux記憶體
- 列表外掛中獲取過濾的組織範圍以及是否勾選全部組織
- 組織: 階級: 組織+管理+授權+組織結構設計+ 角色 + 分工: individual型別: 體力+普工+文職+型別
- Vuex 進階——模組化組織 VuexVue
- 利用 configtxlator 動態的新增 fabric 的組織
- 你是如何組織html程式碼的?HTML
- google chrome去除組織策略GoChrome
- 程式碼模型組織方式模型
- AWD比賽組織指南
- organizational alignment 組織調整
- 組織程式和資料
- 亞太經合組織:COVID-19後的亞太經合組織創意產業產業
- linux記憶體管理(一)實體記憶體的組織和記憶體分配Linux記憶體