Dynamic-Linking

只要版本相同,共享庫 ABI 是否兼容?

  • April 12, 2018

假設我在一個系統(例如,Ubuntu x64)上編譯了一個與 libc.so.6 連結的程序。如果我將此二進製文件帶到另一個具有相同 libc 版本 6 的系統(例如,Fedora x64),它似乎執行良好。

我的問題是,只要版本相同,ABI 是否或多或少是穩定的契約?

不,共享庫不必是兼容 ABI 的跨發行版。我認為這是一個合理的期望,但是 ABI 中斷發生了,你不能盲目地依賴 ABI 兼容性。

一個例子是libstdc++。在 Ubuntu 16.04(使用 GCC 5)和 CentOS 7(使用 GCC 4.8)上,各自so的 s 落在ABI break 的相對兩側。在 Ubuntu 16.04 上使用 C++ 編譯但沒有_GLIBCXX_USE_CXX11_ABI設置的軟體將無法在 CentOS 7 上執行。它們都是libstc++.so.6. ABI 中斷也可能發生在發行版維護者應用的錯誤修復更新檔中,他們通常不會so為了錯誤修復而增加主要版本號。

引用自:https://unix.stackexchange.com/questions/437174