mold - Linker de Alto Desempenho Moderno
mold (Modern Linker) é uma substituição drop-in para GNU ld, gold, e LLVM lld que é projetada do zero para usar todos seus núcleos de CPU. Linkagem é frequentemente a cauda serializada de uma compilação de outro modo paralela — você compila 200 arquivos em 16 núcleos, depois espera em um núcleo para linkar. mold paraleliza esse passo, frequentemente reduzindo tempos de ligação por uma ordem de magnitude, que é mais notável em loops de edição-compilação-execução em grandes codebases C, C++, e Rust.
Instalação
| Plataforma | Comando |
|---|
| Debian/Ubuntu | sudo apt install mold |
| Fedora | sudo dnf install mold |
| Arch Linux | sudo pacman -S mold |
| macOS (Homebrew) | brew install mold |
| Do source | construir do repo rui314/mold |
| Verificar | mold --version |
Usando mold (três jeitos)
| Método | Como |
|---|
| Wrapper | mold -run cargo build / mold -run make |
| Flag de compilador | -fuse-ld=mold (GCC 12+/Clang) |
| Symlink | Apontar ld para mold (system-wide) |
# Mais fácil: encapsular qualquer comando de compilação
mold -run make -j$(nproc)
mold -run cargo build --release
Configuração de Rust
# ~/.cargo/config.toml ou .cargo/config.toml do projeto
[target.x86_64-unknown-linux-gnu]
linker = "clang"
rustflags = ["-C", "link-arg=-fuse-ld=mold"]
| Abordagem | Nota |
|---|
link-arg=-fuse-ld=mold | Padrão, requer clang ou GCC 12+ |
mold -run cargo build | Sem mudanças de config necessárias |
| Seção por-target | Mantém outras plataformas não afetadas |
Configuração de C/C++
# Flag de compilador direto
gcc -fuse-ld=mold main.c -o main
clang++ -fuse-ld=mold app.cpp -o app
# CMake
cmake -DCMAKE_EXE_LINKER_FLAGS="-fuse-ld=mold" ..
# Makefile
LDFLAGS += -fuse-ld=mold
Verificando se mold Foi Usado
# Verificar o linker registrado na seção de comentário do binário
readelf -p .comment ./my-binary | grep -i mold
# Ou executar com stats de mold
mold -run cargo build 2>&1 | tail
Opções Úteis
| Opção | Efeito |
|---|
--threads=N | Limitar threads de worker |
-run CMD | Encapsular um comando de compilação |
--perf | Imprimir desempenho breakdown |
--stats | Emitir estatísticas de ligação |
--gc-sections | Remover seções não usadas |
--icf=all | Folding de código idêntico (binários menores) |
# Ver onde o tempo de ligação vai
mold --perf -run cargo build --release
Quando mold Ajuda Mais
| Situação | Benefício |
|---|
| Binários grandes com muitos objetos | Poupança absoluta maior |
| Rebuilds incrementais frequentes | Maior ganho de qualidade de vida |
| Debug builds (grandes tabelas de símbolos) | Muito notável |
| Muitos núcleos de CPU disponíveis | Escala com núcleos |
| Projetos minúsculos | Marginal — ligação já era rápida |
| Nota | Detalhe |
|---|
| Licença | MIT (versões modernas) |
| Linux | Totalmente suportado, alvo primário |
| macOS | Suportado; linker próprio de Apple também melhorou |
| Windows | Não é o alvo primário |
mold vs Outros Linkers
| Linker | Velocidade relativa | Nota |
|---|
| GNU ld | Baseline (mais lento) | Padrão em muitos sistemas |
| gold | Mais rápido que ld | Amplamente substituído |
| lld (LLVM) | Muito mais rápido | Bom padrão, bem suportado |
| mold | Mais rápido | Melhor para grandes linkagens paralelas |
Combine com sccache para a vitória completa: sccache corta tempo de compilação, mold corta tempo de ligação.
Recursos