Linker 将AVR程序与Cargo链接
我有一个Rust项目,目前正在手工编译和链接: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
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
}