Skip to content

Glossary

Quick definitions for the recurring terms in the ABI/API Handling series. Each entry links to where the concept is developed in full.

Term Meaning
ABI (Application Binary Interface) The binary-level contract between compiled modules: symbol names, struct layout, calling convention, vtable layout. Changing it can break already-compiled callers. See Part 1.
API (Application Programming Interface) The source-level contract: declarations, signatures, types as written in headers. Changing it can break recompilation even when the ABI is intact. See Part 6 §Source-only API breaks.
App-swap (ASW) The mental test behind an ABI verdict: if you swapped the new library under an application built against the old one, without recompiling, would it still run? A break is anything that fails that swap. See Evidence & Detectability.
Authority rule abicheck's precedence rule: artifact-backed evidence (L0/L1/L2 — binary, debug info, headers) is authoritative for the shipped-ABI verdict; build/source evidence (L3/L4/L5) explains, localizes, or scopes a finding but never silently deletes an artifact-proven break. See Evidence & Detectability.
ABI epoch A generation of a library's binary contract. The SONAME major number is the ABI epoch; bumping it lets an incompatible new library coexist with the old one. See Part 5.
ABI tag ([[gnu::abi_tag]]) A token mangled into a C++ symbol name to distinguish otherwise-identical signatures across ABI variants. Adding/removing one renames the symbol. See case113.
castxml The tool abicheck uses to parse C/C++ headers into an AST, recovering source-level facts (access, noexcept, default arguments, constants) that binaries don't carry. The header_aware tier.
Bundle scan Comparing a multi-library release (several co-versioned .so/.dll files, plus their headers) as one unit, so cross-library breaks — a symbol that moved between libraries, a SONAME skew — are caught. See Multi-Binary Releases.
Calling convention The rules for passing arguments and return values (registers vs stack, who cleans up). Flipping trivially-copyable → non-trivial silently changes it. See Part 4.
Copy relocation An ELF mechanism where an executable gets its own copy of a library global; growing that global's type then mismatches the copy. See Part 5.
Demangling Translating a mangled C++ symbol (_ZN3foo3barEi) back to a readable signature (foo::bar(int)).
dsize (data size) The size of a class's data excluding tail padding — the extent a derived class may overlap into. Distinct from sizeof, which is rounded up to alignment; two classes can share a sizeof yet differ in dsize. See Part 4 §tail padding.
DWARF The debug-info format (Linux/macOS, from -g) that records struct layout, field offsets, enum values, and calling convention — the ground-truth emitted ABI. The dwarf_aware tier.
Dual ABI (_GLIBCXX_USE_CXX11_ABI) libstdc++ ships two parallel std::string/std::list ABIs behind the __cxx11 inline namespace; the macro selects which, re-mangling affected symbols. See case104.
EBO (empty-base optimization) The Itanium-ABI rule that an empty base class occupies zero bytes in the derived object. The base gaining its first data member resurrects its size and shifts every derived member. See Part 4 and case94.
Evidence tier (L0L4) The minimum input — binary only, +debug info, +headers, +build data, +sources — at which a given change becomes detectable. Each example case records its tier as min_evidence. A sixth code, L5, is the source reachability graph abicheck derives from L3/L4 (you provide L0L4; L5 is computed, never an input). See Part 8 and Evidence & Detectability.
IFUNC (indirect function) A symbol resolved once at load time by a resolver that picks an implementation (e.g. by CPU features). See case29.
Install name A Mach-O dylib's self-recorded identity (LC_ID_DYLIB), baked into clients at link time; the macOS analog of SONAME. @rpath/@loader_path make it relocatable. See Part 5.
Interposition Replacing a library's symbol at load time with another definition (e.g. LD_PRELOAD); default visibility makes a symbol interposable. See Part 5.
Mangling The encoding of a C++ name + qualifiers + parameter types into a unique linker symbol. Any qualifier change re-mangles, vanishing the old symbol. See Part 4.
NVI (non-virtual interface) An idiom where the public interface is non-virtual and forwards to private virtuals, so the public ABI stays fixed while the virtual implementation can evolve behind it. See Part 7.
ODR (One Definition Rule) C++'s requirement that every entity have exactly one definition across a program; inline/template body divergence between versions is an ODR-class hazard. See Part 4.
Opaque handle A type consumers only ever see as a pointer (FILE*, sqlite3*); the strongest layout firewall. See Part 7.
Ordinal A Windows PE export's integer index. A caller bound by ordinal ignores the name, so reordering exports — not renaming — is what breaks it. See Part 5.
PDB Windows program database — the debug-info format (/Zi) abicheck reads for PE layout and calling-convention checks. The Windows dwarf_aware equivalent.
Pimpl ("pointer to implementation") A C++ idiom that hides all data members behind one pointer to a .cpp-defined Impl, freezing sizeof and offsets. See Part 7.
PLT / GOT The Procedure Linkage Table / Global Offset Table — ELF's lazy-binding indirection for cross-library calls and data. See Part 1.
RPATH / RUNPATH Library search paths baked into a binary; absolute ones are non-portable and a security hazard. See Part 5.
RTTI (run-time type information) The compiler-emitted type records (_ZTI* type-info, _ZTS* type-name symbols) that back dynamic_cast, typeid, and exception matching. Changing a polymorphic type's identity or removing RTTI breaks cross-module casts and catch. See Part 4.
SONAME The identity an ELF library advertises (libfoo.so.1); the loader matches clients to it. Its major number is the ABI epoch. See Part 5.
Standard-layout A class meeting C++'s standard-layout rules (no virtuals, single access control for members, …), giving it a predictable, C-compatible memory layout. Losing standard-layout status (e.g. by adding a virtual) can silently change offsets and interop. See Part 4.
Symbol version (version node) A GNU ELF label (GLIBC_2.17) attached to a symbol so multiple ABIs of the same name coexist. Removing a node breaks clients bound to it. See case65.
Tail padding Alignment bytes at the end of a sub-object that, for non-POD bases, a derived class may reuse for its own members — so changing a base can re-layout the derived class even when sizeof(Base) is unchanged. See Part 4.
Thunk A small generated stub that adjusts this (or a return value) before forwarding — used for multiple inheritance and covariant returns in vtables. See Part 4.
TLS model How thread-local storage is accessed (global-dynamic, initial-exec, …); a variable reached via dlopen needs global-dynamic. See case67.
Trivially copyable A type the compiler may move with memcpy and pass in registers; adding a user destructor/copy ctor flips this, changing the calling convention. See case69.
Two-level namespace The Mach-O scheme where each import records which library a symbol came from, so identical names from different libraries are distinct. See Part 5.
Universal (fat) binary A Mach-O file bundling multiple CPU-architecture slices; compare the matching slice. See Part 5.
vptr / vtable Each polymorphic object holds a hidden vptr to its class's vtable — a fixed-order array of function pointers. Callers hard-code slot indices, so reordering virtuals corrupts dispatch. See Part 4.
Weak import A Mach-O import allowed to resolve to null (instead of failing) when missing — lets a client built against a newer dylib still run on an older one. See Part 5.

Back to the series overview · the ABI Cheat Sheet · the Examples Encyclopedia.