このプロジェクトについて
このリポジトリは、Rustバイナリのサイズを最小化するための包括的で実践的なガイドです。Rustのデフォルトの最適化が実行速度とデバッグの利便性を優先することを認めつつ、より小さな実行ファイルを必要とする開発者向けに、明確で段階的な道筋を提供します。
ガイドは、プログラムの動作に影響を与えない基本的なテクニックから始まります。
- リリースモードでのビルド。デバッグビルドと比較してバイナリサイズを30%以上削減できます。
- Cargoの`strip = true`設定(Rust 1.59以降で利用可能)を使用したバイナリからのシンボルの自動除去、または古いバージョンではELFファイルに対して手動で`strip`を実行。
- `Cargo.toml`で`opt-level = "z"`を設定し、速度ではなくサイズに最適化。`"s"`の方が小さくなる場合もあるため、実験が推奨されるという注記付き。
- リンク時最適化(LTO)を有効にし、リンカがデッドコードを除去し、コンパイル単位間で最適化できるようにする。
- `codegen-units`を1に減らし、コンパイル時間を犠牲にしてより積極的な最適化を可能にする。
次に、ガイドはプログラムの動作を変更したり、nightly Rustを必要としたりする、より高度なテクニックに移ります。
- `panic = "abort"`を使用して巻き戻しコードを除去し、不安定な`-Zlocation-detail=none`および`-Zfmt-debug=none`フラグで位置情報とフォーマット詳細を削除。
- `build-std`を使用して標準ライブラリをソースからビルドし、`libstd`をサイズに最適化して不要な部分を除去。これには`optimize_for_size`機能と、パニック文字列を排除するための不安定な`panic=immediate-abort`オプションが含まれます。
- `#![no_std]`と`#![no_main]`で`libstd`を完全に除去し、Cエントリポイントと手動のstdio管理を使用。これはハッキーで移植性がなく、依存関係の慎重な分析が必要と説明されていますが、Cプログラムと同じくらい小さなバイナリを生成できます。
ガイドはまた以下もカバーしています。
- UPXを使用した最終バイナリの圧縮。アンチウイルスの誤検出の可能性についての警告付き。
- `cargo-bloat`、`momo`、WebAssembly用のTwiggyなど、バイナリサイズの分析と削減のためのツール。
- `rust:alpine`イメージ、イメージ探索用の`dive`、最小限のベースイメージ用の`distroless`など、コンテナイメージサイズ削減テクニック。
- 小さなRustバイナリ、WASMサイズ削減、Rustバイナリサイズワーキンググループに関するブログ記事など、外部リソースへのリンク。
- Rust 1.32でのjemalloc削除に関する歴史的な注記と、古いバージョンの扱い方。
`build_std`および`no_std`フォルダにサンプルプロジェクトが提供されており、ガイドは小さなRocketウェブサーバーやGStreamerプラグインなどの実際のケーススタディを参照しています。テクニックは累積的であり、各ステップで複雑さや移植性を犠牲にして追加のサイズ削減が得られることを強調しています。
Comments
0 Rating appears after 10 ratings
Sign in to join the discussion.