交叉编译 [no_std] 代码 - 未找到 libcore 和 compiler_builtins

Cross-compiling [no_std] code - libcore and compiler_builtins not found

我正在尝试按照 Embeddonomicon 中解释的步骤来编译最小的 #![no-std] 程序,但是是针对新架构上的新目标。

  1. 该架构在 LLVM 中作为实验目标(“ARC”)上游,但它没有被 rustc 使用,所以首先我在 Rust 附带的 LLVM 中启用它,如解释的那样here:运行 ./x.py setup 然后更新 config.toml:
[llvm]
download-ci-llvm = false
ninja = true
targets = "X86"
experimental-targets = "ARC"
  1. 然后我按照 here (using this commit 作为示例解释的步骤手动添加了对 arch 的支持:
  1. 然后我添加了目标文件 arc-pc-unknown-gnu.json 并通过 RUST_TARGET_PATH envvar:
  2. 使其可见
{
  "arch": "arc",
  "cpu": "generic",
  "abi": "eabi",
  "c-enum-min-bits": 8,
  "data-layout": "e-m:e-p:32:32-i64:32-f64:32-v64:32-v128:32-a:0:32-n32",
  "eh-frame-header": false,
  "emit-debug-gdb-scripts": false,
  "executables": true,
  "features": "",
  "linker": "rust-lld",
  "linker-flavor": "ld.lld",
  "llvm-target": "arc-pc-unknown-gnu",
  "max-atomic-width": 32,
  "atomic-cas": false,
  "panic-strategy": "abort",
  "relocation-model": "static",
  "target-pointer-width": "32"
}
  1. 构建编译器:./x.py build -i --target=arc-pc-unknown-gnu library/core。它成功完成,我可以看到 arc-pc-unknown-gnu 目标
  2. stage1
  3. 我认为这就足够了,但是由于以下问题,代码没有编译:
$ rustc --emit=llvm-ir -o rust_main.ll -C panic=abort --target arc-pc-unknown-gnu src/main.rs
error[E0463]: can't find crate for `core`
  |
  = note: the `arc-pc-unknown-gnu` target may not be installed
  = help: consider downloading the target with `rustup target add arc-pc-unknown-gnu`
  = help: consider building the standard library from source with `cargo build -Zbuild-std`

error[E0463]: can't find crate for `compiler_builtins`

error[E0412]: cannot find type `PanicInfo` in this scope
  --> src/main.rs:18:18

这很奇怪,因为在上一步中我应该为我的目标编译这些库...

  1. 然后我想也许我需要使用 cargo build-std 再次重建 libcore(虽然我不知道为什么,但网上有人提到过这个)?我试过了,但现在出现以下错误:
$ cargo build -Z build-std=core --target arc-pc-unknown-gnu
   Compiling compiler_builtins v0.1.70
   Compiling core v0.0.0 (/home/valeriyk/proj/rust-arc/1.60.0/build/x86_64-unknown-linux-gnu/stage1/lib/rustlib/src/rust/library/core)
error[E0463]: can't find crate for `std`

error: cannot find macro `println` in this scope
  --> /home/valeriyk/.cargo/registry/src/github.com-1ecc6299db9ec823/compiler_builtins-0.1.70/build.rs:88:9
   |
88 |         println!("cargo:rustc-cfg=kernel_user_helpers")
   |         ^^^^^^^

error: cannot find macro `println` in this scope
  --> /home/valeriyk/.cargo/registry/src/github.com-1ecc6299db9ec823/compiler_builtins-0.1.70/build.rs:78:9
   |
78 |         println!("cargo:rustc-cfg=thumb_1")
   |         ^^^^^^^
...

为什么 libcore 需要 std?我只想使用 stage1 rustc 对其进行交叉编译,然后在我的 #![no_std] 示例编译期间使用它。任何指导表示赞赏。

我就是这样解决问题的:

  1. 使用正确的rustc源代码。我从一个稳定版本开始,它的 libcore 与最新 compiler_builtins 不兼容。有关详细信息,请参阅 。然后我需要升级到最新的nightly。

  2. 构建编译器时,不要要求为最后阶段构建 libcore,而是只构建 rustc:

$ ./x.py build -i --stage=1 --target=arcv2-none-elf32 compiler/rustc
  1. .cargo/config.toml 使用以下内容,不要使用 Xargo-Z build-std=corecompiler-builtins-mem 的解释是 here
[unstable]
build-std = [
    "core",
    "compiler_builtins"
]
build-std-features = ["compiler-builtins-mem"]

[build]
target = "arcv2-none-elf32"
  1. 使用简单的 cargo build 构建代码。它编译得很好,虽然后来链接失败了——但那是另一回事了。