虽然我看过直接使用rustc输出汇编的文档,但必须手动提取Cargo使用的命令并编辑它们以编写汇编是乏味的。是否有一种方法可以运行写出汇编文件的Cargo?
rustc
kqqjbcuj1#
您可以使用Cargo的cargo rustc命令直接向rustc发送参数:
cargo 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来停用累加编译。
<crate_name>-<hash>-<hash>.rcgu.s
<crate_name>-<hash>.s
CARGO_INCREMENTAL=0
ifmq2ha22#
除了kennytm的答案之外,还可以使用RUSTFLAGS环境变量和标准的cargo命令:
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参数,* 包括 *(但不限于):
--emit
mir
llvm-ir
llvm-bc
asm
ijxebb2r3#
现有的两个答案(使用cargo rustc和RUSTFLAGS)都是使用标准工具获得汇编的最佳方法。如果您发现自己经常尝试查看汇编,您可能需要考虑使用the cargo asm subcommand。在使用cargo install cargo-asm安装它之后,您可以打印如下汇编:
cargo asm
cargo install cargo-asm
cargo build --release cargo asm my_crate::my_function
不过,有几件事需要注意:
cargo build --release
s4n0splo4#
如果您只想查看汇编输出而不是保存它,例如判断它是否经过了良好的优化,那么一个简单的选项是用途:https://rust.godbolt.org/(don'不要忘记将-O添加到编译器选项框中)
-O
4条答案
按热度按时间kqqjbcuj1#
您可以使用Cargo的
cargo rustc
命令直接向rustc
发送参数:对于优化的装配:
如果您看到多个
<crate_name>-<hash>-<hash>.rcgu.s
档案,而不是一个<crate_name>-<hash>.s
档案,请设定环境变量CARGO_INCREMENTAL=0
来停用累加编译。ifmq2ha22#
除了kennytm的答案之外,还可以使用
RUSTFLAGS
环境变量和标准的cargo命令:或者在发布模式下(经过优化):
您可以将不同的值传递给
--emit
参数,* 包括 *(但不限于):mir
( rust 中间表现法)llvm-ir
(LLVM中间表示法)llvm-bc
(LLVM字节码)asm
(组件)ijxebb2r3#
现有的两个答案(使用
cargo rustc
和RUSTFLAGS
)都是使用标准工具获得汇编的最佳方法。如果您发现自己经常尝试查看汇编,您可能需要考虑使用thecargo asm
subcommand。在使用cargo install cargo-asm
安装它之后,您可以打印如下汇编:不过,有几件事需要注意:
cargo asm
,它就会列出所有可以检查的符号。cargo build --release
,因为cargo asm
(显然)只查看已经存在的构建构件s4n0splo4#
如果您只想查看汇编输出而不是保存它,例如判断它是否经过了良好的优化,那么一个简单的选项是用途:
https://rust.godbolt.org/
(don'不要忘记将
-O
添加到编译器选项框中)