web-dev-qa-db-ja.com

Cargoを使用してビルドからアセンブリ出力を取得するにはどうすればよいですか?

rustcを直接使用してアセンブリを出力することに関するドキュメントを見てきましたが、Cargoが使用するコマンドを手動で抽出し、それらを編集してアセンブリを作成するのは面倒です。

アセンブリファイルを書き出すCargoを実行する方法はありますか?

24
ideasman42

カーゴのcargo rustcコマンドを使用して、引数をrustcに直接送信します。

cargo rustc -- --emit asm
ls target/debug/deps/crate_name.s

最適化されたアセンブリの場合:

cargo rustc --release -- --emit asm
ls target/release/deps/crate_name.s
44
kennytm

Kennytmの回答に加えて、RUSTFLAGS環境変数を使用して、標準の貨物コマンドを使用することもできます。

RUSTFLAGS="--emit asm" cargo build
cat target/debug/deps/project_name-hash.s

またはリリースモードで(最適化あり):

RUSTFLAGS="--emit asm" cargo build --release
cat target/release/deps/project_name-hash.s

--emitパラメータにさまざまな値を渡すことができますincludeing(ただし、これらに限定されません):

  • mir(錆の中間表現)
  • llvm-ir(LLVM中間表現)
  • llvm-bc(LLVMバイトコード)
  • asm(アセンブリ)
30

既存の回答(cargo rustcおよびRUSTFLAGSを使用)は両方とも、標準ツールでアセンブリを取得するための最良の方法です。かなり頻繁にアセンブリを確認しようとしていることに気付いた場合は、 the cargo asmサブコマンド の使用を検討してください。 。 cargo install cargo-asmでインストールした後、次のようにアセンブリを印刷できます。

cargo build --release
cargo asm my_crate::my_function

ただし、注意すべき点がいくつかあります。

  • 関数のパスがわからない? cargo asmを実行するだけで、検査できるすべてのシンボルがリストされます。
  • cargo build --releaseは(明らかに)既存のビルドアーティファクトのみを参照するため、アセンブリを確認する前にcargo asmを実行する必要があります。
  • 検査する関数のコードは、実際に生成する必要があります。ジェネリック関数の場合、これは関数が具象型でインスタンス化/モノモーフィングされる必要があることを意味します。それがクレートで発生しない場合は、アセンブリを検査したいすべてのことを行うダミー関数を最上位にいつでも追加できます。
15