Compatibility
Carrick emulates the Linux syscall interface, not the Linux kernel. This means compatibility is a spectrum, not a binary. We run standard test suites continuously and publish the results so you can assess whether your workload will work.
Go runtime test suite
~876 / 880 standard-library test binaries pass. verified
Subsystem detail:
context— 38/38sync/atomic— 95/95runtimecore — all passing
Known gaps:
os/exec—TestExplicitPWD($PWD across bind-mounts)net— multicast / raw-IP tests needCAP_NET_RAW- Rare HVF coherence races under heavy concurrent memory operations (intermittent, not consistently reproducible)
Source: docs/conformance-coverage.md in the carrick repo.
libuv test suite
498 / 507 standalone libuv tests pass (98.2%). verified
libuv exercises the full async I/O surface: event loops, pipes, sockets, IPC,
file system operations, pseudo-terminals, and timers. Nine carrick-only gaps remain (kill / sigchld signal delivery, SO_REUSEPORT, and io_uring); carrick also passes 14 tests the root Docker oracle fails.
Source: docs/nodejs-baseline/libuv-full.jsonl in the carrick repo.
Node.js & V8
node-core full plan: 5301 / 5304 (99.9%) on Node 24 and Node 26. The 3 fails are cosmetic stderr snapshots the Docker oracle also fails. verified
Subsystem detail:
worker_threads— multi-threaded worker creation, message passing, and clean teardown are fully functional.- V8 JIT, pointer-compressed heaps, and memory hinting (
MADV_DONTFORK/MADV_DOFORK) are handled. - Scheduler queries (
sched_getscheduler/sched_getparam) resolve live guest thread IDs from theThreadRegistry. exit_groupcorrectly terminates sibling host threads on process exit.
Known gaps:
/proc/self/task— partial directory enumeration under heavy multi-threading.- The 3 failing node-core tests are exact-stderr snapshot comparisons (cosmetic); the Docker oracle fails them too.
Source: docs/nodejs-baseline/ in the carrick repo.
LTP (Linux Test Project) syscall conformance
671 / 893 oracle-validated tests match (75%), against the current LTP 20260529 image. verified
This is the most granular measure of ABI fidelity. Breakdown by subsystem:
| Subsystem | Pass rate | Note |
|---|---|---|
| Scheduler | 78% | sched_setaffinity, priority, yield |
| Timers | 83% | clock_gettime, timerfd, nanosleep |
| Signals | 87% | rt_sigaction, sigaltstack, sigpending |
| Filesystem | 86% | open, read, write, stat, rename, link |
| Process | 73% | fork, exec, wait, PID-namespace, credentials |
| Networking | 59% | Socket translation is solid; gaps in raw/packet sockets |
| IPC | 43% | SysV shm/sem/msg partially implemented |
| Memory management | 42% | mmap/mprotect work; gaps in mremap, MADV_* flags |
Source: docs/ltp-baseline/ in the carrick repo.
CPython test-suite parity
425 / 492 regrtest modules match (86.4%). verified nuanced
The remaining 18 differing modules are mostly /proc-dependent or hit specific syscall-coverage gaps:
- Several
test_osandtest_posixsubtests that depend on unimplemented/procentries or missing syscalls
Source: docs/cpython-baseline/ in the carrick repo.
End-to-end workloads
| Workload | Status | Notes |
|---|---|---|
apt-get install hello | works | Full package lifecycle including dpkg scripts |
Python http.server | works | Serves concurrent requests from the host |
Interactive shell (-t) | works | Real PTY, job control, Ctrl-C/Ctrl-Z |
| OCI image pull + run | works | Standard Docker Hub / registry images |
| Go binaries | works | Statically linked Go executables run reliably |
| Node.js & V8 | works | Node 24/26. node-core full plan: 5301/5304 (99.9%). |
| libuv | works | 498/507 tests pass (98.2%). Event loops, pipes, IPC, epoll→kqueue. |
gdb / delve | not yet | ptrace is Phase-1 only |
| x86_64 Linux binaries on macOS (Rosetta 2) | verified | amd64 images run via --platform linux/amd64 — glibc (Debian/Ubuntu, incl. multi-call coreutils) and static-musl (Alpine: busybox, apk) alike. Translated (slower than native arm64) with lighter automated coverage. Requires Rosetta for Linux (softwareupdate --install-rosetta). |
Platform backends
These baselines are the mature macOS / Hypervisor.framework path running AArch64 Linux
guests. The runtime is also being brought up on other hosts — Linux/KVM, FreeBSD/bhyve,
and NetBSD/NVMM — with native x86_64 guests through a shared carrick-x86
engine. Those lanes carry their own per-backend baseline overlays and are not yet at
parity with the macOS path. The --platform linux/amd64 row above is the
separate macOS Rosetta 2 translation path, not a native x86_64 backend. See the
HAL & platform architecture
doc for current status.
Reporting issues
If you hit a binary that doesn't work, carrick compat-report
will show which syscalls the binary uses and which aren't implemented.
File an issue on GitHub
with the report output and the binary (or reproduction steps).