jdx/mise · error
no dynamic linker found for {} — Homebrew bottles require gl
Error message
no dynamic linker found for {} — Homebrew bottles require glibc (musl-based distros are unsupported) What it means
On Linux, Homebrew bottles are built against glibc and need a dynamic loader (ld-linux-*) plus a working loader environment. setup_linux_runtime probes known loader paths; if none exists it bails, because bottle binaries could not run on the host (e.g. a musl-based distro like Alpine).
Source
Thrown at src/system/packages/brew/prefix.rs:115
return Ok(());
}
if ld.exists() {
return Ok(()); // valid symlink or file already in place
}
if ld.symlink_metadata().is_ok() {
crate::file::remove_file(&ld)?; // dangling symlink
}
let host_loader = [
"/lib64/ld-linux-x86-64.so.2",
"/lib/ld-linux-aarch64.so.1",
"/lib64/ld-linux-aarch64.so.1",
]
.iter()
.map(Path::new)
.find(|p| p.exists())
.map(Path::to_path_buf);
let Some(target) = host_loader else {
bail!(
"no dynamic linker found for {} — Homebrew bottles require glibc (musl-based \
distros are unsupported)",
ld.display()
);
};
crate::file::make_symlink(&target, &ld)?;
Ok(())
}
fn writable(path: &Path) -> bool {
// root can write regardless of owner — and `sudo mise` must never treat
// a user-owned prefix as broken and chown it to root
if nix::unistd::geteuid().is_root() {
return path.exists();
}
!matches!(
path.metadata()
.map(|m| std::os::unix::fs::MetadataExt::uid(&m)),View on GitHub (pinned to afd2eddd3a)
Solutions
- Use a glibc-based distro (Debian/Ubuntu/RHEL) or a glibc container image
- On Alpine, install gcompat or use a non-brew backend for the tools
- Pick an alternate backend (aqua, github, cargo) for these packages on musl
Example fix
# before (Dockerfile) FROM alpine:3.20 # after FROM debian:bookworm-slim
Defensive patterns
Strategy: fallback
Validate before calling
const loader = ['/lib64/ld-linux-x86-64.so.2','/lib/ld-linux-aarch64.so.1'].find(p => fs.existsSync(p));
if (!loader) console.error('glibc loader missing — brew bottles unsupported here'); Type guard
const hasGlibc = () => fs.existsSync('/lib64/ld-linux-x86-64.so.2') || fs.existsSync('/lib/ld-linux-aarch64.so.1'); Prevention
- Use glibc-based distros/containers for brew backends
- On Alpine, plan for gcompat or alternate backends
- Document platform requirements in CI image choices
When it happens
Trigger: Installing brew packages on a Linux host where none of the probed glibc loader paths exist — musl-based distros (Alpine), minimal containers without glibc, or a stripped rootfs.
Common situations: Using mise's brew bootstrap inside an Alpine Docker image; a minimal CI runner lacking glibc; chroots without ld-linux installed.
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
- remote host '{}' libc {remote_libc:?} is incompatible with l
- per-host network filtering (--allow-net=<host>) is not suppo
- precompiled erlang is not supported on musl linux
- swift does not publish musl builds
- per-host network filtering (--allow-net=<host>) is not suppo
AI-assisted analysis of jdx/mise@afd2eddd3a (2026-09-09).
Data as JSON: /api/errors/f4e9306e7b66eefd.
Report an issue: GitHub.