Linker 将AVR程序与Cargo链接

Linker 将AVR程序与Cargo链接,linker,rust,avr,rust-cargo,Linker,Rust,Avr,Rust Cargo,我有一个Rust项目,目前正在手工编译和链接: rustc--target=avr atmel none src/main.rs--emit=obj-o\u 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\u build/image.elf\u build/image.hex

我有一个Rust项目,目前正在手工编译和链接:

rustc--target=avr atmel none src/main.rs--emit=obj-o\u 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\u build/image.elf\u 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中断错误]$cargo构建--发布
编译hello avr v0.1.0(file:///home/cactus/prog/rust/avr/interrupt-bug)
错误:与“avr gcc”链接失败:退出代码:1
|
=注:“avr gcc”“-Wl,--根据需要”“-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”“-L”“-L”/home/cactus/prog/rust/rust avr/build/build/x86_64-unknown-linux-gnu/stage1/lib/rustlib/avr atmel none/lib“
=注意:/usr/lib/gcc/avr/4.8.2/../../../../../avr/bin/ld:-不支持饼图
collect2:错误:ld返回了1个退出状态

如何从
avr gcc
调用中删除这些额外的参数?此外,有没有办法将第三步,即
avr objcopy
调用集成到Cargo工作流中?

一句警告:在上开发可以礼貌地说是最先进的。很可能某件事情在某一天起作用,但在下一天可能就不起作用了o像这样的答案很可能会很快过时。我们欢迎项目的所有贡献者帮助项目变得更有用


您需要指定一个目标JSON文件和完整的链接器参数集。下面是我的一个旧项目的示例(一些精确值现在可能不正确):

有关完整的示例,请参见。此项目过去是有效的(请参见my)。我最近对其进行了更新,使其能够针对avr rust的主分支进行编译,但尚未在实际设备上测试编译后的代码



有一个开放的RFC,但它似乎不太可能被合并。我继续使用Makefile。这可能是另一种选择。也有关于可以创建cargo子命令的传言。

一句警告:可以礼貌地说,在上开发是最前沿的。很可能某件事情在某一天起作用,但在下一天可能就不起作用了,所以这样的答案很可能很快就会过时。我们欢迎所有参与该项目的人帮助它变得更有用


您需要指定一个目标JSON文件和完整的链接器参数集。下面是我的一个旧项目的示例(一些精确值现在可能不正确):

有关完整的示例,请参见。此项目过去是有效的(请参见my)。我最近对其进行了更新,使其能够针对avr rust的主分支进行编译,但尚未在实际设备上测试编译后的代码



有一个开放的RFC,但它似乎不太可能被合并。我继续使用Makefile。可能是另一个选择。也有关于可以创建cargo子命令的传言。

使用
.json
文件(删除我不需要的
中断向量.s
依赖项),
cargo build
完成时没有错误,但生成的
.elf
文件只有701字节,而手动链接的
.elf
文件只有4002字节。
avr objdump-S
显示了短
.elf
文件,不包含任何代码。@Cactus请再次检查。编译器总是添加
-Wl,--gc节
>,它删除了所有内容。
post-link args
本应撤消该操作,但它的结构以前是错误的,我现在已对其进行了更改。使用您的
.json
文件(删除我不需要的
中断向量.S
依赖项),
cargo build
完成时没有错误,但生成的
.elf
文件只有701字节,而手动链接的
.elf
文件只有4002字节。
avr objdump-S
显示了短
.elf
文件,不包含任何代码。@Cactus请再次检查。编译器总是添加
-Wl,--gc节
>,它删除了所有内容。
post-link-args
本应撤消该操作,但它的结构以前是错误的,我现在已对其进行了更改。
{
  "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
}