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.
Comments
0 Rating appears after 10 ratings
Sign in to join the discussion.