Связывание программ AVR с Cargo
У меня есть проект Rust, который я сейчас собираю и связываю вручную:
rustc --target=avr-atmel-none src/main.rs --emit=obj -o _build/main.rs.o -C opt-level=3
avr-gcc -Os -Wl,--gc-sections -mmcu=atmega328p -o _build/image.elf _build/main.rs.o
avr-objcopy -Oihex -R.eeprom _build/image.elf _build/image.hex
Я хотел бы автоматизировать это с Cargo, поэтому я начал с настройки avr-gcc
в качестве компоновщика, добавив следующее .cargo/config
:
[build]
target = "avr-atmel-none"
[target.avr-atmel-none]
linker = "avr-gcc"
Тем не менее, похоже cargo
передает некоторые дополнительные аргументы компоновщику, который avr-gcc
не выдерживаю:
11:47:10 [cactus@galaxy interrupt-bug]$ cargo build --release
Compiling hello-avr v0.1.0 (file:///home/cactus/prog/rust/avr/interrupt-bug)
error: linking with `avr-gcc` failed: exit code: 1
|
= note: "avr-gcc" "-Wl,--as-needed" "-L" "/home/cactus/prog/rust/rust-avr/build/build/x86_64-unknown-linux-gnu/stage1/lib/rustlib/avr-atmel-none/lib" "/home/cactus/prog/rust/avr/interrupt-bug/target/avr-atmel-none/release/deps/hello_avr-8bce8eb24807f5a8.0.o" "-o" "/home/cactus/prog/rust/avr/interrupt-bug/target/avr-atmel-none/release/deps/hello_avr-8bce8eb24807f5a8" "-Wl,--gc-sections" "-pie" "-Wl,-O1" "-nodefaultlibs" "-L" "/home/cactus/prog/rust/avr/interrupt-bug/target/avr-atmel-none/release/deps" "-L" "/home/cactus/prog/rust/avr/interrupt-bug/target/release/deps" "-L" "/home/cactus/prog/rust/rust-avr/build/build/x86_64-unknown-linux-gnu/stage1/lib/rustlib/avr-atmel-none/lib"
= note: /usr/lib/gcc/avr/4.8.2/../../../avr/bin/ld: -pie not supported
collect2: error: ld returned 1 exit status
Как удалить эти дополнительные аргументы из avr-gcc
вызов? Кроме того, есть ли способ интегрировать третий этап, то есть avr-objcopy
позвоните, в рабочий процесс Cargo?
1 ответ
Предупреждение: разработка в области avr-rust вежливо может быть названа самой передовой. Скорее всего, что-то, что сработает в один прекрасный день, может не сработать на следующий, поэтому такие ответы, скорее всего, быстро устаревают Мы приветствуем всех участников проекта, которые помогут сделать его более удобным для использования.
Вам необходимо указать целевой файл JSON и полный набор аргументов компоновщика. Вот пример из моего более старого проекта (некоторые из точных значений теперь могут быть неправильными):
{
"llvm-target": "avr-atmel-none",
"target-endian": "little",
"target-pointer-width": "16",
"os": "none",
"target-env": "gnu",
"target-vendor": "unknown",
"arch": "avr",
"data-layout": "e-p:16:16:16-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-n8",
"executables": true,
"linker": "avr-gcc",
"linker-flavor": "gcc",
"pre-link-args": {
"gcc": ["-mmcu=atmega328p", "-nostartfiles", "../interrupt_vector.S"]
},
"exe-suffix": ".elf",
"post-link-args": {
"gcc": ["-Wl,--no-gc-sections"]
},
"no-compiler-rt": true
}
Для полного примера см. Мой пример репозитория. Этот проект работал (см. Мою серию блогов). Я недавно обновил его, чтобы он компилировался с основной веткой avr-rust, но не проверял скомпилированный код на реальном устройстве.
Существует открытый RFC для скриптов пост сборки, но вряд ли он будет объединен. Я продолжаю использовать Makefile. xargo может быть альтернативой. Были также грохоты о грузовой подкоманде, которая могла быть создана.