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目标特性,可跳过这段依赖代码:
- 修改
~/.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"]
- 清理编译缓存后重新编译:
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.
相关产品推荐
相关产品推荐

