ask-why 板


LINE

※ 引述《littleshan (我要加入劍道社!)》之銘言: : ※ 引述《hermitwhite (不存在的騎士)》之銘言: : : 過了幾年,這次安裝的是Ubuntu,安裝系統時怪毛病變少了,但前 : : 述問題仍然毫不吝嗇地發生。 : Windows 也有同樣的問題啊 : http://en.wikipedia.org/wiki/DLL_hell 既然你把 DLL hell 這件事搬出來 我不曉得你有沒有真正開發過比較大型的專案 說真的,以 DLL hell / shared library hell / jar hell 這種類型的問題 以目前的技術進展而言,還是 Microsoft 的 solution 最為完整 雖然還是無法百分之百解決所有可能的問題 但自 Windows XP SP2 之後,在普通使用者的應用上,以及一般不太刁鑽的專案開發上 DLL hell 的問題發生的機會已經非常非常鮮少!! 但是,Linux 嘛...... 唉,我舉一個我自己遇過很多次的實際案例: 當要開發一個 application A,它需要用到 third party library libB.so 與 libC.so 而 libB.so 與 libC.so 都會用到 libD.so 只不過,libB.so 用的是舊版 libD.so.1,libC.so 用的是新版 libD.so.2 將 library 的相依性畫成下圖: A ↙ ↘ libB.so libC.so ↓ ↓ libD.so.1 libD.so.2 實際 link 完畢後,application A 無法正常運作 要嘛,libD.so.2 的 symbol 會被 libD.so.1 蓋掉 要嘛,libD.so.1 的 symbol 會被 libD.so.2 蓋掉 (端看 link application A 時,-lB 與 -lC 這兩個參數的順序而定) 這是因為,Linux 的 runtime linker 跟本沒有所謂的 symbol namespace 的概念 而這個機制,卻是處理 DLL hell/shared library hell 非常關鍵的一環 所以,當你的程式同時用到新舊版的 shared library 時 裡頭的 symbol 就開始大打架 ---------- 當然,有幾個參考的解法方法 第一種,就是重新 make libB.so,並 link 新版的 libD.so 不過這種方法,若 libD.so 新舊版的 API 差異太大時 重新調整 libB.so 免不了經歷一場腥風血雨 如果 libB.so 本身也是個第三方大型專案的話 搞不好給你兩年的時間,你都不能解決問題 更不用說如果 libB.so 是向另一家公司買來的 closed source library 這個問題就變成無解題 Linux 幾個主要的 distributor,就是要耗掉很多人力 為了就是處理類似的狀況 ---------- 第二種,直接對 run-time linker 開刀 使其支援 symbol namespace 的機制 然後 commit 回 Linux vanilla,造福全世界的 Linux 使用者 ---------- 第三種,也是我所採用的方式 就是自己寫一個 symbol translator,把有衝突的新舊版 shared library 與用到它們的 .o 檔,有衝突的 symbol 都依 shared library 版本加上 prefix 使其不再發生衝突 不過,搞到這種程度,就不要講一般的使用者了 以 RD 而言,大概也倒掉一大半了 ---------- Java 的 jar 也有類似的問題 因為在同一個 class loader 下,class ID 是 global 的 所以不同版本的 jar 檔,裡頭相同的 class 也會打架 不過在 Java 裡頭,要處理這個問題,就比較沒有那麼麻煩 (但還是有點麻煩) 既然 libB.jar 用到舊版的 libD.jar libC.jar 用到新版的 libD.jar 這時,就準備兩個 class loader libB.jar 裡頭的 class,就放在 class loader B 中 (舊版的 libD.jar 也會自動一併放入 class loader B) libC.jar 裡頭的 class,就放在 class loader C 中 (新版的 libD.jar 也會自動一併放入 class loader C) (比如像 Tomcat 這類的 servlet container 就是以類似的方式處理這個問題) 這時就可以避掉某些等級的 jar hell 的問題 ---------- 在 Windows 平台下,這個問題就好處理多了 只要不要用到太刁鑽的狀況,上述的狀況都不是問題 我只能這麼說,至少,Microsoft 在這個問題上面,有真真正正下過苦功處理 --



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.32.58.129 ※ 編輯: mgtsai 來自: 114.32.58.129 (01/22 22:17)
1F:推 micklin:推, 但是離題了 = = 01/22 23:03
2F:推 H45:推一個 01/23 03:10
3F:推 littleshan:這問題可以用 soname + default symver 來解決 01/23 17:59
4F:→ littleshan:同一個symbol的不同version是可以共存的 01/23 18:00
5F:推 StAnger:這篇太專業了 我只看的懂一點點 XD 01/25 23:40







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:Tech_Job站內搜尋

TOP