如果兩個共享庫都暴露相同的全局範圍符號,是否有檢測和避免的方法?我們最近遇到了一個情況,我們有libA.so
導出SuperCoolMethod()
和libB.so
也暴露了SuperCoolMethod()
這將打破上述方法的前一個副本。這是在使用g ++ 4.0及更高版本的Linux上。所以隔離如果你鏈接到libA.so
一切都會按預期工作,但一旦libB.so
被添加到圖片中,調用了錯誤的方法,調用會失敗,導致正在執行的線程中止,而不通知我們潛在的問題。通過耗盡試驗和錯誤,我們最終發現SuperCoolMethod()
得到了破壞,並通知了供應商libB.so
,以便__attribute__((visibility("hidden")))
可以應用到他們的方法副本。檢測/避免g ++符號衝突
1
A
回答
0
動態加載庫和通過dlopen和dlsym附加符號將工作。你將不得不編寫代碼才能做到這一點,但如果你真的被卡住了,這將是一個解決方案
1
因爲這是C++庫,每個庫都應該在它們自己的命名空間中,所以不會發生衝突。
+0
應該適用於,但不適用於第三方供應商。 – 2010-02-10 02:39:17
+1
如果您可以「通知libB.so的供應商,以便__attribute((visibility(」hidden「))」「您可以要求可以在非gnu編譯器上工作的命名空間 – Mark 2010-02-10 13:21:54
0
作爲解決方法,如果您只使用這兩種方法中的一種,則它們在鏈接命令行上出現的順序決定了最終可執行文件中最終使用的函數版本。
這不只是一個神器,它的定義行爲,所以你可以依賴它(直到供應商修復它)。
相關問題
- 1. 避免jQuery衝突
- 2. 如何避免JQuery衝突?
- 3. 觸發來避免衝突
- 4. 如何避免handlebars.js衝突
- 5. 避免CSS類名衝突
- 6. Slickgrid - 避免jquery衝突
- 7. 避免資源衝突
- 8. 避免合併衝突
- 9. python/django:如何檢測並避免導入名稱衝突?
- 10. 衝突檢測2D
- 11. GIT中的衝突解決或衝突避免?
- 12. 如何避免語法衝突
- 13. 如何避免列名衝突?
- 14. PostgreSQL:更新主鍵,避免衝突
- 15. 避免主鍵約束衝突
- 16. 如何避免「org.eclipse.jdt.core.JavaModelException:更新衝突」
- 17. 避免命名空間衝突
- 18. HashMap避免衝突的Java示例
- 19. 名稱空間避免衝突 - 例子?
- 20. 你如何避免類名衝突?
- 21. 避免地理編碼範圍衝突
- 22. 避免QML中的名稱衝突
- 23. 避免與git合併衝突
- 24. 如何避免合併衝突拉?
- 25. SQL Server CE + Addin讀寫衝突避免?
- 26. 如何避免jQuery中的類衝突
- 27. sqlite3:避免「數據庫鎖定」衝突
- 28. 與dplyr避免類型衝突:: case_when
- 29. 避免衝突,如果複製文件
- 30. 如何避免dnn中的jquery衝突
嗯,這可能工作,因爲我們從來沒有使用需要顯式調用有問題的函數,但它並沒有告訴我如何發現衝突開始。 – 2010-02-10 02:40:56
nm和grep的組合會告訴你 – pm100 2010-02-10 18:05:21