如何使用Cargo从建筑物获得装配输出?

问题描述 投票:15回答:4

虽然我已经看过直接使用rustc输出汇编的文档,但是必须手动提取Cargo使用的命令并编辑它们来编写汇编是很繁琐的。

有没有办法运行编写汇编文件的货物?

assembly rust rust-cargo
4个回答
31
投票

您可以使用Cargo的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

24
投票

除了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参数,包括(但不限于):

  • mir(Rust中间表示)
  • llvm-ir(LLVM中间代表)
  • llvm-bc(LLVM字节码)
  • asm(集会)

4
投票

现有的答案(使用cargo rustcRUSTFLAGS)都是使用标准工具获得装配的最佳方法。如果您发现自己经常尝试查看程序集,可能需要考虑使用the cargo asm subcommand。使用cargo install cargo-asm安装后,您可以打印如下组件:

cargo build --release
cargo asm my_crate::my_function

但有几点需要注意:

  • 不确定你的功能的路径?只需运行cargo asm,它将列出您可以检查的所有符号。
  • 在尝试查看程序集之前你必须使用cargo build --release,因为cargo asm(显然)只查看已经存在的构建工件
  • 必须实际生成要检查的函数的代码。对于泛型函数,这意味着必须使用具体类型对函数进行实例化/单态化。如果您的箱子中没有发生这种情况,您可以随时在顶层添加一个虚拟功能,以执行您要检查装配的所有内容。

-1
投票
[build]
rustflags = ["--emit", "asm", "-Cllvm-args=--x86-asm-syntax=intel"]

来自https://godbolt.org

© www.soinside.com 2019 - 2024. All rights reserved.