Inspiration

A QNX 8 port can compile every source file and still fail at the executable link. An undefined symbol, a wrong-machine object and archive order need different actions. I wanted a developer to hand a colleague a reviewable explanation of one failure, rather than a list of library flags that happened to work.

What it does

QNX Link Proof turns an actual executable-link command into a small evidence package:

  • Replay the baseline with its executable output redirected into a fresh report directory.
  • Inspect real QNX nm definitions/references and readelf architecture information.
  • Propose a bounded library addition or acyclic archive order when the inspected evidence supports it.
  • Require an explicit --verify to execute a candidate, then check the actual qcc result and QNX-targeted ELF.

The developer receives Markdown, JSON and linked raw commands, exit codes, stdout and stderr. A verified link must have the requested machine, executable type, QNX note, QNX interpreter and file SHA256. Before/after hashes check preservation of the original output. Unknown or ambiguous providers stay unresolved; a wrong-machine input is named for rebuilding.

How I built it

I started this original MIT-licensed Python standard-library tool and its codelab on 4 November 2026. The measured route is macOS on Apple silicon, using Docker CLI to drive one existing licensed QNX 8 Linux amd64 SDK container. The tool invokes actual qcc, nm and readelf; it contains no symbol-to-library lookup table and makes no runtime model call.

Archive consumer/provider edges are derived from the current symbols. Candidate searches are bounded and can be restricted to user-selected libraries. Each invocation creates a new report; verification re-reads the current files. The tool does not apply saved decisions to a changing project.

Codex assisted with coding, documentation and review. Separate implementation and review agent roles exercised unfamiliar inputs; this is engineering validation, not external customer adoption.

Challenges and what I learned

A definition is a possible provider, not proof of ABI compatibility. Both shared and static libraries can export the same symbol, so the tool exposes ambiguity instead of silently choosing. Compiler exit 0 also needs binary evidence: a generic ELF label alone does not prove a QNX executable.

The host/container path mapping and archive arguments must preserve spaces. Independent acceptance used new symbols, three archive layers and paths containing spaces, alongside unknown-symbol and wrong-architecture cases. Source files, objects, archives and the original output remained unchanged in those checks.

What works today

The original codelab supplies three complete C sources and commands. It reproduces an actual archive-order link failure, inspects its nm dependency, presents an unexecuted proposal, and explicitly verifies the repair with real qcc. The produced AArch64 DYN ELF has a QNX note and /usr/lib/ldqnx-64.so.2; the original executable's hash is preserved.

The continuous YouTube demonstration shows real CLI invocations and their output in a clearly labelled recording viewer, not a product GUI. Negative examples are explicitly labelled as reads of earlier real runs.

Try it and review the scope

Source and setup · Hands-on codelab · Actual demonstration

Bring your own working QNX 8 SDK container and follow the codelab. The public repository supplies original source and instructions, without SDK, license or compiled binaries.

This version diagnoses explicit executable-link argv for QNX AArch64 and x86-64 variants. It does not import whole projects or handle response files, archive cycles, custom linker scripts, shared-library creation or complete C++ ABI migration. A successful cross-link is not target execution or runtime correctness. All current acceptance cases are synthetic engineering examples; broader real-project validation remains future work.

The concrete value is a complete evidence workflow for one failed link: explain the failure, inspect the proposed change, and verify it before changing the real build.

Built With

Share this project:

Updates

Submission history