如何使用Cargo从建筑物获得装配输出?

ide*_*n42 20 assembly rust rust-cargo

虽然我已经看到rustc直接使用输出程序集的文档,但必须手动提取Cargo使用的命令并编辑它们来编写程序集是很繁琐的.

有没有办法运行编写汇编文件的货物?

ken*_*ytm 38

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

cargo rustc -- --emit asm
ls target/debug/deps/crate_name.s
Run Code Online (Sandbox Code Playgroud)

对于优化装配:

cargo rustc --release -- --emit asm
ls target/release/deps/crate_name.s
Run Code Online (Sandbox Code Playgroud)

  • 您可以使用`cargo rustc---emit asm -C“ llvm-args = -x86-asm-syntax = intel”获取intel语法。 (5认同)
  • 有没有办法改变装配类型?假设我想要 ARM 而不是 x86 (4认同)
  • 对于我的特定项目,添加 `--emit asm` 参数使编译时间增加四倍,并且结果可执行二进制文件增大 40%。为什么发出程序集需要这么多时间以及为什么输出二进制文件也会改变? (3认同)
  • @davidanderle 为`cargo rustc` 提供一个ARM 目标,例如`cargo rustc --target aarch64-apple-ios --release -- --emit asm`。程序集将在 `target/aarch64-apple-ios/release/deps/*.s` 中。 (2认同)

Luk*_*odt 27

除了kennytm的答案,您还可以使用RUSTFLAGS环境变量并使用标准货物命令:

RUSTFLAGS="--emit asm" cargo build
cat target/debug/deps/project_name-hash.s
Run Code Online (Sandbox Code Playgroud)

或者在发布模式下(带优化):

RUSTFLAGS="--emit asm" cargo build --release
cat target/release/deps/project_name-hash.s
Run Code Online (Sandbox Code Playgroud)

您可以将不同的值传递给--emit参数,包括(但不限于):

  • mir (Rust中间表示)
  • llvm-ir (LLVM中间表示)
  • llvm-bc (LLVM字节码)
  • asm (部件)


Luk*_*odt 9

现有的两个答案(使用cargo rustcRUSTFLAGS)都是使用标准工具进行组装的最佳方法。如果你发现自己想要看组装相当频繁,你可能要考虑使用cargo asm子命令。使用安装后cargo install cargo-asm,您可以像下面那样打印程序集:

cargo build --release
cargo asm my_crate::my_function
Run Code Online (Sandbox Code Playgroud)

但是,有几件事要注意:

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

  • @Sebi2020“使用`cargo install Cargo-asm`安装它之后”<-你这样做了吗? (3认同)