The low-level interface between two binary program modules. Defines calling conventions, data layout, and system call numbers. If two binaries have incompatible ABIs, they can’t work together even if the source looks compatible.
A security technique that randomizes where code and data are loaded in memory. Makes exploits harder because attackers can’t predict addresses.
A constant value added during relocation calculation. For example, accessing a struct member at offset 8 might use the struct’s symbol address plus addend 8.
A symbol property controlling visibility and resolution priority. LOCAL symbols are file-private, GLOBAL are visible everywhere, WEAK can be overridden by GLOBAL.
Section for uninitialized or zero-initialized data. Doesn’t occupy file space—just records how much memory to allocate.
A tentative definition—declared but not necessarily defined. Multiple COMMON symbols with the same name are merged by the linker. Largely obsolete; use -fno-common.
A proposed WASM standard for defining structured interfaces between modules, enabling better composition than raw imports/exports.
Contains initialized global and static variables. Takes space in the file proportional to the data size.
The program that loads shared libraries at runtime, resolves symbols, and performs relocations. Runs before your main() function.
The symbol table consulted at runtime for dynamic linking. Survives strip because it’s needed for shared library resolution.
The standard binary format on Linux and many Unix systems. Used for executables, shared libraries, object files, and core dumps.
The address where execution begins. In ELF, specified in the header. In WASM, an optional start function.
A symbol or function made available to other modules. In WASM, explicitly declared; in ELF, controlled by visibility attributes.
A table of addresses filled at runtime. PIC code accesses external data through the GOT, enabling position-independence.
A modern hash table format for fast symbol lookup in ELF files. Faster than the original SysV hash.
A symbol or function required from another module. In WASM, explicitly typed and namespaced. In ELF, just an undefined symbol.
The ability to override a symbol from one library with a definition from another. Enabled by LD_PRELOAD. Useful for debugging, dangerous for security.
Resolving function addresses on first call rather than at load time. Implemented via PLT. Faster startup but first-call overhead.
Variable-length integer encoding used in WASM. Small numbers use fewer bytes.
The tool that combines object files into executables or libraries. Resolves symbols and applies relocations.
Configuration file controlling how the linker arranges sections in memory. Essential for embedded systems.
WASM’s memory model—a contiguous, bounds-checked array of bytes. Isolated per module.
Optimization performed by the linker across all compilation units. Enables whole-program analysis.
Encoding function signatures into symbol names. C++ uses mangling to support overloading. _Z3addii is mangled; add(int, int) is demangled.
A WASM custom section containing human-readable names for functions and variables. Like debug info, optional but helpful.
Compiler output containing code, data, symbols, and relocations. Not directly executable—must be linked.
Code that works at any memory address. Required for shared libraries. Uses GOT for data access and PC-relative addressing for code.
A jump table enabling lazy binding and position-independent function calls. Each PLT entry redirects through the GOT.
ELF metadata describing memory segments—how to load the file for execution.
Security hardening that makes GOT read-only after relocations are applied. Prevents GOT overwrite attacks.
An instruction to patch code or data with a final address. Contains: where to patch, which symbol, and how to calculate.
Read-only data—string literals, constants. Mapped as non-writable for security.
A named chunk of an object file (.text, .data, .rodata, etc.). The linker’s view of the file.
ELF metadata describing sections—name, type, flags, size.
A loadable chunk of an executable. The loader’s view of the file. Multiple sections can be in one segment.
Code loaded at runtime and shared between processes. Requires PIC.
A shared library’s canonical name, embedded in the file. Used for versioning: libfoo.so.1 is the soname even if the file is libfoo.so.1.2.3.
An archive of object files. The linker extracts only needed objects.
A section containing null-terminated strings. Symbol names are offsets into this table.
A named reference to a function, variable, or other code element. Has properties: name, value (address), size, binding, type, visibility.
A list of all symbols in a file. Used for linking and debugging.
Executable code. Marked as readable and executable, but not writable.
Dead code elimination for JavaScript modules. Same concept as linker --gc-sections.
WASM section defining function signatures. All functions reference a type by index.
Controls symbol export from shared libraries. DEFAULT exports, HIDDEN doesn’t, PROTECTED exports but prevents interposition.
A standard API for WASM to interact with the outside world—files, network, etc. Like POSIX for WASM.
A portable binary format for safe, sandboxed code execution. Runs in browsers and increasingly on servers.
A symbol that can be overridden by a strong (GLOBAL) definition. Used for default implementations.