pg83/solo

Portable Linux binaries, solved

What it solves

SoLo allows fully static Linux binaries (built with musl) to load and use glibc-linked shared objects (like GPU drivers) at runtime. This eliminates the need for containers, AppImages, or shipping a second C library within the process, allowing developers to ship a single executable that remains portable while still accessing hardware-specific drivers installed on the host system.

How it works

SoLo implements its own ELF loader for x86-64 and aarch64 and provides a glibc ABI bridge. Instead of loading glibc itself, it maps ELF segments, resolves versioned symbols, and translates glibc imports into ABI-correct adapters that run on top of the existing musl runtime. It handles complex low-level details like TLS (Thread Local Storage) models, C++ exceptions, and lazy PLT binding to ensure that foreign code behaves correctly without needing a system loader.

Who it’s for

Developers building static Linux binaries who need to access GPU acceleration (Vulkan, OpenGL) or other system-shared libraries without sacrificing the portability of a single-file deployment.

Highlights

  • Single Binary Deployment: Ship one musl-linked executable that can load host GPU drivers at runtime.
  • glibc ABI Bridge: Translates glibc calls to musl without loading a second libc into the process.
  • Comprehensive TLS Support: Supports all four TLS models (including initial-exec) using a dedicated surplus arena in the static TLS.
  • Cross-World Compatibility: Enables C++ exceptions to unwind across the boundary between static and glibc-compiled frames.
  • Broad Hardware Testing: Verified on AMD, Intel, NVIDIA GPUs, Apple M1 (Asahi Linux), Android (Termux), and WSL.
  • High Conformance: CI tests the loading of over 2,100 shared objects from the top 1,000 most-installed Debian packages.

Related

  • Project
  • Project
  • Project
  • Project
  • Project