Связывание программ 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 может быть альтернативой. Были также грохоты о грузовой подкоманде, которая могла быть создана.

Другие вопросы по тегам