x86 Ubuntu Bionic交叉编译aarch64程序glibc版本匹配问题咨询
我之前也踩过类似的交叉编译glibc版本不匹配的坑,结合Ubuntu包管理的逻辑,给你逐一解答问题并给出可行方案:
1. 安装gcc-4.8-aarch64-linux-gnu时,aarch64 glibc版本由什么决定?
Ubuntu的交叉工具链包是捆绑式打包的——gcc-4.8-aarch64-linux-gnu这个包的依赖关系由Ubuntu仓库维护者定义,它会强制依赖对应发行版的libc6-dev-arm64-cross(aarch64架构的glibc开发库)和libc6-arm64-cross(运行时库)。
在Ubuntu Bionic(18.04)的官方仓库里,libc6-arm64-cross的版本就是2.27,所以不管你安装的gcc交叉版本是4.8还是更高,都会默认装上这个版本的aarch64 glibc。这不是因为gcc 4.8本身需要glibc 2.27,而是Ubuntu的仓库打包策略把交叉工具链和发行版自身的glibc版本做了同步,以此保证仓库内软件包的兼容性。
2. 是否与主机x86版glibc直接关联?
没有直接关联,但存在间接影响:
- 直接层面:主机x86的glibc是用来运行交叉编译工具本身的依赖,和你编译出来的aarch64应用所用的glibc完全是两个独立的库,两者版本互不干扰;
- 间接层面:Ubuntu在构建交叉工具链包时,会基于当前发行版的构建环境,所以主机发行版的glibc版本会决定仓库中交叉glibc包的版本。比如Bionic的x86 glibc是2.27,官方就会把aarch64的交叉glibc包也打包成2.27,保持仓库内的版本一致性。
3. 如何正确安装aarch64版glibc v2.24(或更低)?
由于Ubuntu Bionic官方仓库没有提供旧版本的交叉glibc包,你有两个可靠的方案:
方案一:使用独立的第三方交叉工具链(推荐)
Linaro提供了各种版本的独立交叉工具链,其中旧版本的工具链会绑定较低版本的glibc。比如2017年早期发布的gcc-linaro-4.9-2017.01-x86_64_aarch64-linux-gnu工具链,对应的glibc版本是2.24左右,完全适配你的目标系统。
具体操作步骤:
- 找到并下载该工具链的压缩包(可在Linaro历史工具链发布资源中获取);
- 解压到自定义目录(比如
/opt):sudo tar -xJf gcc-linaro-4.9-2017.01-x86_64_aarch64-linux-gnu.tar.xz -C /opt/ - 配置环境变量,让系统优先使用这个工具链:
export PATH=/opt/gcc-linaro-4.9-2017.01-x86_64_aarch64-linux-gnu/bin:$PATH - 编译时使用该工具链的前缀(
aarch64-linux-gnu-),比如:
这样编译出来的应用会链接该工具链自带的glibc 2.24,完全满足目标系统的要求。aarch64-linux-gnu-gcc your_code.c -o your_app
方案二:从旧版Ubuntu仓库安装交叉包(需谨慎)
你可以添加Ubuntu Xenial(16.04)的仓库,因为Xenial的libc6-arm64-cross版本是2.23,接近你需要的2.24。但要注意避免影响系统其他包,必须使用apt pinning来限制只针对交叉工具链包使用旧源:
- 添加Xenial源到
/etc/apt/sources.list.d/xenial.list:echo "deb http://archive.ubuntu.com/ubuntu xenial main universe" | sudo tee /etc/apt/sources.list.d/xenial.list - 创建pinning配置文件
/etc/apt/preferences.d/pin-aarch64-cross,优先使用Xenial的交叉工具链包:echo "Package: *-arm64-cross *-aarch64-linux-gnu Pin: release n=xenial Pin-Priority: 900" | sudo tee /etc/apt/preferences.d/pin-aarch64-cross - 更新仓库并安装旧版本的交叉工具链:
这种方法可能会触发依赖冲突,所以更推荐方案一。sudo apt update sudo apt install gcc-4.8-aarch64-linux-gnu libc6-dev-arm64-cross
内容的提问来源于stack exchange,提问作者MulattoKid

