假设我编译了一个程序,该程序与一个系统(例如 Ubuntu x64)上的 libc.so.6 链接。如果我将此二进制文件带到另一个具有相同 libc 版本 6 的系统(例如 Fedora x64),它似乎运行良好。
我的问题是,只要so版本相同,ABI就稳定,这或多或少是一个合约吗?
答案1
不,共享库没有必要跨发行版兼容 ABI。我认为这是一个合理的期望,但 ABI 中断会发生,您不能盲目依赖 ABI 兼容性。
一个例子是libstdc++
。在 Ubuntu 16.04(带有 GCC 5)和 CentOS 7(带有 GCC 4.8)上,各自的so
s 位于ABI 中断。在 Ubuntu 16.04 上用 C++ 编译但没有_GLIBCXX_USE_CXX11_ABI
设置的软件无法在 CentOS 7 上运行。它们仍然是libstc++.so.6
. ABI 中断也可能发生在发行版维护人员应用的错误修复补丁中,他们通常不会更改so
错误修复的主要版本号。