Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Скрипт компоновщика (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