首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >交叉编译[no_std]代码- libcore和compiler_builtins未找到

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

Stack Overflow用户
提问于 2022-05-15 10:06:36
回答 1查看 153关注 0票数 2

我试图按照内嵌式中解释的步骤来编译最小的#![no-std]程序,但是在新架构上有一个新的目标。

  1. 该体系结构在LLVM中作为一个实验目标("ARC")被升级,但它没有被rustc使用,所以我首先在Rust附带的LLVM中启用了它,如解释的这里:run ./x.py setup,然后更新config.toml:
代码语言:javascript
运行
复制
[llvm]
download-ci-llvm = false
ninja = true
targets = "X86"
experimental-targets = "ARC"
  1. 然后,我按照解释这里的步骤手动添加了对arch的支持(以此承诺为例):
  • 创建了rustc_target/src/abi/call/arc.rs
  • 更新的rustc_llvm/src/lib.rs
  1. 然后,我添加了目标文件arc-pc-unknown-gnu.json并通过RUST_TARGET_PATH envvar使其可见:
代码语言:javascript
运行
复制
{
  "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目标的arc-pc-unknown-gnu
  2. 我认为这就足够了,但是由于以下问题,代码没有编译:
代码语言:javascript
运行
复制
$ 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 (虽然我不知道确切原因,但网络上有人提到了这一点)?我尝试过这样做,但是现在有以下错误:
代码语言:javascript
运行
复制
$ 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进行交叉编译,然后在我的#示例编译过程中学习。如有任何指导,将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-19 18:15:32

我就是这样解决这个问题的:

  1. 使用正确的rustc源代码。我从一个稳定的版本开始,它的libcore与最新的compiler_builtins不兼容。有关更多详细信息,请参阅这里。然后我需要升级到最新的夜间。
  2. 在构建编译器时,不要要求在最后阶段构建libcore,而是只构建rustc:
代码语言:javascript
运行
复制
$ ./x.py build -i --stage=1 --target=arcv2-none-elf32 compiler/rustc
  1. 使用下面的.cargo/config.toml,不要使用Xargo-Z build-std=corecompiler-builtins-mem的事情被解释为这里
代码语言:javascript
运行
复制
[unstable]
build-std = [
    "core",
    "compiler_builtins"
]
build-std-features = ["compiler-builtins-mem"]

[build]
target = "arcv2-none-elf32"
  1. 使用一个简单的cargo build构建代码。它编译得很好,尽管后来没能链接起来--但这是另一个故事。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72247284

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档