linux平台動態鏈結庫(shared object,so)替換可以分為靜態替換和動態替換:靜態替換利用檔案操作直接替換so,新so在下次載入時生效;動態替換利用**注入申請並修改目標程序記憶體空間,實現新so的載入和替換,新so立即生效。
對於未被載入的原so,利用複製命令(cp new.so old.so)即可直接完成靜態替換,新so在下次載入時生效。對於已經載入的原so,直接用新so複製替換將會導致相應程式崩潰,此種情況可以使用刪除原so(rm -f old.so)或修改原so名稱(mv old.so oldx.so)後,再複製新so的方法代替,新so同樣在下次載入時生效。
出現這種情況的原因是複製替換操作會破壞系統訪問原so的索引節點inode,導致系統找不到原so。
系統為每個載入到記憶體中的檔案建立對應的inode,用來管理該檔案,inode包含了檔案的元資訊,如檔案位元組數、擁有者id、讀寫執行許可權等。系統以inode標識程式載入的so,不再關心檔名,修改so名稱並未改變對應inode,因此程式可以繼續正常執行;刪除so只是無法檢視,系統直到程式釋放so後才真正刪除so和inode,因此程式也可以繼續正常執行;但是在直接複製替換時,新so將會繼承原so的inode,程式無法繼續訪問原so,從而導致程式崩潰。
【參考】
動態鏈結庫 靜態鏈結庫
包含標頭檔案和庫 idir 指定編譯查詢標頭檔案的目錄,常用於查詢第三方的庫的標頭檔案,例 gcc test.c i.inc o test。ldir 指定鏈結時查詢lib的目錄,常用於查詢第三方庫。llibrary 指定額外鏈結的lib庫 巨集定義 dmacro 以字串 1 預設值 定義 macro...
靜態鏈結庫 動態鏈結庫
庫是寫好的現有的,成熟的,可以復用的 現實中每個程式都要依賴很多基礎的底層庫,不可能每個人的 都從零開始,因此庫的存在意義非同尋常。本質上來說庫是一種可執行 的二進位制形式,可以被作業系統載入記憶體執行。庫有兩種 靜態庫 a lib 和動態庫 so dll windows上對應的是.lib dll ...
靜態鏈結庫,動態鏈結庫
關於靜態鏈結庫,參考如下博文 當你完成了 開發,想把這個 給別人用,但是又不希望別人看到原始碼,就要給別人乙個庫和標頭檔案,庫和標頭檔案是配合的,缺一不可。或者過程相反,你從別人那裡拿到乙個庫和標頭檔案來使用。那麼如何編譯生成乙個庫給他人,如何使用從他人那裡拿到的庫呢?範例1 我們想把linuxfr...