Re: [思辯] 臉書對世界的貢獻?

看板ask-why作者時間13年前 (2011/01/22 22:07), 編輯推噓4(401)
留言5則, 4人參與, 最新討論串9/9 (看更多)
※ 引述《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)

01/22 23:03, , 1F
推, 但是離題了 = =
01/22 23:03, 1F

01/23 03:10, , 2F
推一個
01/23 03:10, 2F

01/23 17:59, , 3F
這問題可以用 soname + default symver 來解決
01/23 17:59, 3F

01/23 18:00, , 4F
同一個symbol的不同version是可以共存的
01/23 18:00, 4F

01/25 23:40, , 5F
這篇太專業了 我只看的懂一點點 XD
01/25 23:40, 5F
文章代碼(AID): #1DEkIfx2 (ask-why)
討論串 (同標題文章)
文章代碼(AID): #1DEkIfx2 (ask-why)