Hmbown/CodeWhale · error

{}

Error message

{}

What it means

Thrown before applying an update when the host system's glibc version is older than the minimum the release binary requires. detect_host_glibc() reads the host's glibc version; if it cannot detect one or it is below `required`, the updater aborts with a human-readable compatibility message naming the asset, required version, and detected version.

Solutions

  1. Read the message for required vs detected glibc and upgrade the OS/distro to one with sufficient glibc.
  2. Use a build of the CLI targeting older glibc or a musl/static build if available.
  3. Run via a newer container image instead of upgrading the host.
  4. Compile the CLI from source against the local toolchain.
Defensive patterns

Strategy: validation

Validate before calling

// Before updating, compare host glibc to the release's requirement
let required = GlibcVersion { major: 2, minor: 31 };
if let Some(host) = detect_host_glibc() {
    if host < required {
        eprintln!("host glibc {:?} < required {:?}; use a musl/static build or upgrade the OS", host, required);
    }
} else {
    eprintln!("glibc not detected (musl?); choose a matching build");
}

Prevention

When it happens

Trigger: Running self-update on a Linux system whose glibc (detected via ldd or similar) is below the version required by the staged release asset, or where glibc detection returned None.

Common situations: Older LTS distributions (e.g. CentOS 7, Ubuntu 18.04) trying to install a binary built against a newer glibc; musl-based systems (Alpine) where glibc detection fails.

Understand the failure class

Background: "unsupported platform" / "not supported on this platform" errors: what they mean and how to fix them — this error's family across 47 libraries.

Related errors


AI-assisted analysis of Hmbown/CodeWhale@73e0f67d83 (2026-09-22). Data as JSON: /api/errors/d36683f9707e984f. Report an issue: GitHub.

Appendix: source

Thrown at crates/cli/src/update.rs:1728

}

fn preflight_downloaded_binary(asset_name: &str, bytes: &[u8]) -> Result<()> {
    // GNU libc preflight is Linux-only (#4241). Rust treats `target_os = "android"`
    // as distinct from `"linux"`, so Termux/Android builds skip this check entirely
    // — Android uses Bionic libc, not glibc.
    if !cfg!(target_os = "linux") || glibc_check_disabled() {
        return Ok(());
    }

    let Some(required) = highest_required_glibc(bytes) else {
        return Ok(());
    };
    let host = detect_host_glibc();
    if host.is_some_and(|host| host >= required) {
        return Ok(());
    }

    bail!(
        "{}",
        glibc_compatibility_message(asset_name, required, host)
    );
}

fn detect_host_glibc() -> Option<GlibcVersion> {
    let getconf = std::process::Command::new("getconf")
        .arg("GNU_LIBC_VERSION")
        .output()
        .ok()
        .filter(|output| output.status.success())
        .and_then(|output| String::from_utf8(output.stdout).ok())
        .and_then(|output| parse_glibc_version(&output));
    if getconf.is_some() {
        return getconf;
    }

    std::process::Command::new("ldd")

View on GitHub (pinned to 73e0f67d83)