5

組み込みデバイスで Rust を使用するプロジェクトに取り組んでおり、C から呼び出すことができる関数を Rust で記述しようとしています。多かれ少なかれこのチュートリアルに従って、標準ライブラリなしでプロジェクトをコンパイルします: Embedded Rust Right今!

私の Rust コードは問題なく .o ファイルにコンパイルされますが、arm-none-eabi-ld を使用して C と Rust オブジェクト ファイルをリンクしようとすると問題が発生します。次のようなエラーがいくつか発生します。

rustfunc.o: In function `func':
rustfunc.0.rs:(.text.hash+0x18): undefined reference to `__aeabi_memclr8'
...
/rust/src/libcore/slice.rs:1446: undefined reference to `__aeabi_memcpy'
/rust/src/libcore/fmt/num.rs:196: undefined reference to `__aeabi_memclr4'

私が最も困惑しているのは、オブジェクト ファイルをリンクしているだけなのに、エラーが Rust コードと libcore のコードの両方を参照していることです。

これらのエラーの意味と、リンカーがこれらの問題を解決できない理由を知っている人はいますか? ありがとう!

4

1 に答える 1

6

rustc問題は、あなたの(そしておそらくあなたのcc) が構築されている LLVM が、コンパイラーのビルトインまたは場合によっては組み込み関数を参照することです。これは、コンパイラーがターゲット プラットフォーム用に最適化されていると想定する小さなヘルパー ルーチンです。

通常、それらはコンパイラに付属しているため、「リンクしてみませんか」というコメントがネット上でたくさんlibgcc.a見られます。LLVM は gcc とは少し異なるビルトインを呼び出すため、これはベアメタル プロジェクトでは役に立たないように思われ、実際には機能しません。

これらのルーチンの実装を提供することができます。真のベアメタル OS は、おそらくそれを検討するのに約 5 分を費やす必要があります。アセンブリまたは Rust で記述できます。

// Use this at your peril
#[no_mangle]
pub unsafe extern fn __aeabi_memclr4(s: *mut u8, n: usize) -> *mut u8 {
    let mut i = 0;
    while i < n {
        *s.offset(i as isize) = 0u8;
        i += 1;
    }
    return s;
} 

夢を見終わったら、ターゲット用にllvmcompiler-rt (libgcc.a に相当) をコンパイルし、それをリンクします。

クロスコンパイル用に追加のターゲットをインストールするサポートが強化されるまではrustc、Rust ソースをダウンロードして、クロスコンパイラとライブラリ (を含む) を自分でビルドする必要があります。multirustcompiler-rt

現在、サポートされているターゲットではなく、 Rust の jemalloc が主張する実行可能ファイルをリンクしないなど、いくつarm-none-eabiかの理由でビルドが大雑把です。arm-none-eabi-gcc私の回避策は、ソース ファイルを収集してcompiler-rtビルドし、個別にリンクすることです。

于 2015-12-15T11:38:07.190 に答える