2017-05-20 11 views
2

私はthis answerを使用して、.jsonというファイルを"linker-flavor":"gcc"という名前で作成しようとしています。私の完全なターゲット.jsonファイルは次のようになります。これでcargo buildを実行する貨物は空のELFファイルを作成します

{ 
    "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 --release -v 
    Compiling core v0.1.0 (https://github.com/gergoerdi/rust-avr-libcore-mini?rev=adda44aa91ac517aab6915447592ee4cad26564c#adda44aa) 
    Running `rustc --crate-name core /home/cactus/.cargo/git/checkouts/rust-avr-libcore-mini-37e279d93a70b45a/adda44a/src/lib.rs --crate-type 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 dependency=/home/cactus/prog/rust/avr/chip8-avr/target/avr-atmega328p/release/deps -L dependency=/home/cactus/prog/rust/avr/chip8-avr/target/release/deps --cap-lints allow` 
    Compiling chip8-engine v0.1.0 (https://github.com/gergoerdi/rust-avr-chip8-engine?rev=c6f88737bae4dae0bd6c5c2bbc73737e6dfadfcd#c6f88737) 
    Running `rustc --crate-name chip8_engine /home/cactus/.cargo/git/checkouts/rust-avr-chip8-engine-4bce60f3f178d33a/c6f8873/src/lib.rs --crate-type 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/prog/rust/avr/chip8-avr/target/avr-atmega328p/release/deps -L dependency=/home/cactus/prog/rust/avr/chip8-avr/target/release/deps --extern core=/home/cactus/prog/rust/avr/chip8-avr/target/avr-atmega328p/release/deps/libcore-655bb622dd229da9.rlib --cap-lints allow` 
    Compiling chip8-avr v0.1.0 (file:///home/cactus/prog/rust/avr/chip8-avr) 
    Running `rustc --crate-name chip8_avr src/main.rs --crate-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/rust/avr/chip8-avr/target/avr-atmega328p/release/deps -L dependency=/home/cactus/prog/rust/avr/chip8-avr/target/release/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-655bb622dd229da9.rlib` 
    Finished release [optimized] target(s) in 15.99 secs 

しかし、結果のELFファイルの.textセクションが空である:だから

$ avr-objdump -h target/avr-atmega328p/release/chip8-avr.elf 

target/avr-atmega328p/release/chip8-avr.elf:  file format elf32-avr 

Sections: 
Idx Name   Size  VMA  LMA  File off Algn 
    0 .text   00000000 00000000 00000000 00000074 2**1 
        CONTENTS, ALLOC, LOAD, READONLY, CODE 
    1 .data   00000000 00800060 00000000 00000074 2**0 
        CONTENTS, ALLOC, LOAD, DATA 
    2 .stab   0000012c 00000000 00000000 00000074 2**2 
        CONTENTS, READONLY, DEBUGGING 
    3 .stabstr  0000005d 00000000 00000000 000001a0 2**0 
        CONTENTS, READONLY, DEBUGGING 
    4 .comment  00000011 00000000 00000000 000001fd 2**0 
        CONTENTS, READONLY 

何が起こっているのか把握するために、avr-gcc をsma実際のavr-gcc実行可能ファイルにそれを渡す前に引数を記録するllシェルスクリプトです。

これは、リンクを行うには、次の のコマンドラインを実行しようとしている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-sections \ 
    -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/rust-avr/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-655bb622dd229da9.rlib \ 
    -Wl,-Bdynamic -Wl,--gc-sections 

私はまったく同じ環境変数で、手動でまったく同じコマンドを実行すると、私が手 右の内容(その.textセクションが空でないことに注意してください)との良好なELFファイル:

$ /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-sections -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/rust-avr/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-655bb622dd229da9.rlib -Wl,-Bdynamic -Wl,--gc-sections 
$ avr-objdump -h target/avr-atmega328p/release/deps/chip8_avr-014a8fed19cbc611.elf 
target/avr-atmega328p/release/deps/chip8_avr-014a8fed19cbc611.elf:  file format elf32-avr 

Sections: 
Idx Name   Size  VMA  LMA  File off Algn 
    0 .data   0000020e 00800100 00001a56 00001af0 2**4 
        CONTENTS, ALLOC, LOAD, DATA 
    1 .text   00001a56 00000000 00000000 00000094 2**1 
        CONTENTS, ALLOC, LOAD, READONLY, CODE 
    2 .bss   000001fa 0080030e 0080030e 00001cfe 2**0 
        ALLOC 
    3 .stab   000007ec 00000000 00000000 00001d00 2**2 
        CONTENTS, READONLY, DEBUGGING 
    4 .stabstr  000000b0 00000000 00000000 000024ec 2**0 
        CONTENTS, READONLY, DEBUGGING 
    5 .comment  00000011 00000000 00000000 0000259c 2**0 
        CONTENTS, READONLY 

はなぜcargo silentlはありませんy シェルから同じコマンドが実行された場合、有効なELFファイルが生成されても、無意味な空のELFファイルが生成されますか?

答えて

1

これは、ターゲット.jsonファイルのバグが原因です。具体的には、この部分:

"pre-link-args": { 
    "gcc": ["-Os", "-mmcu=atmega328p"] 
}, 

この問題はdidnの理由:引数がリンカにargvとして直接渡され

"pre-link-args": { 
    "gcc": ["-Os -mmcu=atmega328p"] 
}, 

ので、複数の引数は、ここでは、配列の複数の要素に分割する必要がありますavr-gccの特別なロギングバージョンを使用するときに表示されるのは、ログにすべての引数のみが含まれているということです。したがって、2つの表現の間に違いはありません。

avr-gcc '-Os -mmcu=atmega328p'については、空の.elfファイルを作成すると、(有効な)-mmcu引数を指定しないという単純な副作用のようです。

関連する問題