如何通过使用Cargo构建获取汇编输出?

75

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

有没有一种方式可以运行Cargo以编写汇编文件呢?

4个回答

101

您可以使用 Cargo 的 cargo rustc 命令直接向 rustc 发送参数:

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

为了优化汇编代码:

cargo rustc --release -- --emit asm
ls target/release/deps/<crate_name>-<hash>.s

如果您看到多个<crate_name>-<hash>-<hash>.rcgu.s文件而不是一个<crate_name>-<hash>.s文件,请通过设置环境变量CARGO_INCREMENTAL=0来禁用增量编译。


4
有没有一种方法可以更改汇编类型?比如说,我想要ARM而不是x86。 - davidanderle
4
请为“cargo rustc”提供一个ARM目标,例如 cargo rustc --target aarch64-apple-ios --release -- --emit asm。汇编代码将会在 target/aarch64-apple-ios/release/deps/*.s 中。 - kennytm
1
如何获取Intel汇编? - Andru
11
你可以通过运行以下命令获取Intel语法的汇编代码: cargo rustc -- --emit asm -C "llvm-args=-x86-asm-syntax=intel" - sighol
3
对于我的特定项目,添加 --emit asm 参数会使编译时间增加四倍,并且生成的可执行二进制文件大小增加了40%。为什么发出汇编需要这么长时间,为什么输出的二进制文件也会改变? - yume_chan

57

使用 cargo rustcRUSTFLAGS 都是使用标准工具获取汇编代码的最佳方式。如果您经常需要查看汇编代码,可以考虑使用 cargo asm 子命令。安装后使用 cargo install cargo-asm,您可以像这样打印汇编:

cargo build --release
cargo asm my_crate::my_function

不过还有一些需要注意的地方:

  • 不确定函数路径?只需运行cargo asm,它将列出所有您可以检查的符号。
  • 在尝试查看汇编代码之前,您必须先运行cargo build --release,因为cargo asm(显然)只查看已存在的构建工件。
  • 要检查的函数代码必须实际生成。对于通用函数,这意味着必须使用具体类型实例化/单态化该函数。如果在您的箱中没有发生这种情况,则始终可以添加一个在顶层执行您想要检查汇编的所有操作的虚拟函数。

cargo 的输出:错误:没有这个子命令:asm - Sebi2020
3
你安装了cargo-asm吗?安装方法是通过运行命令cargo install cargo-asm - Lukas Kalbertodt
1
现在使用来自 https://crates.io/crates/cargo-show-asm 的 cargo-show-asm。 - Ali

54

除了kennytm的回答之外,您还可以使用RUSTFLAGS环境变量并使用标准的cargo命令:

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 (汇编)

这在Windows上似乎不起作用。 - Hacker

2
如果你只想查看汇编输出而不是保存它,例如为了判断它是否经过良好优化,则一个简单的选择是使用:https://rust.godbolt.org/ (不要忘记在编译器选项框中添加 -O)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接