Linker Cargo创建空的ELF文件

Linker Cargo创建空的ELF文件,linker,rust,rust-cargo,Linker,Rust,Rust Cargo,我试图通过编写一个自定义目标.json文件来使用“linker-flavor”:“gcc”。我的完整目标.json文件是: { "llvm-target": "avr-atmel-none", "cpu": "atmega328p", "target-endian": "little", "target-pointer-width": "16", "os": "none", "target-env": "gnu", "target-vendor": "unknown"

我试图通过编写一个自定义目标
.json
文件来使用
“linker-flavor”:“gcc”
。我的完整目标
.json
文件是:

{
  "llvm-target": "avr-atmel-none",
  "cpu": "atmega328p",
  "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": ["-Os -mmcu=atmega328p"]
  },
  "exe-suffix": ".elf",
  "post-link-args": {
    "gcc": ["-Wl,--gc-sections"]
  },

  "no-default-libraries": false
}
运行
cargo build
,并完成此操作,无任何错误消息:

$cargo build--发布版-v
编译核心v0.1.0(https://github.com/gergoerdi/rust-avr-libcore-mini?rev=adda44aa91ac517aab6915447592ee4cad26564c#adda44aa)
运行'rustc--板条箱名称core/home/cactus/.cargo/git/checkout/rust-avr-libcore-mini-37e279d93a70b45a/adda44a/src/lib.rs--板条箱类型lib--emit=dep info,link-C opt level=3-C metadata=655bb622dd229da9-C extra filename=-655bb622dd229da9--out dir/home/cactus/prog/rust/avr/chip8 avr/target/avr-atmega328p/release/deps--target avr-atmega328p-L deps-L dependency=/home/cactus/prog/prog/prog/prog/prog/prog/rust/rust/crust/chip8 avr/release/deps-L deps--帽毛允许`
编译芯片8引擎v0.1.0(https://github.com/gergoerdi/rust-avr-chip8-engine?rev=c6f88737bae4dae0bd6c5c2bbc73737e6dfadfcd#c6f88737)
运行'rustc--板条箱名称chip8_engine/home/cactus/.cargo/git/checkout/rust-avr-chip8-engine-4BCE60F378D33A/c6f8873/src/lib.rs--板条箱类型lib--emit=dep info,link-C opt level=3-C metadata=2197ff1f15f697c9-C extra filename=-2197ff1f15f697c9--out dir/home/cactus/prog/rust/avr/chip8 avr/target/avr-atmega328p/release/deps--target avr-atmega328p-L dependency=/home/cactus/cactus/prog/prog/prog/prog/prog/prog/prog/rust/avr/avr/chip8 avr/deps/deps--extern core=/home/cactus/prog/rust/avr/chip8 avr/target/avr-atmega328p/release/deps/libcore-655bb622d229da9.rlib——允许的帽毛`
编译芯片8 avr v0.1.0(file:///home/cactus/prog/rust/avr/chip8-avr)
运行'rustc--crater name chip8_avr src/main.rs--crater type bin--emit=dep info,link-C opt level=3-C metadata=014a8fed19cbc611-C extra filename=-014a8fed19cbc611--out dir/home/cactus/prog/rust/avr/chip8 avr/target/avr-atmega328p/release/deps--target avr-atmega328p-L dependency=/home/cactus/prog/prog/prog/prog/rust/avr/avr/chip8 avr/deps-L deps--extern-chip8_-engine=/home/cactus/prog/rust/avr/chip8-avr/target/avr-atmega328p/release/deps/libchip8_-engine-2197ff1f15f697c9.rlib——extern-core=/home/cactus/prog/rust/avr/chip8-avr/target/avr-atmega328p/release/deps/libcore-655bb622d29da9.rlib`
在15.99秒内完成发布[优化]目标
但是,生成的ELF文件的
.text
部分为空:

$avr objdump-h target/avr-atmega328p/release/chip8-avr.elf
target/avr-atmega328p/release/chip8-avr.elf:文件格式elf32 avr
部分:
Idx名称大小VMA LMA文件关闭Algn
0.文本000000000000000000000000742**1
内容、分配、加载、只读、代码
1.数据00000000 00800060 00000000 000000 74 2**0
内容、分配、加载、数据
2.刺0000012c 00000000000000000074 2**2
内容,只读,调试
3.stabstr 000000 5D 00000000 00000000 00000 1A0 2**0
内容,只读,调试
4.注释00000011 00000000 00000000 00000 1FD 2**0
内容,只读
所以为了弄清楚发生了什么,我想我应该替换我的
avr gcc
使用一个小的shell脚本,在将其传递给 真正的
avr gcc
可执行文件

这表明
rustc
/
cargo
正在尝试运行以下程序 执行链接的命令行:

/usr/bin/avr gcc-Os-mmcu=atmega328p\
-L/home/cactus/prog/rust/rust avr/build/build/x86_64-unknown-linux-gnu/stage1/lib/rustlib/avr-atmega328p/lib\
/home/cactus/prog/rust/avr/chip8 avr/target/avr-atmega328p/release/deps/chip8_avr-014a8fed19cbc611.0.o\
-o/home/cactus/prog/rust/avr/chip8 avr/target/avr-atmega328p/release/deps/chip8_avr-014a8fed19cbc611.elf\
-Wl,--gc部分\
-L/home/cactus/prog/rust/avr/chip8 avr/target/avr-atmega328p/release/deps-L/home/cactus/prog/rust/avr/chip8 avr/target/release/deps-L/home/cactus/prog/rust/avr/build/build/build/x86_64-unknown-linux-gnu/stage1/lib/rustlib/avr-atmega328p/lib\
-Wl,-Bstatic/home/cactus/prog/rust/avr/chip8 avr/target/avr-atmega328p/release/deps/libchip8_engine-2197ff1f15f697c9.rlib\
/home/cactus/prog/rust/avr/chip8 avr/target/avr-atmega328p/release/deps/libcore-655bb622d229da9.rlib\
-Wl,-B动态-Wl,--gc截面
如果我使用完全相同的环境变量手动运行完全相同的命令,我会得到一个很好的ELF文件 正确的内容(注意其
.text
部分不是空的):

$/usr/bin/avr gcc-Os-mmcu=atmega328p-L/home/cactus/prog/rust/rust avr/build/build/x86_64-unknown-linux-gnu/stage1/lib/rustlib/avr-atmega328p/lib/home/cactus/prog/rust/avr/chip8 avr/target/avr-atmega328p/release/deps/chip8\u avr-014a8fed19cbc611.0.o-o/home/cactus/prog/rust/avr/chip8 avr/target/avr-atmega328p/release/deps/chip8_avr-014a8fed19cbc611.elf-Wl,--gc部分-L/home/cactus/prog/rust/avr/chip8 avr/target/avr-atmega328p/release/deps-L/home/cactus/prog/rust/avr/avr/target/release/deps-L/home/cactus/prog/rust/rust avr/build/build/build/x86_64-unknown-linux-gnu/stage1/lib/rustlib/avr-atmega328p/lib-Wl,-Bstatic/home/cactus/prog/rust/avr/chip8 avr/target/avr-atmega328p/release/deps/libchip8_engine-2197ff1f15f697c9.rlib/home/cactus/prog/rust/avr/chip8 avr/target/avr-atmega328p/release/deps/libcore-655bb622d229da9.rlib-Wl,-,-,--Bdynamic-Wl,--gc部分
$avr objdump-h目标/avr-atmega328p/release/deps/chip8_avr-014a8fed19cbc611.elf
target/avr-atmega328p/release/deps/chip8_avr-014a8fed19cbc611.elf:文件格式elf32 avr
部分:
Idx名称大小VMA LMA
"pre-link-args": {
  "gcc": ["-Os -mmcu=atmega328p"]
},
"pre-link-args": {
  "gcc": ["-Os", "-mmcu=atmega328p"]
},