Reproducible cross-compilation for Rust (with Docker)
source link: https://kerkour.com/blog/rust-reproducible-cross-compilation-with-docker/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
Reproducible cross-compilation for Rust (with Docker)
Mon, Sep 27, 2021
Error: Toolcahin / Library XX not found. Aborting compilation.
How many times did you get this kind of message when trying to follow the build instructions of a project, or cross compile it?
This problem can be solved with immutable toolchains and reproductible build environements. All of that powered by Docker.
Cross-compile a Rust application from Linux to Windows
Dockerfile.windows
FROM rust:latest
RUN apt update && apt upgrade -y
RUN apt install -y g++-mingw-w64-x86-64
RUN rustup target add x86_64-pc-windows-gnu
RUN rustup toolchain install stable-x86_64-pc-windows-gnu
WORKDIR /app
CMD ["cargo", "build", "--target", "x86_64-pc-windows-gnu"]
$ docker build . -t rust_cross_compile/windows -f Dockerfile.windows
# in your Rust project
$ docker run --rm -ti -v `pwd`:/app rust_cross_compile/windows
Cross-compile a Rust application to aarch64 (armv8)
Dockerfile.aarch64
FROM rust:latest
RUN apt update && apt upgrade -y
RUN apt install -y g++-aarch64-linux-gnu libc6-dev-arm64-cross
RUN rustup target add aarch64-unknown-linux-gnu
RUN rustup toolchain install stable-aarch64-unknown-linux-gnu
WORKDIR /app
ENV CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER=aarch64-linux-gnu-gcc \
CC_aarch64_unknown_linux_gnu=aarch64-linux-gnu-gcc \
CXX_aarch64_unknown_linux_gnu=aarch64-linux-gnu-g++
CMD ["cargo", "build", "--target", "aarch64-unknown-linux-gnu"]
$ docker build . -t rust_cross_compile/aarch64 -f Dockerfile.aarch64
# in your Rust project
$ docker run --rm -ti -v `pwd`:/app rust_cross_compile/aarch64
Cross-compile a Rust application to armv7
Dockerfile.armv7
FROM rust:latest
RUN apt update && apt upgrade -y
RUN apt install -y g++-arm-linux-gnueabihf libc6-dev-armhf-cross
RUN rustup target add armv7-unknown-linux-gnueabihf
RUN rustup toolchain install stable-armv7-unknown-linux-gnueabihf
WORKDIR /app
ENV CARGO_TARGET_ARMV7_UNKNOWN_LINUX_GNUEABIHF_LINKER=arm-linux-gnueabihf-gcc \
CC_armv7_unknown_linux_gnueabihf=arm-linux-gnueabihf-gcc \
CXX_armv7_unknown_linux_gnueabihf=arm-linux-gnueabihf-g++
CMD ["cargo", "build", "--target", "armv7-unknown-linux-gnueabihf"]
$ docker build . -t rust_cross_compile/armv7 -f Dockerfile.armv7
# in your Rust project
$ docker run --rm -ti -v `pwd`:/app rust_cross_compile/armv7
Cross
Now, enough for the theory. In practice, you should use cross, a project developed and maintained by the Tools team which allow you to easily cross-compile Rust projects without messing with custom Dockerfiles.
$ cargo install -f cross
$ cross build --target aarch64-unknown-linux-gnu
$ cross build --target x86_64-pc-windows-gnu
$ cross build --target armv7-unknown-linux-gnueabihf
# ...
You can learn more about it on GitHub.
The code is on GitHub
As usual, you can find the code on GitHub: github.com/skerkour/kerkour.com (please don’t forget to star the repo 🙏).
Want to learn Rust and offensive security?
Take a look at my book Black Hat Rust.
All early-access supporters get a special discount and awesome bonuses:
https://academy.kerkour.com/black-hat-rust?coupon=BLOG.
Warning: this offer is limited in time!
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK