C ecosystem and systems architecture
Deep review current to 2026-09-03. The language baseline is C23, published as ISO/IEC 9899:2024; the ecosystem graph contains 50 components and 69 evidence-backed relationships. Read this beside the language deep dive and C reference.
C is not one stack. It is a small language abstract machine connected to a large set of external contracts: preprocessor state, compiler extensions, target ABI, object format, loader or reset path, C library, operating system, device registers, scheduling model, and project-specific safety rules. Its continuing value comes from making those seams inexpensive. Its continuing risk comes from making many of them implicit.
Scope and deep-review findings¶
This is an architecture review, not a ranking of compilers, kernels, RTOSes, or libraries. The graph selects components that reveal distinct interfaces and proof obligations. A real system will omit most of them, add vendor-specific pieces, and pin exact revisions; its job is to preserve the boundaries made visible here.
The ABI is C’s real network effect
Source compatibility matters, but the calling convention, object format, symbol model, layout rules, and stable C-shaped interfaces are what let kernels, runtimes, libraries, debuggers, assembly, and other languages compose independently.
Assembly is a contract, not an escape hatch
Out-of-line assembly, compiler
intrinsics, and extended inline asm occupy different optimizer and tooling boundaries. Every path
still owes the caller an ABI, accurate side-effect declarations, unwind behavior, and a tested fallback.
Linux is a configured product line
Kconfig selects a program; kbuild compiles C and assembly into ordered archives, vmlinux, modules, and an architecture boot product. A kernel diagram that omits configuration, context, lifetime, and generated code misses the system being shipped.
Real-time is end-to-end
An RTOS priority scheduler is one mechanism. Bounds must also cover ISR handoff, locks, allocation, protocol work, queue depth, stack use, DMA, cache effects, overload, watchdogs, and the control plant’s deadline.
High assurance is evidence, not syntax
MISRA and CERT rules reduce classes of mistake; FACE and MOSA shape replaceable interfaces; system-safety and airborne guidance demand traceable life-cycle evidence. None alone proves that compiled behavior is safe in its environment.
FFmpeg shows C at its best and hardest
A stable library decomposition connects hostile bitstreams, graph scheduling, reference-counted frames, threads, architecture dispatch, hand-tuned SIMD, and device APIs. Correctness must span both the portable C reference path and every optimized path.
History: from Unix tool to systems substrate¶
C emerged between 1969 and 1973 because the early Unix team needed a language above assembly that still fit a small machine and exposed its useful operations. BCPL’s and B’s word-oriented economy survived, while C acquired types and a compiler capable of expressing most of an operating system. The 1973 Unix rewrite was the decisive architectural demonstration: machine-dependent assembly could be concentrated at narrow edges rather than spread across the kernel. Source: The Development of the C Language.
K&R C spread through Unix ports before a formal standard fixed the language and library. ANSI C89 and ISO C90 converted practice into a portable contract. Later standards accumulated facilities without erasing installed dialects: C99 reshaped numeric and declaration practice; C11 introduced the language memory model and atomics; C17 consolidated corrections; C23 became the fifth ISO edition in October 2024. Linux, embedded vendors, and safety programs still select their own baselines because a standard’s publication and a deployed toolchain’s contract are different clocks.
| Year | Milestone | Architectural consequence | Evidence |
|---|---|---|---|
| 1967 | BCPL | A typeless systems language supplies the lineage from which B and C evolve. | The Development of the C Language |
| 1969 | B on early Unix | Thompson's B adapts the BCPL model to the PDP-7 environment used by early Unix. | The Development of the C Language |
| 1972 | C emerges | Ritchie's typed successor develops alongside Unix; 1972 is the most creative period. | The Development of the C Language |
| 1973 | Unix in C | The kernel rewrite demonstrates that a high-level systems language can retain access to machine facilities. | The Development of the C Language |
| 1978 | K&R C | The first edition of The C Programming Language becomes the de facto portable description. | The Development of the C Language |
| 1989 | ANSI C | X3.159 standardizes prototypes, the library, preprocessing, and the language understood as C89. | C project status and milestones |
| 1990 | ISO C90 | ISO/IEC 9899:1990 internationalizes the ANSI language baseline. | C project status and milestones |
| 1999 | C99 | Adds inline functions, variable-length arrays, complex arithmetic, designated initializers, restrict, and a larger library. | C project status and milestones |
| 2011 | C11 | Adds atomics and a memory model, threads, generic selection, anonymous members, and optional bounds-checking interfaces. | C project status and milestones |
| 2018 | C17 | A defect-correction release consolidates the C11 line without a comparable feature wave. | C project status and milestones |
| 2024 | C23 published | ISO/IEC 9899:2024 becomes the fifth edition and the current C standard. | ISO/IEC 9899:2024 — Programming languages — C; C project status and milestones |
| 2025 | Memory-safety roadmaps | Government guidance intensifies pressure to isolate or replace high-risk memory-unsafe components while acknowledging constrained legacy and low-level cases. | Product Security Bad Practices; Memory Safe Languages: Reducing Vulnerabilities in Modern Software Development |
| 2026 | C at the systems seam | Linux 7.x, FFmpeg 9, RTOS, robotics, and avionics ecosystems still depend on C interfaces while adding safer-language and stronger-assurance boundaries. | The Linux Kernel Archives; Download FFmpeg; Internal ROS 2 interfaces; FACE Technical Standard and corresponding documents |
All 13 milestones in data/c-ecosystem.json. A milestone records a change in the language or its architectural role, not a usage ranking.
One syntax, several contracts¶
The ISO standard defines the meaning of a conforming C program in an abstract machine and intentionally does not specify how it becomes an executable or is invoked. Every serious architecture therefore needs a contract stack: language edition, extension policy, compiler and flags, target triple, ABI, runtime or reset environment, library profile, link layout, concurrency model, and assurance rules.
| Contract | What it establishes | What remains outside it |
|---|---|---|
| ISO C abstract machine | Expressions, objects, types, translation, library and conformance | Calling convention, executable format, OS API, build graph, device behavior |
| Implementation + dialect | Extension syntax, optimization, diagnostics, target support, inline asm | Cross-compiler identity unless the project tests and constrains it |
| Platform ABI | Register and stack use, type layout, symbols, relocations, dynamic linking | Source semantics or ownership/lifetime above a function boundary |
| POSIX / OS API | Processes, files, threads, signals, clocks and other hosted services | Kernel-internal APIs, bare-metal behavior, hard real-time guarantees |
| Freestanding platform | Implementation-defined startup and selected library facilities | Reset state, vector table, memory map, clocks, MMIO or board services |
| Project assurance profile | Allowed subset, diagnostics, deviation process, evidence and review rules | Whole-system safety, security, temporal correctness, or fitness by itself |
The contracts overlap in an implementation, but they answer different questions. Treating one as a proxy for another creates portability and assurance gaps. Sources: ISO/IEC 9899:2024 — Programming languages — C; POSIX.1-2024, The Open Group Base Specifications Issue 8; System V Application Binary Interface AMD64 Architecture Processor Supplement; MISRA C:2025 — Guidelines for the use of the C language in critical systems.
C23 is current, but “uses C23” is incomplete. Linux documents GNU C11; CMSIS describes a portable processor interface plus device-specific startup; a freestanding firmware may link only selected libc facilities; an airborne component may be constrained by project plans, tool qualification, and object-code evidence. The standard is the semantic floor, not the deployed architecture.
Full ecosystem context map¶
The visual projects every component marked as part of the architectural spine. Lines are directional relationships; the relationship register preserves their type, meaning, and evidence. Secondary implementations and domain alternatives remain in the lossless register so the map can stay readable without pretending that C has one official distribution.
The central path is source and headers through preprocessing, compilation, assembly, object files, linking, and loading or reset. The upper contracts constrain that path. The lower systems reuse it differently: Linux owns its libc-free privileged runtime; an RTOS owns scheduling but delegates board startup; ROS 2 exposes C APIs as language-neutral middleware seams; FFmpeg uses portable C as its reference and dispatch surface around assembly and device-specific acceleration.
Source-to-silicon toolchain¶
| Stage | Responsibility | Primary output | Architecture question |
|---|---|---|---|
| Preprocessor | Includes headers; evaluates conditionals; expands macros | Effective source/token stream | Macro configuration and include order are part of the program |
| C front end | Parses; resolves declarations/types; diagnoses constraints | AST and compiler IR | Accepted extensions and warning policy define the dialect |
| Optimizer | Transforms under the language and target semantic contract | Optimized IR | Undefined behavior may justify transformations surprising at source level |
| Back end | Selects instructions; allocates registers; schedules code | Assembly or object | ISA features, code model, relocation model and ABI are target inputs |
| Assembler | Encodes instructions/directives; creates sections and relocations | Relocatable object | Textual syntax is tool-specific; object semantics matter downstream |
| Linker | Resolves symbols; selects archives; places sections; applies relocations | Executable/module/image | Archive order, visibility, scripts, LTO, startup objects and libc are architecture |
| Loader / reset | Maps segments and resolves dynamic symbols, or initializes firmware memory | Running state | Process ABI and firmware reset are different deployment models |
Translation stages and the evidence each hands to the next. Reproducibility requires the complete command line, generated inputs, target data, linker script, startup objects, library choice, and tool versions—not only the compiler version.
make, CMake, and Meson occupy different levels. Make executes a file dependency graph. CMake
and Meson model targets and usage requirements, then generate a native graph. pkg-config reports
installed compile/link flags but does not fetch dependencies. Conan and vcpkg can acquire and build packages,
but neither creates a universal C package identity: target ABI, compiler runtime, feature flags, patches, and
link mode remain part of the resolved artifact.
The C and assembly boundary¶
C does not standardize registers, stack frames, symbol spellings, object files, instruction selection, or inline assembly. Those belong to the compiler and target ABI. On x86-64, AArch64, and RISC-V the details differ, but the architecture question is constant: what state crosses the function boundary, what may be destroyed, how are values classified, where is the stack, and how are machine-visible side effects communicated to the compiler?
| Mechanism | Optimizer relationship | Portability boundary | Best fit |
|---|---|---|---|
| Compiler intrinsic / builtin | Compiler understands semantics and may optimize around it | Portable only across implementations/targets that expose the intrinsic | Single operations and vector idioms |
| Extended inline asm | C operands, constraints, outputs, clobbers and volatility describe an embedded template | The compiler trusts that declaration; omitted effects are miscompilation risks | Short sequences tied to nearby values |
| Out-of-line .s/.S | A separately assembled symbol communicates through the platform ABI | Requires manual register, stack, unwind, visibility and calling-contract discipline | Entry stubs, context switch, substantial kernels |
| Compiler-generated assembly | Diagnostic view of code generation, not normally a stable input contract | Optimization and compiler versions may change it freely | Inspection, performance review, object verification |
| Scalar C fallback | Reference semantics and broad target coverage | May not express privileged operations or reach peak SIMD throughput | Correctness oracle and unsupported CPUs |
Assembly integration choices. Prefer the highest-level mechanism that still expresses the required instruction and side effects; that preserves more compiler analysis and reduces handwritten ABI surface.
An inline asm volatile is not automatically a compiler memory barrier and is not automatically
correct. Inputs, early-clobber outputs, condition codes, memory effects, register overlap, and control flow must
match the template. Out-of-line routines move that contract into the platform ABI, which is often clearer for a
substantial function and lets C, assembly, and tests evolve independently. Preprocessed .S files can
share configuration and symbolic constants with C, but that also imports macro-state risk into assembly.
The robust pattern visible in kernels and FFmpeg is reference + dispatch + conformance test: retain a readable scalar C implementation, select an ISA-specific implementation only after capability checks, and compare optimized outputs and preserved state against the reference. Assembly then becomes a replaceable implementation of a small contract, not an invisible second language inside arbitrary expressions.
Linux kernel architecture¶
At this snapshot kernel.org lists Linux 7.2.3 as stable and 7.3-rc1 as mainline. Those numbers date the ecosystem, but architecture lives in longer-lived boundaries. The kernel documentation still defines the C language as GNU C11, supports GCC and Clang/LLVM toolchains, and makes architecture code and build configuration first-class parts of the system. Sources: The Linux Kernel Archives; Programming Language; Building Linux with Clang/LLVM.
| Concern | Kernel contract | Review consequence |
|---|---|---|
| Dialect | GNU C11 plus kernel-selected GNU extensions and attributes; Clang is supported | The kernel is not an ISO-only or libc-hosted C program |
| Configuration | Kconfig produces .config and generated feature state | The configured binary, not the repository, is the product under analysis |
| Build | kbuild selects built-in and module objects, archives them, links vmlinux, and creates boot products | Link order, generated code, host tools, architecture scripts, and post-link checks matter |
| Execution context | Process, workqueue, softirq, hardirq, NMI, idle, stop-machine and other contexts differ | Sleepability, preemption, stack, locking and allocation constraints are contextual |
| Memory ordering | Kernel primitives and the Linux Kernel Memory Model describe concurrency obligations | C11 atomics alone do not describe device MMIO, DMA, interrupt, or all kernel ordering |
| Lifetime | Reference counts, RCU, locking, device-managed resources, module ownership and teardown interact | A pointer type does not prove that an object survives concurrent removal |
| Interface stability | User-space ABIs are maintained; internal interfaces evolve with the tree | Out-of-tree modules inherit integration and forward-porting cost |
| Language boundary | Rust support wraps selected C APIs through generated bindings and kernel abstractions | The shared build, object, ABI and kernel concurrency model remain cross-language contracts |
A kernel C review checklist organized by architecture rather than syntax. Every driver also needs its subsystem-specific locking, power-management, DMA, firmware, and teardown rules.
Kconfig and kbuild¶
Kconfig defines a product family; .config selects one member. kbuild combines top-level rules,
an arch/$(SRCARCH)/Makefile, common scripts, and per-directory obj-y/obj-m
declarations. It creates thin built-in.a archives, links the resident vmlinux, builds
loadable .ko modules, and hands the result to architecture-specific boot-image processing. C source,
preprocessed assembly, generated offsets, linker scripts, host tools, BTF/debug data, and post-link checks all
participate; “compile the .c files” is not a kernel build model.
Contexts, subsystems, and drivers¶
Core code supplies shared abstractions; architecture code implements entry, exceptions, atomic primitives, barriers, memory translation, context switching, and alternatives; drivers bind device behavior to bus and subsystem contracts. A loadable module changes delivery, not privilege: it executes in the kernel address space. eBPF is different again—restricted instructions enter through a verifier and interpreter/JIT path with explicit helper and hook contracts.
The important UML-like relationship is not “driver inherits kernel.” It is a set of protocols over time: probe establishes resources, publication exposes the device, concurrent operations borrow state, quiesce stops new work, teardown waits for in-flight users, and removal releases resources in reverse dependency order. Lock order, RCU grace periods, reference ownership, interrupt disable state, work cancellation, and DMA completion are the real edges.
Embedded and real-time architecture¶
In firmware, “runtime” is assembled rather than inherited. Reset code, a linker script, device startup, interrupt vectors, C library retargeting, board support, an optional RTOS, and the application together create the environment that a hosted C implementation normally supplies. CMSIS standardizes much of the Arm-facing vocabulary but intentionally leaves concrete devices and peripherals to vendor packs and board code.
| Deployment | Architecture shape | Primary tradeoff |
|---|---|---|
| Bare metal | Reset/startup → board initialization → superloop + ISR state machines | Smallest surface; application owns scheduling, time, concurrency, and all recovery |
| FreeRTOS | Portable kernel + architecture port + application-selected heap and libraries | Small priority-based core; system architecture remains largely application-defined |
| Zephyr | Kconfig/devicetree/CMake product line + kernel + device model + services | Broader integrated platform; generated configuration and bindings are central artifacts |
| RTEMS | Executive + Classic/POSIX APIs + CPU/BSP/driver layers | Strong documentation and critical-system use; suitability remains an integrator decision |
| NuttX | POSIX-oriented RTOS + board/driver configuration, flat or protected deployments | Familiar interfaces on constrained targets; configuration and address-space mode alter isolation |
Representative embedded execution models. Selection follows the product timing, isolation, connectivity, safety, update, footprint, and hardware-support requirements—not feature count.
Memory, interrupts, and devices¶
The linker script owns the physical image: vector table, executable text, read-only data, initialized data,
zeroed storage, retained/no-init regions, stacks, heaps, shared memory, and sometimes overlays or tightly coupled
memory. Startup code must realize that layout before ordinary C assumptions hold. An ISR and main/task context
are concurrent even on one core; volatile describes accesses to volatile-qualified objects but is
neither a lock nor a complete hardware ordering primitive. DMA adds another agent, with ownership, cache
maintenance, alignment, and completion rules that belong in the component contract.
Real-time design¶
Analyze response time across interrupt latency, release jitter, priority, worst-case execution, blocking, preemption, cache and bus interference, message queues, driver work, and actuator deadlines. Ban or phase-limit allocation when fragmentation or failure cannot be bounded. Size each stack from measurement plus justified margin. Give overload an intentional outcome—drop, coalesce, degrade, shed, reset, or enter a safe state—rather than letting a full queue or missed watchdog choose one accidentally.
Military, avionics, and high assurance¶
C’s defense and avionics use is less about the language being intrinsically safe than about the surrounding investment: long-supported processors, deterministic RTOSes, board support, analyzers, traceability systems, qualified or controlled toolchains, test equipment, interface standards, and staff able to review object-level behavior. The architecture must preserve that evidence without freezing every component behind one vendor.
| Framework | Architectural role | Evidence or decision it adds |
|---|---|---|
| MIL-STD-882E | DoD system-safety process for eliminating hazards where possible and minimizing accepted risk | Hazard analyses, mitigations, verification, residual-risk acceptance across the life cycle |
| DO-178C via FAA AC 20-115D | Airborne software development assurance as an accepted means of compliance | Plans, objectives, traceability, verification, configuration, quality assurance, and tool considerations |
| MISRA C:2025 | Predictable critical-system C guidance and a managed deviation model | Project subset, analysis findings, justified deviations, enforcement and review evidence |
| SEI CERT C | Security-oriented rules for recurring C weakness classes | Secure-coding findings and remediation; it does not replace threat or system-safety analysis |
| FACE 3.2 | Portable airborne component architecture with defined segments and interfaces | Conformance scope and interface evidence; safety/security profiles do not certify an application automatically |
| DoD MOSA | Modular, loosely coupled, highly cohesive design around open, testable interfaces | Interface ownership, conformance, data rights, substitution strategy, and sustainment plan |
Public standards and guidance relevant to critical C systems. Applicability is contractual and domain-specific; this table is a system-design map, not compliance or certification advice.
Partitioning and open interfaces¶
FACE separates portable components from transport, operating-system, I/O, and platform services. MOSA makes modularity and open, verifiable interfaces a life-cycle acquisition strategy. For C, the interface still needs more than a header: binary versioning, data representation, timing, resource ceilings, initialization order, concurrency, failure containment, health reporting, update compatibility, security classification, and ownership of verification artifacts.
Source is not the final artifact¶
Optimization, undefined behavior, implementation-defined choices, generated code, link selection, libraries, startup, and post-link rewriting can separate reviewed source from executing bytes. Critical workflows therefore identify the exact compiler/linker configuration and released image, qualify or verify tools when their failure could remove required assurance, and close traceability through target integration. Whether disassembly or object-code verification is required is a project assessment—not something MISRA compliance decides.
Robotics and deterministic middleware¶
ROS 2’s internal architecture makes C a deliberate language-neutral seam. rcl implements
shared client behavior and graph concepts; rmw is the minimal interface to replaceable middleware;
generated type support bridges message definitions to serialization. Language clients such as C++, Python, and
rclc build above that C core rather than each binding directly to one DDS vendor.
The executor is an architectural scheduler. A middleware can retain messages and enforce delivery QoS, but
it cannot bound an application callback or resolve priority inversion in shared resources. rclc’s
executor exists precisely to give embedded C systems more control over callback order and trigger conditions.
A hard real-time sense-plan-act chain should have explicit release conditions, bounded message memory, analyzed
callback times, and isolated best-effort logging, visualization, discovery, and remote-service paths.
C is also the FFI layer under many non-C nodes and hardware SDKs. Treat that as a protocol: generated message structs need initialization/finalization; allocators must not cross ownership domains accidentally; QoS and type compatibility must be versioned; cancellation and shutdown must outlive callbacks; handles need clear thread affinity; and zero-copy loans require lifetime rules stronger than a raw pointer expresses.
Drones and autonomous vehicles¶
PX4 makes the core decomposition explicit: middleware supplies hardware integration and communication; the flight stack supplies estimation and control. uORB is an asynchronous publish/subscribe bus inside the system; NuttX is the primary flight-controller RTOS; Linux commonly hosts richer companion software. ArduPilot uses a different codebase and hardware-abstraction structure but exposes the same architectural pressures: bounded control loops, portable device support, simulation, persistent parameters, and external vehicle protocols.
| Boundary | Responsibility | Design obligation |
|---|---|---|
| Flight controller | RTOS or constrained POSIX environment; drivers, estimator, navigation, control, actuators | Owns stabilization and safe behavior when external links disappear |
| Internal bus | PX4 uORB or project-specific publish/subscribe and parameter services | Message definitions, timestamps, queue depth, update rates and startup ordering |
| Vehicle protocol | MAVLink messages over serial, radio, UDP or other transport | Authentication/trust, command authority, replay/staleness, bandwidth and loss behavior |
| Companion computer | Linux/ROS 2 perception, planning, payload, networking and high-level autonomy | Degradable boundary; should not silently become a prerequisite for basic safe control |
| Ground station | Configuration, mission planning, monitoring, logs and operator commands | Human authority, state synchronization, link loss, unsafe parameters and update provenance |
| Simulation/HIL | Same modules or protocol surface connected to simulated plant and sensors | Model validity, timing fidelity, fault injection and exact configuration equivalence |
Autonomous-vehicle system boundaries. The same architecture also applies to rovers, boats, and other robots; airworthiness, regulation, and operational constraints depend on the actual system and use.
Message passing improves replaceability but does not create safety by itself. Every control input needs a time basis, validity window, source/authority, coordinate frame, unit, range, and loss behavior. Queueing a stale setpoint preserves delivery while violating control intent. A companion link should have an explicit state machine: absent, discovered, healthy, degraded, rejected, and recovered, with the flight controller retaining the authority needed for its defined safe response.
Simulation should preserve build options, message schemas, scheduler assumptions, and parameter sets, then be complemented by software-in-the-loop, hardware-in-the-loop, bench, and controlled physical tests. Fault injection is most useful at named boundaries—sensor timeout, timestamp jump, queue overflow, estimator reset, actuator saturation, storage corruption, link loss—not as an undirected collection of random failures.
FFmpeg and multimedia dataflow¶
FFmpeg 9.0.1 was the current stable release on this snapshot, with major-versioned libavutil 61, libavcodec/libavformat/libavdevice 63, libavfilter 12, libswscale 10, and libswresample 7. The command-line tools orchestrate those libraries; they are not a monolithic codec engine. Source: Download FFmpeg.
| Library | Responsibility | Boundary to make explicit |
|---|---|---|
| libavutil | Frames, buffers, pixel/sample formats, time bases, dictionaries and common utilities | Shared data model and reference-counted ownership below the other libraries |
| libavformat | Protocols, I/O, demuxers and muxers | Container timestamps and compressed packet streams |
| libavcodec | Decoders, encoders, parsers, bitstream filters and hardware contexts | Hostile coded data, codec state, threads and packet/frame conversion |
| libavfilter | Negotiated graph of audio/video sources, transforms and sinks | Format negotiation, frame scheduling, backpressure, latency and reconfiguration |
| libswscale | Video size, pixel-format and color conversion | Strides, planes, color metadata and rounding |
| libswresample | Audio sample-format conversion, resampling and mixing | Channel layouts, delay and rate drift |
| libavdevice | Capture and playback device integration | Blocking behavior, clocks and platform device APIs |
The main FFmpeg library decomposition. Public APIs and major library versions are the integration surface; internal structures and optimized functions are not equivalent compatibility promises.
Assembly, dispatch, and hardware frames¶
Codec and transform hot paths often dispatch from C to x86, Arm, AArch64, or other ISA-specific functions.
FFmpeg’s checkasm framework compares optimized implementations with reference behavior and can
check calling-convention preservation. That is the right relationship: C defines the callable surface and scalar
oracle; the build selects ISA objects; runtime detection selects a supported path; tests establish equivalence.
Hardware acceleration adds a second memory domain. Decode may produce a device frame that filters or encoders can reuse without download, but format negotiation, device/context lifetime, synchronization, pool exhaustion, fallback, and error recovery become graph properties. “Zero copy” means an avoided transfer along one path, not the absence of ownership or synchronization.
Untrusted media and temporal correctness¶
Demuxers and decoders parse adversarial lengths, offsets, tables, recursion, entropy-coded state, and container relationships. Checked arithmetic, allocation ceilings, fuzzing, sanitizers, regression vectors, and minimal enabled surfaces complement review. Temporal correctness is separate: preserve explicit time bases, distinguish decode and presentation order, rescale deliberately, and define discontinuity, drift, buffering, and backpressure behavior at every live boundary.
Use-case architecture register¶
The same language participates in very different systems. The table makes the deployment contract and design boundary primary; the component list is representative. It should help an architecture review ask “which C? in which protection domain? under which scheduler and ABI?” before discussing local syntax.
| Domain | Representative components | Why C fits | Boundary to design explicitly | Sources |
|---|---|---|---|---|
| Hosted native software | ISO C, POSIX, CMake, Meson + Ninja, pkg-config, Dependency managers, GCC, Clang / LLVM, MSVC, glibc, musl, GDB / LLDB, Sanitizers, Static analysis | C supplies a stable source and binary interface, direct OS access, predictable data layout, and extensive mature libraries for tools, runtimes, databases, interpreters, and performance-sensitive components. | Select the language dialect, supported ABIs, libc and deployment baseline, ownership rules, dependency provenance, error model, concurrency model, and memory-safety mitigation plan. | ISO/IEC 9899:2024 — Programming languages — C; POSIX.1-2024, The Open Group Base Specifications Issue 8; Product Security Bad Practices |
| Linux kernel and drivers | Linux kernel, Kconfig + kbuild, Kernel subsystems, Drivers + modules, eBPF, GCC, Clang / LLVM, Assembler, Linker, ELF / COFF, QEMU | GNU C extensions, explicit layout, intrinsics and assembly interoperation fit privileged code that must express hardware operations, concurrency, cache behavior, and architecture-specific fast paths. | Kernel APIs are internal contracts, not a stable general in-kernel ABI. Record context rules, locking, lifetime, allocation mode, user-copy validation, DMA ownership, barriers, configuration reachability, and C/Rust/assembly seams. | Programming Language; Linux Kernel Makefiles; Core API Documentation; The Linux driver implementer's API guide |
| Bare-metal firmware | CMSIS, BSP + startup + ISR, Embedded libc, GCC, Clang / LLVM, Assembler, Linker, ELF / COFF, GDB / LLDB, Static analysis | Freestanding C can map fixed registers, interrupt vectors, memory sections, and startup state without requiring an operating system or managed runtime. | Make the memory map, initialization order, clock tree, interrupt priorities, stack/heap budgets, MMIO volatility, concurrency with ISRs/DMA, update/rollback path, and reset/fault behavior explicit. | ISO/IEC 9899:2024 — Programming languages — C; CMSIS Introduction; Using CMSIS in Embedded Applications; Linker Scripts |
| RTOS and real-time control | FreeRTOS, Zephyr, RTEMS, NuttX, CMSIS, BSP + startup + ISR, Embedded libc, GDB / LLDB, QEMU | C is the common API and porting layer for schedulers, interrupt-safe primitives, drivers, protocol stacks, and deterministic control tasks across constrained processors. | Analyze worst-case execution and blocking, task and ISR priorities, queue capacity, stack watermarks, allocation policy, clock/time bases, priority inversion, watchdog coverage, and overload behavior. | FreeRTOS kernel fundamentals; Zephyr Project Documentation; RTEMS Documentation; Apache NuttX Documentation |
| Defense, avionics, and high assurance | Assurance rules, FACE, DoD MOSA, RTEMS, BSP + startup + ISR, Static analysis, GDB / LLDB, Platform ABI | C remains common in long-lived real-time and avionics platforms because toolchains, analyzers, qualified processes, board support, and binary interfaces are deeply established. | A language subset is one control, not the safety case. Trace hazards to requirements and tests; govern tool qualification, object-code verification, partitioning, open interfaces, configuration data, deviations, provenance, and sustainment evidence. | MIL-STD-882E Change 1 — System Safety; AC 20-115D — Airborne Software Development Assurance Using ED-12() and DO-178(); FACE Technical Standard and corresponding documents; Modular Open Systems Approach; MISRA C:2025 — Guidelines for the use of the C language in critical systems |
| Robotics middleware | ROS 2 rcl, ROS 2 rmw, micro-ROS rclc, FreeRTOS, Zephyr, POSIX, Sanitizers, Static analysis | C forms a language-neutral middleware seam and supports small deterministic clients that connect microcontrollers to a broader ROS 2 graph. | Separate transport QoS from executor scheduling; budget callbacks and queues; own message memory; handle discovery loss and stale data; isolate hard real-time loops from best-effort perception and logging paths. | Internal ROS 2 interfaces; rclc — ROS client library in C; ROS 2 Executors |
| Drones and autonomous vehicles | PX4, ArduPilot, MAVLink, NuttX, ROS 2 rcl, ROS 2 rmw, QEMU, BSP + startup + ISR | C and adjacent C++ code integrate sensor drivers, estimation and control loops, real-time scheduling, generated messaging, simulation, and constrained flight-controller hardware. | Keep safety-critical flight control, navigation, communications, payload, and companion-computer concerns partitioned. Define authority, arming/failsafe states, timing, stale-data behavior, protocol trust, simulation equivalence, and hardware-in-the-loop evidence. | PX4 Architectural Overview; uORB Messaging; Learning ArduPilot — Introduction; MAVLink Developer Guide |
| FFmpeg and multimedia | FFmpeg tools, libavformat, libavcodec, libavfilter, Utility + conversion libs, SIMD assembly, Hardware acceleration, GCC, Clang / LLVM, Assembler, Sanitizers | C's ABI reach, explicit buffers and strides, vectorizable loops, portable fallbacks, and assembly interoperability fit high-throughput codecs and cross-platform media pipelines. | Model packets versus frames, timestamps and time bases, ownership/reference counts, negotiated formats, thread safety, untrusted bitstreams, filter backpressure, device-frame transfers, CPU dispatch, and scalar fallback coverage. | Download FFmpeg; FFmpeg library modules; FFmpeg Developer Documentation; FFmpeg Hardware Acceleration |
| C and assembly interoperability | Platform ABI, GCC, Clang / LLVM, Assembler, Linker, ELF / COFF, BSP + startup + ISR, SIMD assembly, GDB / LLDB | C supplies structured control and portable fallbacks while assembly supplies reset/entry paths, privileged instructions, atomics, context switches, exact instruction sequences, and measured SIMD kernels. | The contract is the ABI plus compiler constraints: declare inputs, outputs, clobbers and memory effects; preserve registers and stack alignment; expose symbols deliberately; avoid assuming source order; test every ISA variant against a reference path. | Extended Asm — Assembler Instructions with C Expression Operands; Using as — GNU Assembler; System V Application Binary Interface AMD64 Architecture Processor Supplement; Procedure Call Standard for the Arm 64-bit Architecture; RISC-V ELF psABI Document; checkasm — for all your assembly checking needs |
9 domain projections derived from c-ecosystem.json. Components recur because compiler, ABI, debugging, and assurance surfaces cut across application categories.
Memory safety and trust boundaries¶
Current CISA/FBI guidance calls developing new product lines in memory-safe languages the preferred direction and asks existing products to prioritize memory-safety roadmaps. NSA/CISA guidance also recognizes incremental adoption and interoperability rather than assuming every installed C system can be rewritten at once. For a C architecture, that creates a concrete obligation: identify high-risk components, shrink unsafe surfaces, place memory-safe components where practical, and make the remaining C case measurable and time-bounded. Sources: Product Security Bad Practices; Memory Safe Languages: Reducing Vulnerabilities in Modern Software Development.
| Boundary | What crosses it | Mechanism can establish | It does not establish alone |
|---|---|---|---|
| Source / preprocessor | Headers, macros, generated files, feature selection | Reproducible generation and include graph | Semantic review of every selected expansion |
| Compiler optimization | C abstract-machine assumptions become target transformations | Diagnostics and instrumented builds | Defined behavior or equivalence of untested optimization paths |
| Link | Objects, archives, LTO, scripts, startup and libraries become one image | Symbol/layout maps and reproducible inputs | Correct initialization, ABI ownership, or dead-code safety |
| Raw pointer / buffer | Address, extent, alignment, lifetime, provenance and mutability | Nothing beyond what code and tools establish | Bounds, lifetime, race freedom, initialization |
| C / assembly | Values and state cross compiler and hand-written instruction domains | ABI plus declared operands/clobbers | Semantic equivalence, unwindability, or sanitizer visibility |
| Kernel / user | Untrusted pointers, lengths, commands, packets and shared mappings | Protection and explicit copy/validation APIs | Semantic validity or race-free teardown |
| ISR / DMA / task | Concurrent hardware and software agents share memory and devices | Platform primitives and driver protocol | Ordering, ownership, cache coherence, deadlines |
| Protocol / media input | Adversarial structured bytes, timestamps and state transitions | Parser checks and resource budgets | Benign complexity, finite work, or trusted metadata |
| Dependency / tool | Third-party source and build-time executables enter the product | Pinned identity, hashes/signatures, SBOM | Maintainer intent, absence of malicious logic, fitness |
Trust boundaries across the C life cycle. Compiler hardening, sanitizers, static analysis, fuzzing, MPU/MMU isolation, capability hardware, process separation, coding rules, and review are complementary controls.
A useful memory-safety roadmap classifies by exposure and authority: network/media parsers, privileged code, cryptographic and identity components, update paths, and cross-domain brokers normally deserve priority. At each seam, use length-carrying APIs, checked arithmetic, explicit ownership, opaque state, narrow privileges, bounded resource use, process or hardware isolation where available, and differential tests between old and new paths.
Architecture decision guide¶
| Decision | Starting position | Tradeoff to record | Sources |
|---|---|---|---|
| Which C contract is the project actually using? | Name an ISO baseline and every required extension, platform API, ABI, and freestanding or hosted assumption in the build configuration. | A newer standard adds facilities but does not replace kernel dialects, vendor extensions, compiler support matrices, or certification baselines. | ISO/IEC 9899:2024 — Programming languages — C; Programming Language |
| Which components still justify memory-unsafe C? | Keep C where hardware, ABI, timing, footprint, qualified tooling, or installed-base constraints are real; prefer memory-safe languages for new higher-level components and isolate the seam. | Migration cost is real, but sanitizers and coding rules mitigate rather than eliminate spatial, temporal, and concurrency memory hazards. | Product Security Bad Practices; Memory Safe Languages: Reducing Vulnerabilities in Modern Software Development |
| What crosses the binary boundary? | Use fixed-width or explicitly versioned types, clear ownership, opaque handles, explicit error values, symbol visibility policy, and ABI tests for every supported target. | Exposing compiler-dependent layout, bit-fields, variadics, inline functions, allocator ownership, or long-lived structs makes independent evolution expensive. | System V Application Binary Interface AMD64 Architecture Processor Supplement; Procedure Call Standard for the Arm 64-bit Architecture; RISC-V ELF psABI Document |
| Where should assembly live? | Prefer compiler intrinsics or isolated out-of-line .S routines behind a C reference implementation; use extended inline asm only when its operand and clobber contract is the right abstraction. | Assembly buys exact instructions and access to privileged or vector features, but multiplies ISA, ABI, optimizer, unwind, sanitizer, and test obligations. | Extended Asm — Assembler Instructions with C Expression Operands; Using as — GNU Assembler; checkasm — for all your assembly checking needs |
| What execution context owns this kernel code? | Document process, softirq, hardirq, NMI, workqueue, or atomic context together with sleepability, lifetime, locking, user-copy, and allocation constraints. | A function signature alone cannot express kernel context; hidden context coupling produces deadlocks, use-after-free, priority inversions, and invalid blocking. | Core API Documentation; The Linux driver implementer's API guide |
| What is the real-time scheduling and memory policy? | Define priorities, periods/deadlines, bounded queues, allocation phases, ISR handoff, maximum blocking, stack budgets, watchdog response, and overload shedding before selecting APIs. | An RTOS provides mechanisms, not schedulability; dynamic allocation, logging, unbounded protocol work, and shared locks can invalidate the timing case. | FreeRTOS kernel fundamentals; ROS 2 Executors; RTEMS Documentation |
| What evidence makes critical C acceptable? | Trace system hazards and requirements to architecture, code, analysis, tests, coverage, configuration, tool evidence, deviations, binary/object checks, and controlled release artifacts. | MISRA or CERT findings are inputs to an assurance case, not a certificate that the system is safe, secure, temporally correct, or fit for its operational environment. | MIL-STD-882E Change 1 — System Safety; AC 20-115D — Airborne Software Development Assurance Using ED-12() and DO-178(); MISRA C:2025 — Guidelines for the use of the C language in critical systems; SEI CERT C Coding Standard |
| Where is determinism enforced in a robotics graph? | Keep the bounded sense-plan-act path on an analyzed executor/task schedule and bridge asynchronously to discovery, visualization, logging, and best-effort services. | Middleware QoS can bound transport behavior but cannot by itself bound callback execution, shared-resource contention, or end-to-end control latency. | ROS 2 Executors; rclc — ROS client library in C; Internal ROS 2 interfaces |
| How are flight-critical and mission functions partitioned? | Keep estimator/control/actuation authority on the flight controller; treat companion computers, payloads, radio links, and ground stations as explicit, degradable trust boundaries. | A richer companion platform accelerates development, but timing, link loss, command authority, stale data, and recovery behavior must remain safe without it. | PX4 Architectural Overview; MAVLink Developer Guide; Modular Open Systems Approach |
| Where are FFmpeg's packet, frame, and device boundaries? | Draw the demux-decode-filter-encode-mux graph with time bases, negotiated formats, buffer ownership, thread boundaries, and hardware upload/download edges. | Zero-copy and hardware paths reduce movement but couple device formats and lifetimes; portable scalar and software paths remain essential for correctness and coverage. | FFmpeg library modules; Libavformat Documentation; FFmpeg Hardware Acceleration |
| How are native dependencies reproduced and audited? | Pin source identity and revisions, preserve checksums or signatures, record build options and patches, generate an SBOM, and rebuild in a controlled toolchain environment. | System packages, vendoring, submodules, Conan, and vcpkg shift who owns updates and ABI compatibility; no mechanism establishes maintainer trust by itself. | Conan 2 documentation; vcpkg documentation; Guide to pkg-config |
11 review prompts stored in the ecosystem graph. They are starting positions, not universal prescriptions; a measured constraint or applicable assurance process can change the answer.
A complete C architecture decision record names at least: language/dialect and extensions; target ABIs and endianness/data models; compiler, linker, startup and libc; build and dependency provenance; address spaces and privilege; buffer ownership; concurrency contexts; allocation policy; error/fault/reset behavior; assembly and generated-code seams; supported hardware; analysis/test matrix; update compatibility; and the exact released binary identity. If one of those is “whatever the toolchain does,” that is still a decision—just an unstable one.
Component and relationship register¶
This is the lossless text form of the visual map. Stable IDs are graph keys; names are labels. The build rejects duplicate IDs, dangling relationship endpoints, unknown layers/statuses/relation kinds, self-edges, uncited assertions, unused sources, invalid snapshot dates, and non-chronological milestones before rendering.
Components¶
| Stable ID | Component | Layer | Status | Responsibility | Evidence |
|---|---|---|---|---|---|
iso-c | ISO C | Standards & contracts | standard | Defines the abstract machine, translation units, types, expressions, library surface, conformance, and portability boundaries; it does not define a platform ABI or build system. | ISO/IEC 9899:2024 — Programming languages — C; C project status and milestones |
posix | POSIX | Standards & contracts | standard | Adds portable operating-system interfaces such as processes, files, threads, signals, and sockets around the ISO C base on conforming systems. | POSIX.1-2024, The Open Group Base Specifications Issue 8 |
platform-abi | Platform ABI | Standards & contracts | standard | Fixes calling convention, register use, data layout, stack rules, object-file conventions, relocations, and dynamic-linking contracts for a target platform. | System V Application Binary Interface AMD64 Architecture Processor Supplement; Procedure Call Standard for the Arm 64-bit Architecture; RISC-V ELF psABI Document |
assurance-rules | Assurance rules | Standards & contracts | standard | Restricts or disciplines C for predictable, safe, secure, and reviewable code; compliance requires process, evidence, and controlled deviations, not only a linter switch. | MISRA C:2025 — Guidelines for the use of the C language in critical systems; SEI CERT C Coding Standard |
face | FACE | Standards & contracts | standard | Defines architectural segments and interfaces for portable airborne software components across general-purpose, safety, and security profiles. | FACE Technical Standard and corresponding documents |
mosa | DoD MOSA | Standards & contracts | standard | Frames modular, loosely coupled defense-system architectures around open interfaces, replaceable components, conformance, and life-cycle sustainment. | Modular Open Systems Approach |
source-headers | Sources + headers | Source & build | project-code | Organizes declarations and definitions into translation units; textual inclusion makes header ownership, macro state, feature-test macros, and include order architectural concerns. | ISO/IEC 9899:2024 — Programming languages — C |
make | Make | Source & build | build-tool | Expresses file-oriented targets, prerequisites, recipes, and incremental rebuild rules; many systems expose or build a higher-level generator above it. | GNU Make Manual |
cmake | CMake | Source & build | build-tool | Models targets, usage requirements, tests, installation, and export metadata, then generates native build-system inputs for multiple platforms. | CMake Documentation |
meson | Meson + Ninja | Source & build | build-tool | Provides a declarative project model commonly executed by Ninja, with explicit cross files and dependency objects for native and cross builds. | The Meson Build System; Ninja Manual |
pkg-config | pkg-config | Source & build | build-tool | Publishes compiler and linker metadata for installed libraries through .pc files; it describes an installation but does not resolve or fetch source packages. | Guide to pkg-config |
dependency-manager | Dependency managers | Source & build | community-choice | Acquires and builds versioned native dependencies and integrates them with build systems; system packages, vendoring, submodules, Conan, and vcpkg imply different provenance contracts. | Conan 2 documentation; vcpkg documentation |
preprocessor | Preprocessor | Compiler & binary | official-tool | Performs inclusion, conditional selection, and macro replacement before the C front end; generated tokens and configuration choices form the effective program. | The C Preprocessor |
gcc | GCC | Compiler & binary | implementation | Implements ISO and GNU C dialects, target code generation, optimization, LTO, inline assembly constraints, diagnostics, and a compiler-driver interface to assembler and linker. | Using the GNU Compiler Collection; Extended Asm — Assembler Instructions with C Expression Operands |
clang-llvm | Clang / LLVM | Compiler & binary | implementation | Supplies a C front end, LLVM IR pipeline, target backends, LTO, integrated assembler options, diagnostics, and an alternative full toolchain for Linux and other platforms. | Clang documentation; Building Linux with Clang/LLVM |
assembler | Assembler | Compiler & binary | official-tool | Encodes instructions, directives, sections, symbols, and relocations into target object files from compiler output or hand-written assembly. | Using as — GNU Assembler |
msvc | MSVC | Compiler & binary | implementation | Implements Microsoft's C dialect and Windows compiler, linker, object, debug, and runtime conventions; portability must separate ISO behavior from platform contracts. | C language reference |
linker | Linker | Compiler & binary | official-tool | Resolves symbols and relocations, selects archive members, lays out sections, applies linker scripts, and emits executables, shared objects, modules, or firmware images. | LD — GNU Linker; Linker Scripts |
object-format | ELF / COFF | Compiler & binary | external-boundary | Carries sections, symbols, relocations, visibility, debug information, and loader metadata between compilers, assemblers, linkers, loaders, debuggers, and analysis tools. | System V ABI — Generic ABI; PE Format |
glibc | glibc | Runtime & assurance | implementation | Provides the ISO C and POSIX-facing user-space runtime on GNU systems, including startup, allocation, threads, dynamic linking integration, locale, I/O, and system-call wrappers. | The GNU C Library Reference Manual |
musl | musl | Runtime & assurance | implementation | Implements a compact Linux libc with strong static-linking support and standards-oriented interfaces, representing a different compatibility and deployment tradeoff from glibc. | About musl |
embedded-libc | Embedded libc | Runtime & assurance | implementation | Supplies freestanding and bare-metal C library pieces that are retargeted to board I/O, allocation, process, and termination hooks rather than assuming a hosted Unix process. | The Newlib Homepage; Picolibc C library for embedded systems |
debuggers | GDB / LLDB | Runtime & assurance | analysis-tool | Correlates machine state and debug information with C source, supports breakpoints and unwinding, and often reaches remote embedded targets through a debug server. | Debugging with GDB; LLDB documentation |
sanitizers | Sanitizers | Runtime & assurance | analysis-tool | Instruments selected undefined behavior, memory access, data race, leak, and control-flow properties in test builds; coverage and platform support vary and absence of a finding is not proof. | AddressSanitizer; UndefinedBehaviorSanitizer |
static-analysis | Static analysis | Runtime & assurance | analysis-tool | Checks paths, data flow, API contracts, and coding-rule subsets without executing the program; project modeling and deviation handling determine useful coverage. | Clang Static Analyzer; SEI CERT C Coding Standard |
linux-kernel | Linux kernel | Kernel & low level | platform | Runs privileged core services and hardware management. The current documentation specifies GNU C11 for C code, alongside supported Rust, and no user-space libc is available inside the kernel. | The Linux Kernel Archives; Programming Language |
kconfig-kbuild | Kconfig + kbuild | Kernel & low level | build-tool | Turns configuration symbols, architecture rules, generated headers, C and assembly objects, archives, linker scripts, and post-link steps into vmlinux, modules, and boot images. | Linux Kernel Makefiles; Kconfig Language |
kernel-subsystems | Kernel subsystems | Kernel & low level | project-code | Provides scheduler, memory management, VFS, networking, block, security, synchronization, and other shared internal contracts above architecture-specific primitives. | Core API Documentation |
drivers-modules | Drivers + modules | Kernel & low level | project-code | Binds buses and devices to kernel subsystem interfaces; code may be built in or loaded as a module but remains in the kernel protection domain. | The Linux driver implementer's API guide; Building External Modules |
ebpf | eBPF | Kernel & low level | platform | Loads restricted programs through a verifier and JIT/interpreter path for tracing, networking, and security hooks; its instruction and helper contracts differ from native C even when source is written in C. | BPF Documentation |
qemu | QEMU | Kernel & low level | analysis-tool | Emulates complete machines or user-mode targets for cross-platform bring-up, kernel and firmware testing, debugging, and CI before or alongside hardware-in-the-loop. | System Emulation Introduction |
cmsis | CMSIS | Embedded & real time | standard | Standardizes processor-core access, device support, driver and RTOS interfaces, DSP/NN libraries, debug access, and pack-based delivery across Arm microcontrollers. | CMSIS Introduction |
bsp-startup-isr | BSP + startup + ISR | Embedded & real time | project-code | Owns reset entry, vector tables, clocks, memory initialization, linker layout, interrupt handlers, peripheral access, and the board-specific seam between C and assembly. | Using CMSIS in Embedded Applications; Linker Scripts |
freertos | FreeRTOS | Embedded & real time | platform | Provides a priority scheduler, tasks, queues, notifications, semaphores, timers, memory-allocation choices, and portable architecture layers for constrained microcontrollers. | FreeRTOS kernel fundamentals |
zephyr | Zephyr | Embedded & real time | platform | Combines an RTOS kernel, device-driver model, devicetree, Kconfig, CMake/west builds, networking, security, and safety-oriented project processes across many boards. | Zephyr Project Documentation; Devicetree access from C/C++ |
rtems | RTEMS | Embedded & real time | platform | Provides a real-time executive with Classic and POSIX APIs, BSP and driver layers, multiprocessor support, and documented engineering artifacts for critical systems. | RTEMS Documentation |
nuttx | NuttX | Embedded & real time | platform | Provides a small POSIX-oriented RTOS, board and driver model, configuration system, and protected or flat build modes; it is PX4's primary flight-controller RTOS. | Apache NuttX Documentation; PX4 Architectural Overview |
ros2-rcl | ROS 2 rcl | Robotics & autonomy | official-library | Provides the public C client-library core used by language-specific clients, while remaining independent of a concrete middleware implementation. | Internal ROS 2 interfaces |
ros2-rmw | ROS 2 rmw | Robotics & autonomy | official-library | Defines a C interface between ROS client libraries and replaceable DDS, RTPS, Zenoh, or other middleware implementations. | Internal ROS 2 interfaces |
micro-ros-rclc | micro-ROS rclc | Robotics & autonomy | domain-project | Adds a C convenience and executor layer for resource-constrained robotics, including controlled callback ordering and trigger conditions for real-time patterns. | rclc — ROS client library in C; ROS 2 Executors |
px4 | PX4 | Robotics & autonomy | domain-project | Structures an autonomous vehicle as drivers, uORB messaging, estimation, control, navigation, communication, and actuator paths over NuttX or POSIX platforms. | PX4 Architectural Overview; uORB Messaging |
ardupilot | ArduPilot | Robotics & autonomy | domain-project | Implements vehicle applications over shared libraries and a hardware abstraction layer, targeting embedded boards and simulation environments. | Learning ArduPilot — Introduction |
mavlink | MAVLink | Robotics & autonomy | standard | Defines compact messages and generated C interfaces across flight controllers, companion computers, payloads, and ground stations; transport and system safety remain separate concerns. | MAVLink Developer Guide |
ffmpeg | FFmpeg tools | Media & signal paths | domain-project | Provides command-line orchestration for ingest, probing, decode, filter, encode, mux, streaming, device I/O, and hardware acceleration over the FFmpeg libraries. | Download FFmpeg; FFmpeg Documentation |
libavformat | libavformat | Media & signal paths | official-library | Maps protocols and container formats to timestamped compressed packets and writes packets back to containers or streams. | FFmpeg library modules; Libavformat Documentation |
libavcodec | libavcodec | Media & signal paths | official-library | Transforms compressed packets and coded data into decoded frames, or frames into encoded packets, while exposing codec capabilities and hardware contexts. | FFmpeg library modules |
libavfilter | libavfilter | Media & signal paths | official-library | Builds graph-based audio and video frame transformations with explicit pads, links, negotiation, scheduling, and source/sink boundaries. | FFmpeg library modules |
libavutil-convert | Utility + conversion libs | Media & signal paths | official-library | Provides common frames, buffers, pixel and sample metadata plus video scaling/color conversion and audio resampling/mixing services. | FFmpeg library modules |
optimized-dsp | SIMD assembly | Media & signal paths | project-code | Implements measured codec, transform, pixel, and audio kernels in target intrinsics or assembly behind runtime CPU dispatch and scalar C fallbacks. | checkasm — for all your assembly checking needs; FFmpeg Developer Documentation |
hardware-accel | Hardware acceleration | Media & signal paths | external-boundary | Moves selected decode, encode, mapping, or filtering work through platform APIs and device surfaces, introducing format, lifetime, synchronization, and fallback boundaries. | FFmpeg Hardware Acceleration |
All 50 components in data/c-ecosystem.json. Status distinguishes standards, tools, implementations, project code, domain projects, and external boundaries; it is not a maturity score.
Relationships¶
| Stable ID | From | Relation | To | Meaning | Evidence |
|---|---|---|---|---|---|
c-specifies-source | ISO C | specifies | Sources + headers | defines translation units, declarations, definitions, preprocessing tokens, and library contracts | ISO/IEC 9899:2024 — Programming languages — C |
posix-extends-c | POSIX | extends | ISO C | adopts the C language and library while adding operating-system interfaces | POSIX.1-2024, The Open Group Base Specifications Issue 8 |
abi-constrains-codegen | Platform ABI | configures | GCC | constrains target calling convention, layout, symbols, and relocation behavior | System V Application Binary Interface AMD64 Architecture Processor Supplement; Procedure Call Standard for the Arm 64-bit Architecture; RISC-V ELF psABI Document |
assurance-constrains-source | Assurance rules | checks | Sources + headers | restricts risky constructs and requires documented project rules and deviations | MISRA C:2025 — Guidelines for the use of the C language in critical systems; SEI CERT C Coding Standard |
face-applies-posix | FACE | depends-on | POSIX | uses selected operating-system and language interfaces within architectural profiles | FACE Technical Standard and corresponding documents |
mosa-frames-face | DoD MOSA | integrates-with | FACE | uses standards-based severable interfaces as a defense modularity mechanism | Modular Open Systems Approach; FACE Technical Standard and corresponding documents |
make-builds-source | Make | builds | Sources + headers | models prerequisites and recipes for translation-unit outputs | GNU Make Manual |
cmake-generates-make | CMake | generates | Make | can generate native Makefile build graphs | CMake Documentation |
meson-generates-ninja | Meson + Ninja | builds | Sources + headers | generates and executes a target graph, commonly through Ninja | The Meson Build System; Ninja Manual |
pkgconfig-feeds-build | pkg-config | configures | CMake | supplies installed dependency compiler and linker metadata | Guide to pkg-config; CMake Documentation |
dependency-feeds-build | Dependency managers | integrates-with | CMake | acquires native dependencies and exports build-system integration | Conan 2 documentation; vcpkg documentation |
source-enters-cpp | Sources + headers | preprocesses | Preprocessor | feeds source files, included headers, macro state, and conditional configuration | ISO/IEC 9899:2024 — Programming languages — C; The C Preprocessor |
cpp-feeds-gcc | Preprocessor | invokes | GCC | produces the token stream parsed and analyzed by the GNU C front end | The C Preprocessor; Using the GNU Compiler Collection |
cpp-feeds-clang | Preprocessor | invokes | Clang / LLVM | produces the token stream parsed and lowered by Clang | Clang documentation |
gcc-emits-assembly | GCC | lowers-to | Assembler | emits target instructions as assembly text or integrated assembler input | Using the GNU Compiler Collection; Using as — GNU Assembler |
clang-emits-object | Clang / LLVM | lowers-to | Assembler | lowers LLVM IR to target instructions and object representation | Clang documentation |
msvc-emits-object | MSVC | produces | ELF / COFF | emits Windows COFF objects and debug information under Microsoft target contracts | C language reference; PE Format |
assembler-emits-object | Assembler | produces | ELF / COFF | encodes sections, symbols, instructions, and relocations | Using as — GNU Assembler; System V ABI — Generic ABI |
object-enters-linker | ELF / COFF | links | Linker | supplies relocatable objects, archives, shared objects, symbols, and metadata | LD — GNU Linker; System V ABI — Generic ABI |
linker-emits-image | Linker | produces | ELF / COFF | emits a linked executable, shared object, module, or firmware image | LD — GNU Linker; Linker Scripts |
glibc-implements-c-posix | glibc | implements | POSIX | implements ISO C and POSIX-facing user-space facilities on GNU systems | The GNU C Library Reference Manual; POSIX.1-2024, The Open Group Base Specifications Issue 8 |
musl-implements-c-posix | musl | implements | POSIX | implements ISO C and POSIX interfaces for Linux with a different deployment contract | About musl |
embedded-libc-implements-c | Embedded libc | implements | ISO C | implements selected hosted and freestanding library facilities for embedded targets | The Newlib Homepage; Picolibc C library for embedded systems |
debugger-reads-object | GDB / LLDB | inspects | ELF / COFF | reads symbols, debug information, unwind metadata, registers, and process or target state | Debugging with GDB; LLDB documentation |
sanitizers-instrument-clang | Sanitizers | extends | Clang / LLVM | adds compiler instrumentation and runtime checks to selected builds | AddressSanitizer; UndefinedBehaviorSanitizer |
analyzer-checks-source | Static analysis | checks | Sources + headers | models paths and coding contracts without executing the target | Clang Static Analyzer; SEI CERT C Coding Standard |
kbuild-configures-kernel | Kconfig + kbuild | builds | Linux kernel | selects objects and generates vmlinux, modules, and architecture boot products | Linux Kernel Makefiles; Kconfig Language |
kbuild-invokes-compilers | Kconfig + kbuild | invokes | GCC | drives supported C compilers with kernel and architecture flags | Linux Kernel Makefiles; Programming Language |
kbuild-invokes-assembler | Kconfig + kbuild | invokes | Assembler | builds hand-written and preprocessed architecture assembly alongside C | Linux Kernel Makefiles |
kbuild-invokes-linker | Kconfig + kbuild | invokes | Linker | uses architecture linker scripts and ordered built-in archives for vmlinux and modules | Linux Kernel Makefiles |
kernel-contains-subsystems | Linux kernel | provides-api | Kernel subsystems | hosts shared scheduling, memory, VFS, networking, block, and security contracts | Core API Documentation |
drivers-use-subsystems | Drivers + modules | implements | Kernel subsystems | implements bus and device operations exposed by kernel subsystems | The Linux driver implementer's API guide |
modules-link-kernel | Drivers + modules | loads-into | Linux kernel | loads built modules into the same privileged kernel address space | Building External Modules |
ebpf-hooks-kernel | eBPF | executes | Linux kernel | runs verified bytecode through interpreter or JIT at selected kernel hooks | BPF Documentation |
qemu-runs-kernel | QEMU | runs-on | Linux kernel | emulates target hardware for kernel boot and subsystem testing | System Emulation Introduction |
cmsis-specifies-bsp | CMSIS | provides-api | BSP + startup + ISR | standardizes core headers, startup expectations, interrupt names, and device support seams | CMSIS Introduction; Using CMSIS in Embedded Applications |
bsp-mixes-c-asm | BSP + startup + ISR | integrates-with | Assembler | combines C initialization and handlers with reset stubs, vector entries, and privileged instructions | Using CMSIS in Embedded Applications; Using as — GNU Assembler |
bsp-controls-link | BSP + startup + ISR | configures | Linker | defines memory regions, section placement, entry point, stacks, heaps, and image layout | Linker Scripts; Using CMSIS in Embedded Applications |
freertos-uses-bsp | FreeRTOS | runs-on | BSP + startup + ISR | depends on a processor port, interrupt/tick setup, stacks, and board services | FreeRTOS kernel fundamentals |
zephyr-generates-bsp | Zephyr | configures | BSP + startup + ISR | combines board, SoC, devicetree, Kconfig, and driver information into a firmware build | Zephyr Project Documentation; Devicetree access from C/C++ |
rtems-uses-bsp | RTEMS | runs-on | BSP + startup + ISR | ports executive services through CPU, BSP, and device-driver layers | RTEMS Documentation |
nuttx-uses-bsp | NuttX | runs-on | BSP + startup + ISR | binds configured OS services to architecture, board, and driver implementations | Apache NuttX Documentation |
embedded-libc-serves-rtos | Embedded libc | integrates-with | FreeRTOS | retargets library I/O, allocation, and process hooks to the selected firmware environment | The Newlib Homepage; FreeRTOS kernel fundamentals |
debugger-reaches-bsp | GDB / LLDB | inspects | BSP + startup + ISR | uses remote probes or stubs to inspect registers, memory, threads, and symbols on target | Debugging with GDB; CMSIS Introduction |
ros-rcl-uses-rmw | ROS 2 rcl | depends-on | ROS 2 rmw | implements common client behavior over the replaceable middleware C interface | Internal ROS 2 interfaces |
rclc-extends-rcl | micro-ROS rclc | extends | ROS 2 rcl | adds C convenience functions and executor policies over the common client layer | rclc — ROS client library in C |
rclc-runs-rtos | micro-ROS rclc | runs-on | FreeRTOS | supports resource-constrained real-time deployments over an RTOS integration | rclc — ROS client library in C; FreeRTOS kernel fundamentals |
px4-runs-nuttx | PX4 | runs-on | NuttX | uses NuttX as its primary flight-controller RTOS and POSIX-like runtime boundary | PX4 Architectural Overview |
px4-publishes-uorb | PX4 | integrates-with | ROS 2 rmw | bridges versioned vehicle topics toward external ROS 2 and DDS-compatible systems | uORB Messaging; Internal ROS 2 interfaces |
px4-speaks-mavlink | PX4 | communicates-via | MAVLink | exchanges telemetry, commands, parameters, and mission messages with external systems | PX4 Architectural Overview; MAVLink Developer Guide |
ardupilot-uses-mavlink | ArduPilot | communicates-via | MAVLink | uses generated protocol messages for vehicle and ground-system communication | Learning ArduPilot — Introduction; MAVLink Developer Guide |
ardupilot-uses-hal | ArduPilot | integrates-with | BSP + startup + ISR | uses AP_HAL implementations to isolate vehicle and shared-library code from ChibiOS, Linux, ESP32, and board-specific services | Learning ArduPilot — Introduction |
ffmpeg-orchestrates-format | FFmpeg tools | invokes | libavformat | opens inputs and outputs and transfers compressed packets through format contexts | FFmpeg Documentation; Libavformat Documentation |
ffmpeg-orchestrates-codec | FFmpeg tools | invokes | libavcodec | selects and drives decoders and encoders for packet/frame conversion | FFmpeg Documentation; FFmpeg library modules |
ffmpeg-orchestrates-filter | FFmpeg tools | invokes | libavfilter | constructs and schedules audio/video filter graphs between decode and encode | FFmpeg Documentation; FFmpeg library modules |
format-feeds-codec | libavformat | produces | libavcodec | demultiplexes container streams into compressed packets consumed by codecs | Libavformat Documentation; FFmpeg library modules |
codec-feeds-filter | libavcodec | produces | libavfilter | decodes packets into frames consumed by filter graphs | FFmpeg library modules |
filter-uses-utils | libavfilter | depends-on | Utility + conversion libs | uses common buffers and frame metadata plus negotiated scale/resample conversions | FFmpeg library modules |
codec-dispatches-dsp | libavcodec | executes | SIMD assembly | dispatches hot kernels to architecture-specific optimized implementations when supported | checkasm — for all your assembly checking needs; FFmpeg Developer Documentation |
filter-dispatches-dsp | libavfilter | executes | SIMD assembly | uses optimized pixel, audio, and transform functions behind library interfaces | checkasm — for all your assembly checking needs |
dsp-obeys-abi | SIMD assembly | implements | Platform ABI | must preserve the calling, stack, register, symbol, and unwind contract seen by C callers | System V Application Binary Interface AMD64 Architecture Processor Supplement; Procedure Call Standard for the Arm 64-bit Architecture; RISC-V ELF psABI Document |
codec-uses-hardware | libavcodec | accelerates | Hardware acceleration | maps supported codecs and frame surfaces onto external device APIs | FFmpeg Hardware Acceleration |
hardware-returns-frames | Hardware acceleration | integrates-with | libavfilter | shares or transfers device-backed frames across filter and encode boundaries | FFmpeg Hardware Acceleration |
sanitizers-check-ffmpeg | Sanitizers | checks | FFmpeg tools | instruments portable C paths in dedicated test builds while assembly and device code need separate coverage | AddressSanitizer; FFmpeg Developer Documentation |
qemu-runs-rtos | QEMU | runs-on | Zephyr | provides emulated machines for repeatable RTOS and driver tests where supported | System Emulation Introduction; Zephyr Project Documentation |
face-constrains-rtos | FACE | integrates-with | RTEMS | places portable avionics components above defined operating-system and transport service segments | FACE Technical Standard and corresponding documents; RTEMS Documentation |
mosa-governs-interfaces | DoD MOSA | extends | Platform ABI | treats well-defined, testable technical interfaces as life-cycle modularity boundaries | Modular Open Systems Approach |
assurance-checks-bsp | Assurance rules | checks | BSP + startup + ISR | applies restricted-language, traceability, analysis, and controlled-deviation practices to critical low-level code | MISRA C:2025 — Guidelines for the use of the C language in critical systems; AC 20-115D — Airborne Software Development Assurance Using ED-12() and DO-178() |
kernel-obeys-abi | Linux kernel | implements | Platform ABI | defines additional internal conventions but still relies on architecture object, register, entry, and toolchain contracts | Programming Language; Assembler Annotations |
All 69 typed relationships in data/c-ecosystem.json. Every endpoint resolves to one component above, and every edge carries upstream evidence.
Current direction and durable role¶
C23 is a real modernization of the language, and WG14 has already moved into C2y work, but the most important current ecosystem change happens outside syntax: stronger pressure to prevent memory-safety defects, mix memory-safe languages into existing systems, isolate parsers and privileged services, preserve exact build provenance, and treat binary and hardware contracts as reviewable architecture.
C will remain difficult to displace where it is itself the interface: firmware startup, platform ABIs, libc, kernel internals, device SDKs, language runtimes, codecs, and stable foreign-function surfaces. That durable role does not imply that every adjacent component should also be C. A healthy modern system tends to make the C core narrower, more explicit, more heavily checked, and easier to replace or wrap.
The deepest common pattern across Linux, RTOS firmware, robotics, drones, and FFmpeg is a narrow portable contract over replaceable machine-specific implementations. It succeeds when the boundary carries enough truth: ABI and layout, ownership and lifetime, time and ordering, resource ceilings, error states, capability discovery, fallback, and verification. C’s future is strongest where those contracts are visible—and weakest where a raw pointer or undocumented macro is expected to carry them by convention.
Sources¶
Language, platform, standards-body, regulator, government, and upstream project sources were checked for this 2026-09-03 snapshot. Version numbers are included only where they date a claim; project documentation remains the authority after the snapshot.
- ISO/IEC 9899:2024 — Programming languages — C, ISO.
- C project status and milestones, ISO/IEC JTC 1/SC 22/WG14.
- The Development of the C Language, Bell Labs / Dennis M. Ritchie.
- POSIX.1-2024, The Open Group Base Specifications Issue 8, The Open Group / IEEE.
- System V Application Binary Interface AMD64 Architecture Processor Supplement, x86-64 psABI project.
- Procedure Call Standard for the Arm 64-bit Architecture, Arm.
- RISC-V ELF psABI Document, RISC-V International.
- MISRA C:2025 — Guidelines for the use of the C language in critical systems, The MISRA Consortium.
- SEI CERT C Coding Standard, Carnegie Mellon Software Engineering Institute.
- FACE Technical Standard and corresponding documents, The Open Group FACE Consortium.
- Modular Open Systems Approach, U.S. Department of Defense, OUSD(R&E).
- MIL-STD-882E Change 1 — System Safety, U.S. Department of Defense ASSIST.
- AC 20-115D — Airborne Software Development Assurance Using ED-12() and DO-178(), U.S. Federal Aviation Administration.
- GNU Make Manual, GNU Project.
- CMake Documentation, Kitware.
- The Meson Build System, Meson project.
- Ninja Manual, Ninja project.
- Guide to pkg-config, freedesktop.org.
- Conan 2 documentation, Conan project.
- vcpkg documentation, Microsoft.
- The C Preprocessor, GNU Project.
- Using the GNU Compiler Collection, GNU Project.
- Extended Asm — Assembler Instructions with C Expression Operands, GNU Project.
- Clang documentation, LLVM Project.
- C language reference, Microsoft.
- Using as — GNU Assembler, GNU Project.
- LD — GNU Linker, GNU Project.
- Linker Scripts, GNU Project.
- System V ABI — Generic ABI, Xinuos.
- PE Format, Microsoft.
- The GNU C Library Reference Manual, GNU Project.
- About musl, musl libc project.
- The Newlib Homepage, Newlib project.
- Picolibc C library for embedded systems, Picolibc project.
- Debugging with GDB, GNU Project.
- LLDB documentation, LLVM Project.
- AddressSanitizer, LLVM Project.
- UndefinedBehaviorSanitizer, LLVM Project.
- Clang Static Analyzer, LLVM Project.
- The Linux Kernel Archives, Linux Kernel Organization.
- Programming Language, Linux kernel documentation.
- Building Linux with Clang/LLVM, Linux kernel documentation.
- Linux Kernel Makefiles, Linux kernel documentation.
- Kconfig Language, Linux kernel documentation.
- Core API Documentation, Linux kernel documentation.
- The Linux driver implementer's API guide, Linux kernel documentation.
- Building External Modules, Linux kernel documentation.
- BPF Documentation, Linux kernel documentation.
- Assembler Annotations, Linux kernel documentation.
- System Emulation Introduction, QEMU Project.
- CMSIS Introduction, Arm.
- Using CMSIS in Embedded Applications, Arm.
- FreeRTOS kernel fundamentals, Amazon Web Services / FreeRTOS.
- Zephyr Project Documentation, Zephyr Project.
- Devicetree access from C/C++, Zephyr Project.
- RTEMS Documentation, RTEMS Project.
- Apache NuttX Documentation, Apache Software Foundation.
- Internal ROS 2 interfaces, Open Robotics.
- ROS 2 Executors, Open Robotics.
- rclc — ROS client library in C, Open Robotics / micro-ROS.
- PX4 Architectural Overview, PX4 / Dronecode Foundation.
- uORB Messaging, PX4 / Dronecode Foundation.
- Learning ArduPilot — Introduction, ArduPilot Project.
- MAVLink Developer Guide, MAVLink Project.
- Download FFmpeg, FFmpeg Project.
- FFmpeg Documentation, FFmpeg Project.
- FFmpeg library modules, FFmpeg Project.
- Libavformat Documentation, FFmpeg Project.
- FFmpeg Developer Documentation, FFmpeg Project.
- checkasm — for all your assembly checking needs, FFmpeg Project.
- FFmpeg Hardware Acceleration, FFmpeg Project.
- Product Security Bad Practices, CISA and FBI.
- Memory Safe Languages: Reducing Vulnerabilities in Modern Software Development, NSA and CISA.