
Kakehashi: camada de tradução roda apps macOS ARM64 em Linux aarch64
O que é Kakehashi
Kakehashi é uma camada de tradução em userspace que permite executar binários macOS ARM64 (Mach-O) em Linux aarch64, sem JIT. O projeto carrega executáveis Darwin no Linux, mapeia uma libSystem freestanding, traduz syscalls BSD e já roda programas reais como 7-Zip (7zz), curl e probes compilados com clang.
Como funciona
O código do convidado roda nativamente na CPU - não é um emulador de instruções. O custo vem da fronteira de syscall (troca de TLS, alt stack, save/restore de NEON, dispatch em Rust). Em benchmarks com compressão multi-arquivo (~8 mil arquivos, ~240 MiB), a relação ficou em ~×5,2 comparado ao 7zz nativo Linux. Em workloads com poucos arquivos e muita compressão, a diferença cai para ~×1,1–1,2.
Casos de uso validados
- 7-Zip (7zz): criação, listagem, extração e compressão multi-thread (-mmt=4) funcionando.
- curl: HTTP GET, HTTPS com OpenSSL e CA bundle, saída para arquivo ou stdout. POST bodies, proxies e HTTP/3 ainda não estão completos.
- Clang probes e fixtures: testes de carga e execução básica.
- Próximo alvo: git via
kh install xcode-tools.
Proposta de valor para CI
O argumento central não é "tão rápido quanto macOS nativo", mas sim rodar ferramentas CLI Darwin em runners Linux aarch64 baratos em vez de capacidade macOS cara e escassa. Nos preços do GitHub Actions, um minuto de runner macOS custa ~10–12× mais que Linux arm64. Mesmo com o overhead de ~×5, o custo faturado pode ser menor (exemplo ilustrativo: 5 × $0,005 ≈ $0,025 vs 1 × $0,062).
Quando macOS ainda vence: GUI, codesign/notarização, testes de UI do Xcode ou qualquer workload que não seja um binário CLI Darwin puro sob libSystem freestanding.
Arquitetura
| Crate | Papel |
|---|---|
| kakehashi | Binário kh (CLI) |
| kh-loader | Parse, mapeamento e execução de Mach-O |
| kh-runtime | Memória, traps, syscalls BSD, bottle; embute libSystem.B.dylib |
| kh-libsystem | Fonte da dylib (compilado apenas para aarch64-apple-darwin) |
A libSystem é embutida via include_bytes! no runtime - o usuário final não precisa de download separado.
Requisitos e instalação
- Rust 1.88+, Linux aarch64 para execução ao vivo.
- Suporte a páginas de 4 KiB (containers) e 16 KiB (Asahi-class).
- Instalação:
cargo install kakehashi, depoiskh bottle ensureekh install 7zip/kh install curl.
Limitações atuais
Não suporta curl completo (POST, proxies, HTTP/3), Apple Security.framework real, git/CLT completo, GUI, codesign. O projeto é licenciado sob Apache 2.0 e não é derivado do Darling.