mold - Enlazador Moderno de Alto Rendimiento Hoja de Trucos
mold (Modern Linker) es un reemplazo de drop-in para GNU ld, gold y LLVM lld que está diseñado desde el principio para usar todos los núcleos de tu CPU. El enlazamiento es a menudo la cola serializada de una compilación de otro modo paralela — compilas 200 archivos en 16 núcleos, luego esperas en un núcleo para enlazar. mold paraleliza ese paso, frecuentemente reduciendo tiempos de enlace por un orden de magnitud, que es más notable en bucles de edición-compilación-ejecución en codebases grandes de C, C++ y Rust.
Instalación
| Plataforma | Comando |
|---|
| Debian/Ubuntu | sudo apt install mold |
| Fedora | sudo dnf install mold |
| Arch Linux | sudo pacman -S mold |
| macOS (Homebrew) | brew install mold |
| Desde fuente | compilar desde repo rui314/mold |
| Verificar | mold --version |
| Método | Cómo |
|---|
| Wrapper | mold -run cargo build / mold -run make |
| Flag del compilador | -fuse-ld=mold (GCC 12+/Clang) |
| Symlink | Apuntar ld a mold (a nivel de sistema) |
# Lo más fácil: envolver cualquier comando de compilación
mold -run make -j$(nproc)
mold -run cargo build --release
Configuración Rust
# ~/.cargo/config.toml o .cargo/config.toml del proyecto
[target.x86_64-unknown-linux-gnu]
linker = "clang"
rustflags = ["-C", "link-arg=-fuse-ld=mold"]
| Enfoque | Nota |
|---|
link-arg=-fuse-ld=mold | Estándar, requiere clang o GCC 12+ |
mold -run cargo build | No necesita cambios de configuración |
| Sección por-target | Mantiene otras plataformas sin afectar |
Configuración C/C++
# Flag del compilador directo
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
Verificar que se Usó mold
# Verificar el enlazador grabado en la sección de comentario del binario
readelf -p .comment ./my-binary | grep -i mold
# O ejecutar con estadísticas de mold
mold -run cargo build 2>&1 | tail
Opciones Útiles
| Opción | Efecto |
|---|
--threads=N | Limitar hilos de worker |
-run CMD | Envolver un comando de compilación |
--perf | Imprimir desglose de rendimiento |
--stats | Emitir estadísticas de enlace |
--gc-sections | Remover secciones no usadas |
--icf=all | Plegado de código idéntico (binarios más pequeños) |
# Ver a dónde va el tiempo de enlace
mold --perf -run cargo build --release
Cuándo mold Ayuda Más
| Situación | Beneficio |
|---|
| Binarios grandes con muchos objetos | Mayores ahorros absolutos |
| Reconstrucciones incrementales frecuentes | Mayor ganancia de calidad de vida |
| Compilaciones debug (tablas de símbolos grandes) | Muy notable |
| Muchos núcleos de CPU disponibles | Escala con núcleos |
| Proyectos minúsculos | Marginal — enlazamiento ya era rápido |
| Nota | Detalle |
|---|
| Licencia | MIT (versiones modernas) |
| Linux | Completamente soportado, objetivo principal |
| macOS | Soportado; el enlazador propio de Apple también mejoró |
| Windows | No el objetivo principal |
mold vs Otros Enlazadores
| Enlazador | Velocidad relativa | Nota |
|---|
| GNU ld | Línea base (más lento) | Predeterminado en muchos sistemas |
| gold | Más rápido que ld | Mayormente supersedido |
| lld (LLVM) | Mucho más rápido | Buen predeterminado, bien soportado |
| mold | Más rápido | Mejor para enlaces paralelos grandes |
Se combina bien con sccache para la victoria completa: sccache evita recompilar, mold acelera el enlace que queda.
Recursos