If for some reason you want to see what kind of code the Rust compiler generates,
you can easily do that with the --emit
command line option.
To try it out, create a new project with Cargo, called helloasm
, and change to
the directory:
cargo new helloasm cd helloasm
Then use Cargo to drive the Rust compiler, passing in the necessary flags (separating them
from Cargo's flags with --
):
cargo rustc -- --emit asm
The generated assembly language can be found in target/debug/deps/helloasm.s
.
The syntax is AT&T, so if you would rather have it in Intel x86 assembly syntax, pass a
configuration to LLVM:
cargo rustc -- --emit asm -C "llvm-args=-x86-asm-syntax=intel"
If you're on an Intel machine, but would like to generate ARM executables (and ARM assembly),
first make sure that you have the necessary target(s) installed using rustup show
.
% rustup show Default host: x86_64-apple-darwin rustup home: /Users/me/.rustup installed targets for active toolchain -------------------------------------- x86_64-apple-darwin x86_64-unknown-linux-musl active toolchain ---------------- stable-x86_64-apple-darwin (default) rustc 1.55.0 (c8dfcfe04 2021-09-06)
In this case, the ARM / Apple silicon target is not installed yet. Check out
Platform Support
in The rustc book,
or use rustup target list
to see both available and currently installed targets.
For Apple silicon on macOS you should install the target aarch64-apple-darwin
(Tier 2 with host support at the time of this writing):
% rustup target add aarch64-apple-darwin info: downloading component 'rust-std' for 'aarch64-apple-darwin' info: installing component 'rust-std' for 'aarch64-apple-darwin' 20.2 MiB / 20.2 MiB (100 %) 14.3 MiB/s in 1s ETA: 0s
Now you can compile for Apple silicon and macOS, and emit ARM assembly language, with:
cargo rustc --target aarch64-apple-darwin -- --emit asm
The result can be found in target/aarch64-apple-darwin/debug/deps
.
Use the --release
flag if necessary, and replace debug
in the path
with release
.