QNX Crate Atlas

Which Rust crates build for QNX 8.0?

We cross-compiled the 500 most downloaded crates on crates.io for both QNX 8.0 targets with the Rust toolchain QNX ships, linked each one into a real QNX binary with qcc, and recorded the first error for every crate that failed. Then we fixed the biggest causes and ran crate test suites on a QNX 8.0 kernel.

A pass means the crate compiles for the target and links into a QNX executable that depends on it but does not call it. In one known case real use goes further: on aarch64, rustls, tokio-rustls, hyper-rustls and reqwest pass, but a program that actually uses rustls fails to link there. Counting those 4 as failures, aarch64 with our patches is 467 of 498 (93.8%).

What breaks

First error of every failed build, before any fix. One crate can fail on both targets; counts are per target.

What the classes mean

Fix one crate, unblock many

Where builds still stop after all our fixes, ranked by how many top crates each one blocks.

The fixes

libc: the target rename

libc 0.2.189 and newer only recognise QNX 8.0 as target_os = "qnx", the name upstream Rust gave the renamed targets. The toolchain QNX ships (rustc 1.85.1) still says target_os = "nto", target_env = "nto80", so libc compiles none of its QNX 8 code.

Workaround today: cargo update -p libc --precise 0.2.186. Better: our compatibility patch for current libc (patches/) maps the old spelling onto the new one, which also brings the QNX 8 socket constants that socket2, tokio networking and reqwest need. Proof: tokio with every feature on (net included) builds for both targets with it and accepts a TCP connection on QNX 8.0 (examples/tokio-net).

Upstream fixes

Merged Nov 11 2026: aws-lc-rs#1292. It reaches users in the next aws-lc-sys release. Open: aws-lc#3780 and target-lexicon#138.

aws-lc-rs, the default rustls crypto provider: qcc rejects --include=, and QNX headers hide PTHREAD_RWLOCK_INITIALIZER without _QNX_SOURCE. aws/aws-lc-rs#1292. With it a rustls binary builds and runs on QNX 8.0 x86_64. On aarch64 a program that uses rustls still fails to link (OPENSSL_cpuid_setup: aws-lc's aarch64 CPU detection had no QNX variant). aws/aws-lc#3780 (open) reads the CPU features from the QNX system page; with it the binary links for aarch64.

target-lexicon could not parse any QNX triple, so build scripts that read TARGET with it panicked, which blocked pyo3. bytecodealliance/target-lexicon#138 adds the QNX operating systems and environments.

Do it yourself

The codelab Rust on QNX 8.0 from a Windows host goes from a fresh Windows machine to a Rust binary running on a QNX 8.0 VM, including each trap above. Its environment, build and libc commands are run by codelab/verify.bat in a fresh folder.

Check your own crate: atlas probe <crate> --target aarch64-unknown-nto-qnx800. Fix your own project: atlas fix <dir> (below).

Fix your project: atlas fix

One command applies the atlas's fixes to your own Cargo project, prints every change, and verifies the build for both QNX 8.0 targets.

python patches/prepare.py
atlas fix path/to/your-project --before

Only crates in your lockfile are touched: [patch.crates-io] entries for libc 0.2.189+, aws-lc-sys (qcc fix plus the aarch64 CPU detection fix) and target-lexicon; .cargo/config.toml settings for rustc 1.85 resolution and, on Windows hosts, the qcc command-line limit; then cargo build for x86_64-pc-nto-qnx800 and aarch64-unknown-nto-qnx800. --dry-run prints the plan only.

Real projectBeforeAfter atlas fix
axum 0.8 + tokio (full) HTTP APIfails both targets (libc cfg)builds both targets
reqwest 0.13 (rustls, aws-lc-rs) clientfails both targets (needs rustc 1.88)builds both targets
clap + tracing + socket2 keepalive CLIfails both targets (libc cfg)builds both targets

Built, not run on the VM. Crates with no known fix (for example nix) stay failing and are reported. Outputs: examples/fix-demos.

Ran on QNX 8.0

Unit tests of crates that build, compiled with the QNX toolchain and executed on a QNX 8.0 x86_64 kernel (QEMU with KVM in WSL2).

All crates

Download atlas.json
#Cratex86_64aarch64First error / blocker

Method

  1. List: the top crates by all-time downloads from the crates.io API.
  2. Probe: for each crate, a throwaway binary package depends on it (default features) and is built with cargo build --target <qnx target>, so the crate is compiled, its build scripts run, and the result is linked by qcc. The probe does not call the crate, so a pass is compile and link, not real use (see the aarch64 rustls note under the headline numbers). Versions are the newest that declare support for rustc 1.85 (cargo's MSRV-aware resolver).
  3. Pass 1 builds the graph as resolved. If it fails with libc 0.2.189+ in the graph, pass 2 pins libc 0.2.186. Pass 3 swaps in our patched copies (libc compatibility, aws-lc-sys, target-lexicon) with [patch.crates-io].
  4. Classify: the first error is read from cargo's JSON diagnostics and build-script output and sorted into classes that each have a different fix.
  5. On target: unit tests of the top passing crates are built with cargo test --no-run and run over ssh on a QNX 8.0 VM built with mkqnximage.
atlas doctor
atlas top --count 500
atlas run --jobs 2 --keep-logs
python patches/prepare.py
atlas compat --libc work/libc-qnx8 --patch aws-lc-sys=work/aws-lc-sys-qnx --patch target-lexicon=work/target-lexicon-qnx
atlas ontarget --limit 40
atlas report