Скрипт компоновщика (Linker Script)
Вы пробовали собрать проект снова? Да, теперь он не собирается. Что случилось?
Проблема в том, что компоновщик (linker) не знает, как разместить программу в памяти. Встраиваемым системам вроде ESP32 не нужна операционная система, которая управляла бы памятью, поэтому мы должны точно указать компоновщику, куда помещать код, данные и стек.
Для этого мы предоставим скрипт компоновщика. Это простой текстовый файл, который сообщает компоновщику, например:
-
Куда помещать код в памяти
-
Где начинается стек
-
Каков размер каждой области памяти
Мы будем использовать скрипт компоновщика под названием linkall.x. Он предоставляется esp-hal и содержит настройки размещения памяти, подходящие для ESP32.
Конфигурация Cargo
Проблему можно решить, добавив следующие строки в файл .cargo/config.toml. Однако этот способ мы использовать не будем. Вместо него применим файл build.rs.
[target.xtensa-esp32-none-elf]
rustflags = ["-C", "link-arg=-Tlinkall.x"]
Important
Не добавляйте аргумент компоновщика одновременно и в
.cargo/config.toml, и вbuild.rs. Это вызовет конфликт и ошибку сборки. Используйте только один способ.
Файл build.rs
Инструмент esp-generate добавляет эту строку в файл build.rs. Он делает там и другие вещи, которые мы здесь не рассматриваем. Чтобы повторить его структуру, мы тоже добавим аргумент компоновщика через файл build.rs.
Теперь создайте новый файл build.rs в корне проекта (не внутри папки src/) и добавьте в него следующий код:
fn main() {
// убедитесь, что linkall.x — последний скрипт компоновщика (иначе возможны проблемы с flip-link)
println!("cargo:rustc-link-arg=-Tlinkall.x");
}
Теперь проект должен собираться:
cargo build