You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rust无标准库项目集成rust-mbedtls遇GOTPCREL链接错误求助

解决Rust no-std项目中rust-mbedtls链接GOTPCREL错误

问题根源

你遇到的ld: failed to convert GOTPCREL relocation; relink with --no-relax错误,并非cargo编译静态库阶段的问题——从输出看,cargo已成功生成静态库。错误出现在Makefile中最终链接生成qkernel.bin的步骤,你之前给RUSTFLAGS添加的--no-relax仅作用于rustc编译静态库环节,未覆盖后续make调用ld的阶段。

解决方案

1. 修改Makefile的链接命令

找到Makefile中生成qkernel.bin的链接命令(对应报错的第20行附近),确保给链接器加上--no-relax参数:

  • 若用gcc调用ld:
    # 请根据实际命令调整参数
    gcc -o ../build/qkernel.bin [你的目标文件/静态库列表] -Wl,--no-relax
    
  • 若直接调用ld:
    ld -o ../build/qkernel.bin [你的目标文件/静态库列表] --no-relax
    

2. 确认rust-mbedtls的no-std配置

确保mbedtls_sys依赖以no-std模式编译,在Cargo.toml中修改:

[dependencies.mbedtls_sys]
version = "你的版本号"
features = ["no_std"]
default-features = false

同时同步调整mbedtls依赖的配置:

[dependencies.mbedtls]
version = "你的版本号"
default-features = false
features = ["no_std"] # 可按需添加其他业务需要的特性

3. 优化自定义calloc/free的鲁棒性(可选)

你的calloc实现中使用Layout::from_size_align(...).unwrap(),在no-std环境下若内存分配失败或对齐不合法会直接panic,建议改为错误处理逻辑:

match Layout::from_size_align(total_size as usize, ALIGNMENT) {
    Ok(layout) => {
        // 原有内存分配逻辑
        unsafe { alloc(layout) } as *mut core::ffi::c_void
    }
    Err(_) => core::ptr::null_mut() as *mut core::ffi::c_void,
}

验证

修改后重新执行make命令,链接阶段将正确应用--no-relax参数,解决GOTPCREL重定位错误。

内容的提问来源于stack exchange,提问作者yaoxin jing

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 07:27:03