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

x86_64交叉编译Rust到aarch64时遇`undefined reference to 'getauxval'`错误

解决OpenWRT aarch64平台Rust交叉编译undefined reference to 'getauxval'错误

问题背景

为OpenWRT的ramips(mipsel)平台交叉编译Rust应用可正常完成,但针对rockchip(aarch64)平台编译时,出现链接错误:undefined reference to 'getauxval',该错误来自compiler_builtins库的init_have_lse_atomics函数。

解决方案

方法1:禁用LSE原子指令检测

getauxval的依赖源于Rust编译器内置库对ARM LSE(Large System Extensions)原子指令的检测逻辑,而OpenWRT的musl工具链未在静态链接场景下导出该符号。通过强制禁用LSE目标特性,可跳过这段依赖代码:

  1. 修改~/.cargo/config.toml,在[target.aarch64-unknown-linux-musl]段添加rustflags配置:
[target.aarch64-unknown-linux-musl]
linker = "/home/janvier/openwrt-sdk-22.03.2/rockchip/staging_dir/toolchain-aarch64_generic_gcc-11.2.0_musl/bin/aarch64-openwrt-linux-musl-gcc"
rustflags = ["-C", "target-feature=-lse"]
  1. 清理编译缓存后重新编译:
cargo clean
cargo build --target aarch64-unknown-linux-musl

方法2:补充静态链接参数(可选)

若方法1无效,可显式指定链接musl相关库,确保所有依赖符号被正确包含:
在编译时添加额外链接参数:

RUSTFLAGS="-C link-arg=-static-libgcc" cargo build --target aarch64-unknown-linux-musl

也可将参数写入~/.cargo/config.toml实现永久生效:

[target.aarch64-unknown-linux-musl]
linker = "/home/janvier/openwrt-sdk-22.03.2/rockchip/staging_dir/toolchain-aarch64_generic_gcc-11.2.0_musl/bin/aarch64-openwrt-linux-musl-gcc"
rustflags = ["-C", "target-feature=-lse", "-C", "link-arg=-static-libgcc"]

原理说明

ARM64平台的compiler_builtins库会通过getauxval读取AT_HWCAP辅助向量检测CPU是否支持LSE原子指令,但OpenWRT提供的musl工具链未在静态链接场景下导出该函数。禁用LSE特性后,编译器会回退到通用原子实现,从而避免对getauxval的依赖。

内容的提问来源于stack exchange,提问作者Janvier P.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 18:03:29