Rust - Cross-compiling x86_64 for arm64
Basics
Add the target
rustup target add aarch64-unknown-linux-gnurustup target add aarch64-unknown-linux-gnuMake sure you specify the linker in .cargo/config.toml
[target.aarch64-unknown-linux-gnu]
linker = "aarch64-linux-gnu-gcc"[target.aarch64-unknown-linux-gnu]
linker = "aarch64-linux-gnu-gcc"Build for the specific target
cargo build --target aarch64-unknown-linux-gnucargo build --target aarch64-unknown-linux-gnuChanging compliation targets, for e.g. WASM, use
rustup target add wasm32-unknown-unknownrustup target add wasm32-unknown-unknownNote that there are additional dependencies beyond the Rust toolchain (which provides the Rust standard library), such as a linker.
Cross compiling for any platform with Musl
Even if you can cross-compile, sometimes your run into GLIBC version errors. In these cases, you can either change the machine you're compiling on, install the versions of GLIBC required for your compilation (don't do this please), or compile with musl, which will statically link all required libraries into a standalone executable.
This can either be configured manually, or use one of the incredibly handy rust-musl-cross Docker images. For example,
docker pull messense/rust-musl-cross:aarch64-musl
alias rust-musl-builder='docker run --rm -it -v "$(pwd)":/home/rust/src messense/rust-musl-cross:aarch64-musl'
rust-musl-builder cargo build --releasedocker pull messense/rust-musl-cross:aarch64-musl
alias rust-musl-builder='docker run --rm -it -v "$(pwd)":/home/rust/src messense/rust-musl-cross:aarch64-musl'
rust-musl-builder cargo build --releaseUsing cross-rs
Another alternative is to use cross-rs. Read the docs on this, and try running with a command like
cross build --target aarch64-unknown-linux-gnucross build --target aarch64-unknown-linux-gnu