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

时间:2016-08-30 06:11:04

标签: assembly rust rust-cargo

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

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

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:23)

除了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(大会)

答案 2 :(得分: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(显然)仅查看已存在的构建工件
  • 要检查的功能的代码必须实际生成。对于泛型函数,这意味着该函数必须使用具体类型实例化/单态化。如果在板条箱中没有发生这种情况,则始终可以在顶层添加一个虚拟功能,该功能可以执行您要检查其装配的所有操作。

答案 3 :(得分:-1)

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

https://godbolt.org