assembly 如何从使用Cargo构建中获取装配件输出?

c8ib6hqw  于 2022-11-13  发布在  Go
关注(0)|答案(4)|浏览(371)

虽然我看过直接使用rustc输出汇编的文档,但必须手动提取Cargo使用的命令并编辑它们以编写汇编是乏味的。
是否有一种方法可以运行写出汇编文件的Cargo?

kqqjbcuj

kqqjbcuj1#

您可以使用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来停用累加编译。

ifmq2ha2

ifmq2ha22#

除了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(组件)
ijxebb2r

ijxebb2r3#

现有的两个答案(使用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(显然)只查看已经存在的构建构件
  • 你要检查的函数的代码必须是实际生成的。对于泛型函数来说,这意味着该函数必须用一个具体的类型进行示例化/单态化。如果你的机箱中没有这样的情况,你可以在顶层添加一个伪函数,它可以完成你想要检查的汇编的所有事情。
s4n0splo

s4n0splo4#

如果您只想查看汇编输出而不是保存它,例如判断它是否经过了良好的优化,那么一个简单的选项是用途:
https://rust.godbolt.org/
(don'不要忘记将-O添加到编译器选项框中)

相关问题