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.