Rust の実行ファイルはなぜこんなに大きいのでしょうか? 質問する

Rust の実行ファイルはなぜこんなに大きいのでしょうか? 質問する

ドキュメントの最初の 2 章で言語を定義する方法とアプローチが特に興味深いと思いました。そこで、実際に手を動かして「Hello, world!」から始めることにしました。

ちなみに、私は Windows 7 x64 でそうしました。

fn main() {
    println!("Hello, world!");
}

発行してcargo build結果を見ると、targets\debug結果は.exe3MB であることがわかりました。少し検索した後 (cargo コマンドライン フラグのドキュメントは見つけにくいです...)、--releaseオプションを見つけてリリース ビルドを作成しました。驚いたことに、.exe のサイズは 3MB ではなく 2.99MB と、わずかな量しか小さくなっていませんでした。

システムプログラミング言語はコンパクトなものを生み出すだろうと私は期待していました。

Rust が何にコンパイルされているのか、3 行のプログラムからこのような巨大なイメージが生成される仕組みについて、詳しく説明していただけますか? 仮想マシンにコンパイルされていますか? 見逃した strip コマンド (リリース ビルド内のデバッグ情報) はありますか? 他に、何が起こっているかを理解できるものはありますか?

ベストアンサー1

デフォルトでは、Rust コンパイラは、最小のバイナリ サイズではなく、実行速度、コンパイル速度、デバッグの容易さ (たとえば、シンボルを含めることによる) を最適化します。

Rustバイナリのサイズを縮小する方法の概要については、私のmin-sized-rustGitHub リポジトリ。

バイナリ サイズを削減するための現在の高レベルの手順は次のとおりです。

  1. Rust 1.32.0以降を使用してください(jemallocデフォルトでは含まれていません)
  2. 以下を追加Cargo.toml:
[profile.release]
opt-level = 'z'     # Optimize for size
lto = true          # Enable link-time optimization
codegen-units = 1   # Reduce number of codegen units to increase optimizations
panic = 'abort'     # Abort on panic
strip = true        # Strip symbols from binary*

* strip = trueRust 1.59以上が必要です。古いバージョンのRustでは、strip結果のバイナリを手動で変更します。

  1. リリースモードでビルドするにはcargo build --release

Rustでできることは他にもたくさんありますnightlyが、その情報はmin-sized-rust不安定な機能の使用により時間の経過とともに変化するためです。

#![no_std]Rustの を削除するのにも使えますlibstdmin-sized-rust詳細については。

おすすめ記事