# ABI Stability

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 [[win32-stable-abi|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-stable-abi|"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.
