如何从 Cargo 构建中获取装配输出?

How to get assembly output from building with Cargo?

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

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

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

禁用增量编译

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

现有的两个答案(使用 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(显然)只查看已经存在的构建工件
  • 您要检查的函数的代码必须实际生成。对于泛型函数,这意味着函数必须 instantiated/monomorphized 具有具体类型。如果您的箱子中没有发生这种情况,您总是可以在顶层添加一个虚拟函数来完成您想要检查其组装的所有事情。