Sobre o projeto

Este repositório é um guia abrangente e prático para minimizar o tamanho de binários Rust. Ele reconhece que a otimização padrão do Rust visa velocidade de execução e conveniência de depuração, mas fornece um caminho claro e passo a passo para desenvolvedores que precisam de executáveis menores. O guia começa com técnicas fundamentais que não impactam o comportamento do programa: - Compilar em modo release, o que pode reduzir o tamanho do binário em 30% ou mais em comparação com builds de debug. - Remover automaticamente símbolos de binários usando a configuração `strip = true` do Cargo (disponível desde Rust 1.59), ou executar manualmente `strip` no arquivo ELF para versões mais antigas. - Definir `opt-level = "z"` no `Cargo.toml` para otimizar por tamanho em vez de velocidade, com uma nota de que `"s"` às vezes pode resultar em tamanhos menores e que experimentação é recomendada. - Habilitar Otimização de Tempo de Linkagem (LTO) para permitir que o linker remova código morto e otimize entre unidades de compilação. - Reduzir `codegen-units` para 1 para permitir otimizações mais agressivas ao custo do tempo de compilação. O guia então avança para técnicas mais avançadas que podem alterar o comportamento do programa ou exigir Rust nightly: - Usar `panic = "abort"` para remover código de desenrolamento, e as flags instáveis `-Zlocation-detail=none` e `-Zfmt-debug=none` para remover detalhes de localização e formatação. - Compilar a biblioteca padrão a partir do código-fonte com `build-std`, o que permite otimizar `libstd` para tamanho e remover partes não utilizadas. Isso inclui o recurso `optimize_for_size` e a opção instável `panic=immediate-abort` para eliminar strings de pânico. - Remover `libstd` completamente com `#![no_std]` e `#![no_main]`, usando um ponto de entrada em C e gerenciamento manual de stdio. Isso é descrito como hacky e não portátil, exigindo análise cuidadosa de dependências, mas pode produzir binários tão pequenos quanto programas em C. O guia também cobre: - Usar UPX para comprimir o binário final, com um aviso sobre falsos positivos de antivírus. - Ferramentas para analisar e reduzir o tamanho do binário, como `cargo-bloat`, `momo` e Twiggy para WebAssembly. - Técnicas de redução de tamanho de imagem de contêiner, incluindo a imagem `rust:alpine`, `dive` para explorar imagens e `distroless` para imagens base mínimas. - Links para recursos externos, incluindo posts de blog sobre binários Rust minúsculos, redução de tamanho WASM e o grupo de trabalho de tamanho de binário Rust. - Notas históricas sobre a remoção de jemalloc no Rust 1.32 e como lidar com versões mais antigas. Projetos de exemplo são fornecidos nas pastas `build_std` e `no_std`, e o guia referencia estudos de caso do mundo real, como um pequeno servidor web Rocket e um plugin GStreamer. Ele enfatiza que as técnicas são cumulativas, com cada etapa oferecendo reduções adicionais de tamanho ao custo de complexidade ou portabilidade.