Sobre el proyecto
Este repositorio es una guía completa y práctica para minimizar el tamaño de los binarios de Rust. Reconoce que la optimización predeterminada de Rust se centra en la velocidad de ejecución y la conveniencia de depuración, pero proporciona un camino claro y paso a paso para desarrolladores que necesitan ejecutables más pequeños.
La guía comienza con técnicas fundamentales que no afectan el comportamiento del programa:
- Compilar en modo release, lo que puede reducir el tamaño del binario en un 30% o más en comparación con las compilaciones de depuración.
- Eliminar automáticamente los símbolos de los binarios usando la configuración `strip = true` de Cargo (disponible desde Rust 1.59), o ejecutando manualmente `strip` en el archivo ELF para versiones anteriores.
- Establecer `opt-level = "z"` en `Cargo.toml` para optimizar por tamaño en lugar de velocidad, con una nota de que `"s"` a veces puede producir resultados más pequeños y se recomienda experimentar.
- Habilitar la optimización del tiempo de enlace (LTO) para permitir que el enlazador elimine código muerto y optimice entre unidades de compilación.
- Reducir `codegen-units` a 1 para permitir optimizaciones más agresivas a costa del tiempo de compilación.
Luego, la guía pasa a técnicas más avanzadas que pueden alterar el comportamiento del programa o requerir Rust nocturno:
- Usar `panic = "abort"` para eliminar el código de desenrollado, y las banderas inestables `-Zlocation-detail=none` y `-Zfmt-debug=none` para eliminar detalles de ubicación y formato.
- Construir la biblioteca estándar desde el código fuente con `build-std`, lo que permite optimizar `libstd` por tamaño y eliminar partes no utilizadas. Esto incluye la característica `optimize_for_size` y la opción inestable `panic=immediate-abort` para eliminar cadenas de pánico.
- Eliminar `libstd` por completo con `#![no_std]` y `#![no_main]`, usando un punto de entrada en C y gestión manual de stdio. Esto se describe como hacky y no portátil, requiriendo un análisis cuidadoso de las dependencias, pero puede producir binarios tan pequeños como los programas en C.
La guía también cubre:
- Usar UPX para comprimir el binario final, con una advertencia sobre posibles falsos positivos de antivirus.
- Herramientas para analizar y reducir el tamaño del binario, como `cargo-bloat`, `momo` y Twiggy para WebAssembly.
- Técnicas de reducción del tamaño de imágenes de contenedores, incluyendo la imagen `rust:alpine`, `dive` para explorar imágenes y `distroless` para imágenes base mínimas.
- Enlaces a recursos externos, incluyendo publicaciones de blog sobre binarios pequeños de Rust, reducción de tamaño de WASM y el grupo de trabajo sobre tamaño de binarios de Rust.
- Notas históricas sobre la eliminación de jemalloc en Rust 1.32 y cómo manejar versiones anteriores.
Se proporcionan proyectos de ejemplo en las carpetas `build_std` y `no_std`, y la guía hace referencia a estudios de caso del mundo real, como un pequeño servidor web Rocket y un plugin de GStreamer. Enfatiza que las técnicas son acumulativas, y cada paso ofrece reducciones adicionales de tamaño a costa de complejidad o portabilidad.
Comments
0 Rating appears after 10 ratings
Sign in to join the discussion.