How to compile Rust and LLVM for ESP32 on a Raspberry Pi (aarch64)
source link: https://kerkour.com/blog/compile-rust-for-esp32-xtensa-on-raspberry-pi-aarch64/
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.
How to compile Rust and LLVM for ESP32 on a Raspberry Pi (aarch64)
Tue, Sep 21, 2021
ESP32 is a series of microcontrollers that has the particularity to have both integrated Bluetooth and Wi-Fi. It makes it the perfect microcontroller when you need low-power, networked, and smart hardware that doesn’t require an OS.
I had to run compile and run Rust code on an ESP32. Unfortunately, they don’t run a traditional architecture but the Xtensa instruction set that is currently not officially supported by the Rust compiler.
The esp-rs GitHub organization contains the fork of the Rust compiler to support the Xtensa architecture.
Unfortunately, it seems that the src/llvm-project
submodule is out of date and does not support the aarch64
(arm64
) architecture, as when trying to follow the instructions I encountered the following error:
cargo:warning=cc: error: esp32/rust/src/llvm-project/compiler-rt/lib/builtins/aarch64/lse.S: No such file or directory
cargo:warning=cc: fatal error: no input files
cargo:warning=compilation terminated.
exit status: 1
Which, according to this issue, is due to an outdated LLVM version.
Here is how I fixed the build and successfully built Rust and LLVM to compile Rust binaries for ESP32:
The prerequisites
You will need at least 20GB of free space and a Rust toolchain: https://rustup.rs.
Building Rust
# starting from $HOME
$ mkdir esp32
$ cd esp32
$ git clone https://github.com/esp-rs/rust.git
$ cd rust
Here is the trick: you need to update the src/llvm-project
submodule:
$ git submodule update --init --recursive --remote src/llvm-project
Then, you can finally build Rust (warning: it will take a lot of time, so I recommend to run it for the night):
$ ./configure --experimental-targets=Xtensa
$ python3 x.py dist --stage 2
# still in esp32/rust
$ rustup toolchain link esp `pwd`/build/aarch64-unknown-linux-gnu/stage2
Building LLVM
Still in your recently cloned rust
folder (warning: it will take a lot of time, so I recommend to run it for the night):
$ cd src/llvm-project
$ mkdir build
$ cd build
$ cmake -G Ninja -DLLVM_ENABLE_PROJECTS='clang' -DCMAKE_BUILD_TYPE=Release ../llvm
$ cmake --build .
$ export PATH="$HOME/esp32/rust/src/llvm-project/build/bin:$PATH"
Your Rust toolcahin for ESP32 is now set up!
You can check it by running:
$ rustc --print target-list | grep xtensa
$ which clang
Which should return your newly built clang
.
See you tomorrow for a post on how to build and flash a Rust program to an ESP32.
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