虽然我已经看过使用rustc
直接输出汇编的文档,但手动提取由Cargo使用的命令并编辑以编写汇编是很繁琐的。
有没有一种方式可以运行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
来禁用增量编译。
使用 cargo rustc
和 RUSTFLAGS
都是使用标准工具获取汇编代码的最佳方式。如果您经常需要查看汇编代码,可以考虑使用 cargo asm
子命令。安装后使用 cargo install cargo-asm
,您可以像这样打印汇编:
cargo build --release
cargo asm my_crate::my_function
不过还有一些需要注意的地方:
cargo asm
,它将列出所有您可以检查的符号。cargo build --release
,因为cargo asm
(显然)只查看已存在的构建工件。asm
。 - Sebi2020cargo-asm
吗?安装方法是通过运行命令cargo install cargo-asm
。 - Lukas Kalbertodt除了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
(汇编)-O
)。
cargo rustc --target aarch64-apple-ios --release -- --emit asm
。汇编代码将会在target/aarch64-apple-ios/release/deps/*.s
中。 - kennytmcargo rustc -- --emit asm -C "llvm-args=-x86-asm-syntax=intel"
。 - sighol--emit asm
参数会使编译时间增加四倍,并且生成的可执行二进制文件大小增加了40%。为什么发出汇编需要这么长时间,为什么输出的二进制文件也会改变? - yume_chan