鉴于此.cargo/config
:
[build]
target = "riscv32i-unknown-none-elf"
这个main.rs:
#![no_std]
#![no_main]
use core::arch::global_asm;
global_asm!(".globl _start
.section \".text\"
_start:
call rust_main
");
#[panic_handler]
fn panic(_info: &core::panic::PanicInfo) -> ! {
loop {
}
}
#[no_mangle]
pub extern "C" fn rust_main() -> ! {
loop {
test();
}
}
fn test() {
unsafe {
(0 as *mut u32).write(42);
}
}
cargo build --release
生成一个缺少所有 rust 函数的二进制文件:
$ riscv64-unknown-elf-objdump -d ./target/riscv32i-unknown-none-elf/release/BINARY_NAME
./target/riscv32i-unknown-none-elf/release/BINARY_NAME: file format elf32-littleriscv
Disassembly of section .text:
000110b4 <_start>:
110b4: 00000097 auipc ra,0x0
110b8: 008080e7 jalr 8(ra) # 110bc <rust_main>
000110bc <rust_main>:
110bc: c0001073 unimp
然而,链接器似乎是 "finding" rust_main
,因为如果我只更改函数名,链接将失败,因为当时未定义的符号。
我是否遗漏了什么,或者这是 rust buildchain 中的错误?Rust 与 rustup, cargo version 一起安装cargo 1.60.0-nightly (25fcb135d 2022-02-01)
。