Rust编译aarch64裸金属程序报rust-lld链接及target加载错误如何解决?
问题根因
你遇到的报错分为两类,根因如下:
- target加载错误:你使用的自定义
aarch64-unknown-none.json配置文件中包含了is_builtin: true字段,该字段仅允许Rust官方内置target使用,自定义target配置不能声明该字段,因此rustc加载target规格失败 - 工具链兼容问题:你使用的
cargo-xbuild是已废弃的第三方工具,1.54及以上版本的Rust nightly工具链已经原生内置build-std功能,旧xbuild工具和新nightly工具链存在兼容冲突
解决方案
方案1:使用官方内置target(无自定义需求优先选)
你已经通过rustup target add aarch64-unknown-none安装了官方内置的aarch64裸金属target,不需要自定义配置的话可以直接使用,步骤如下:
- 删除项目内的自定义
aarch64-unknown-none.json文件 - 在项目
.cargo/config.toml中添加以下配置,启用官方build-std功能:
[unstable] build-std = ["core", "alloc"] build-std-features = ["compiler-builtins-mem"] [target.aarch64-unknown-none] rustflags = [ "-Clink-arg=-Tlink.ld", # 替换为你实际使用的链接脚本路径 "-Clinker=rust-lld" ]
- 替换编译命令,不再使用cargo-xbuild:
cargo build --target aarch64-unknown-none
方案2:确实需要自定义target配置的场景
如果你的项目有特殊的target参数配置需求,必须使用自定义json文件,按以下步骤修改:
- 打开
aarch64-unknown-none.json文件,删除"is_builtin": true这一行配置后保存 - 同样使用官方build-std替代cargo-xbuild,编译命令改为:
cargo build --target ./aarch64-unknown-none.json
注意自定义target路径需要加./前缀明确指定为本地文件。
初始rust-lld链接错误排查
如果完成上述配置后仍然出现最开始的rust-lld链接失败问题,检查两个配置项:
- 确认你的链接脚本语法符合aarch64架构要求,内存段布局和QEMU的aarch64虚拟机地址空间匹配
- 确认项目根文件已经添加
#![no_std]、#![no_main]声明,没有引入依赖std标准库的代码,入口函数标记符合裸金属程序要求
内容的提问来源于stack exchange,提问作者OT_Hank
相关产品推荐
相关产品推荐

