ABI Stability
- title
- ABI Stability
- type
- concept
- summary
- Binary-level compatibility contracts: kernel vs glibc philosophies, Wine as the stable option
- tags
- linux, abi, systems-programming
- created
- 2026-04-08
- updated
- 2026-04-08
An ABI (Application Binary Interface) is the binary-level contract between compiled code and the system it runs on: calling conventions, struct layouts, symbol resolution, system call numbers. Source-level API compatibility means your code compiles; ABI compatibility means your already-compiled binary keeps working.
ABI breaks are nastier than API breaks. A compiler catches a missing function signature. A broken ABI gives you segfaults, silent corruption, or libraries that load but misbehave. Users see crashes with no obvious cause; developers can't reproduce the issue because their system has the right library version.
Two philosophies on Linux
The Linux kernel and glibc sit on opposite sides of this question.
The kernel treats ABI as a near-absolute contract. Linus Torvalds's rule: if a change breaks userspace and someone notices, it's a regression, full stop. Doesn't matter if the old behavior was a bug or was never documented. If real software depends on it, it's the ABI now. This policy is enforced personally โ Torvalds has reverted kernel changes that broke even a single user's workflow.
Glibc takes a spec-lawyering approach. If something isn't documented as part of the ABI, glibc can change it, and breakage in software that depended on the old behavior is that software's problem. The glibc 2.36 DT_HASH removal is a textbook case: DT_HASH was part of the SYSV generic ABI but glibc argued it wasn't part of their ABI (since they use ELFOSABI_GNU), and dropped it despite breaking real applications.
Wine's stability guarantee
Wine maintains ABI compatibility with Win32 going back decades. A Windows binary from 2003 is expected to run. This makes Wine, paradoxically, a more stable platform for Linux gaming than native Linux itself. The instability comes from the glibc layer, not the kernel โ the kernel side is rock solid.
The "Win32 is the only stable ABI on Linux" observation captures this gap: the kernel promises stability, Wine promises stability, but the C library between them doesn't.
Why it matters
ABI stability is what lets you ship a binary and have it work five years later without recompilation. Platforms that provide it (Windows, macOS to a degree, the Linux kernel syscall interface) get long-lived third-party software. Platforms that don't (glibc's internal interfaces, many Linux shared library interfaces) push developers toward static linking, containers, or targeting a different platform entirely.