假设我在一个系统(例如,Ubuntu x64)上编译了一个与 libc.so.6 链接的程序。如果我将此二进制文件带到另一个具有相同 libc 版本 6 的系统(例如,Fedora x64),它似乎运行良好。
我的问题是,只要版本相同,ABI 是否或多或少是稳定的合同?
假设我在一个系统(例如,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
为了错误修复而修改主要版本号。