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

  1. Use a glibc-based distro (Debian/Ubuntu/RHEL) or a glibc container image
  2. On Alpine, install gcompat or use a non-brew backend for the tools
  3. 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

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


AI-assisted analysis of jdx/mise@afd2eddd3a (2026-09-09). Data as JSON: /api/errors/f4e9306e7b66eefd. Report an issue: GitHub.