Ubuntu22.04编译旧Linux内核(5.2.21)的GLIBC问题解决问询
修复GLIBC版本缺失错误 & Ubuntu22.04编译旧Linux内核方案
一、解决Docker映射目录编译的GLIBC错误
错误原因
主机Ubuntu22.04的GLIBC版本为2.35,而gcc:8容器基于旧版Debian(stretch),GLIBC版本仅为2.24。之前在主机上编译内核时生成了fixdep等工具二进制,这些文件依赖主机的高版本GLIBC,映射到容器后运行就会触发版本缺失错误。
修复步骤
- 清理主机目录的编译残留
在主机的内核源码目录执行,彻底清除所有编译生成文件:
make distclean
或手动删除关键残留文件:
rm -rf tools/objtool/fixdep .config *.o .tmp_versions
之后重新用Docker容器编译:
docker run --rm --user $(id -u):$(id -g) -v $(pwd):/code gcc-8 make -C /code
- 容器内强制重新生成工具二进制
若不想清理主机目录,可在容器内先清理工具链文件再编译:
docker run --rm --user $(id -u):$(id -g) -v $(pwd):/code gcc-8 bash -c "make -C /code clean && make -C /code"
容器会用自身的gcc-8重新生成适配低版本GLIBC的fixdep,避免依赖冲突。
二、Ubuntu22.04编译旧Linux内核(5.2.21)的可行方案
方案1:Docker容器编译(推荐)
选择兼容性更好的基础镜像,规避工具链版本冲突:
优化后的Dockerfile
FROM ubuntu:18.04 ARG DEBIAN_FRONTEND=noninteractive # 安装gcc-8及编译依赖 RUN apt-get update -y && apt-get install -y --no-install-recommends \ gcc-8 g++-8 build-essential libssl-dev libncursesw5-dev \ git curl bc flex bison libelf-dev make cmake # 设置默认编译器为gcc-8 RUN update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-8 100 \ && update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-8 100
编译命令
构建镜像后执行编译:
# 构建镜像 docker build -t kernel-build:gcc8 . # 编译内核 docker run --rm --user $(id -u):$(id -g) -v $(pwd):/code kernel-build:gcc8 make -C /code
方案2:主机直接编译
无需Docker,直接在Ubuntu22.04上调整编译选项或安装旧版gcc:
方法A:关闭冲突的编译器选项
Ubuntu22.04的gcc默认开启-fcf-protection,与旧内核的-mindirect-branch冲突,编译时关闭该选项即可:
make CFLAGS="-fcf-protection=none"
或修改内核根目录的Makefile,在KBUILD_CFLAGS中添加-fcf-protection=none。
方法B:安装旧版gcc-8到主机
- 安装gcc-8:
sudo apt update sudo apt install gcc-8 g++-8
- 指定gcc-8编译:
CC=gcc-8 make
旧版gcc默认不会开启-fcf-protection,自然避免冲突。
内容的提问来源于stack exchange,提问作者xiaogw
相关产品推荐
相关产品推荐

