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
- Use bootstrap_command with the official install script so the remote gets an artifact built for its own platform, not your local binary
- Set mise_bin to a binary built against an old glibc (manylinux-style toolchain) or a musl static-ish build
- 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
- Build once against the oldest glibc in your fleet (manylinux-style) or ship musl builds
- Prefer bootstrap_command (remote-side install) over uploading workstation builds to old LTS hosts
- Track the fleet's minimum glibc version; fail CI uploads that exceed it
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
- remote host '{}' libc {remote_libc:?} is incompatible with l
- remote Linux libc family could not be identified
- remote host '{}' does not provide the dynamic loader require
- automatic cross-platform provisioning is unavailable from a
- automatic cross-platform provisioning refuses to replace a c
AI-assisted analysis of jdx/mise@6f52dcdf99 (2026-08-22).
Data as JSON: /api/errors/e3a2891684a83bf3.
Report an issue: GitHub.