jdx/mise · error · eyre::Report

remote host '{}' provides {remote_libc:?} {available}, but l

Error message

remote host '{}' provides {remote_libc:?} {available}, but local mise requires {remote_libc:?} {required}; set mise_bin, remote_mise, or bootstrap_command

What it means

Thrown by validate_default_binary_compatibility when the remote loader exists and matches the local libc family, but its version is older than what the local mise binary requires. The required glibc is computed by scanning the binary for the highest GLIBC_x.y symbol-version reference (max_required_glibc_version); for musl the local loader's runtime version is used. This is the preflight equivalent of the classic "version GLIBC_2.38 not found" crash, caught before upload.

Source

Thrown at src/system/remote.rs:1283

        LibcFlavor::Musl => parse_musl_runtime_version(&combined_output(&local_output))
            .ok_or_else(|| {
                eyre!(
                    "could not determine the musl version used by local mise loader {interpreter}; set mise_bin, remote_mise, or bootstrap_command"
                )
            })?,
    };
    let available = match remote_libc {
        LibcFlavor::Glibc => parse_glibc_runtime_version(&remote_output),
        LibcFlavor::Musl => parse_musl_runtime_version(&remote_output),
    }
    .ok_or_else(|| {
        eyre!(
            "could not determine the {remote_libc:?} version provided by remote loader {interpreter} on '{}'; set mise_bin, remote_mise, or bootstrap_command",
            session.host.name
        )
    })?;
    if available < required {
        bail!(
            "remote host '{}' provides {remote_libc:?} {available}, but local mise requires {remote_libc:?} {required}; set mise_bin, remote_mise, or bootstrap_command",
            session.host.name
        );
    }
    Ok(())
}

fn max_required_glibc_version(bytes: &[u8]) -> Option<AbiVersion> {
    const PREFIX: &[u8] = b"GLIBC_";
    bytes
        .windows(PREFIX.len())
        .enumerate()
        .filter_map(|(offset, window)| {
            (window == PREFIX)
                .then(|| parse_abi_version(&bytes[offset + PREFIX.len()..]))
                .flatten()
        })
        .max()

View on GitHub (pinned to 6f52dcdf99)

Solutions

  1. Use bootstrap_command with the official install script so the remote gets an artifact built for its own platform, not your local binary
  2. Set mise_bin to a binary built against an old glibc (manylinux-style toolchain) or a musl static-ish build
  3. Upgrade the remote's libc/distro so its loader meets the required version

Example fix

# before (mise.toml)
[bootstrap.remote.hosts.legacy]
host = "root@centos7"
mise_bin = "./mise-built-on-ubuntu-24"  # needs GLIBC_2.38, remote has 2.17

# after
[bootstrap.remote.hosts.legacy]
host = "root@centos7"
bootstrap_command = "curl -fsSL https://mise.run | sh"
Defensive patterns

Strategy: fallback

Validate before calling

# Compute the binary's max GLIBC requirement and compare with the remote loader:
REQ=$(readelf -V ./mise 2>/dev/null | grep -o 'GLIBC_[0-9.]*' | sort -V | tail -1)
REM=$(ssh root@centos7 '/lib64/ld-linux-x86-64.so.2 --version' | grep -o '[0-9]\+\.[0-9]\+$' | head -1)
[ "$(printf '%s\n' "$REM" "$REQ" | sort -V | tail -1)" = "$REM" ] \
  && echo "glibc ok" || echo "remote too old ($REM < $REQ): use bootstrap_command or musl build"

Type guard

fn remote_libc_new_enough(required: &AbiVersion, remote_loader_output: &str) -> bool {
    parse_glibc_runtime_version(remote_loader_output)
        .is_some_and(|available| available >= *required)
}

Try / catch

match validate_default_binary_compatibility(&session, &binary, "linux").await {
    Err(e) if e.to_string().contains("but local mise requires") => {
        resolver.resolve(&platform, &binary).await?; // download artifact matched to remote
    }
    other => other?,
}

Prevention

When it happens

Trigger: Building/uploading mise from a new distro (Ubuntu 24.04, Fedora 40) to an old remote (CentOS 7, Ubuntu 16.04/18.04, RHEL 7) whose glibc predates the binary's newest referenced symbol; old musl on embedded remotes.

Common situations: Enterprise fleets pinned to old LTS releases; IoT gateways with vendor-old toolchains; developer workstations far newer than production images.

Related errors


AI-assisted analysis of jdx/mise@6f52dcdf99 (2026-08-22). Data as JSON: /api/errors/e3a2891684a83bf3. Report an issue: GitHub.