最近在编译5.15.138版本内核的时候,由于启用了BTF功能,导致在编译过程中报错,网上好多教程都存在坑,本人研究测试下来能用,特此记录一下,供有需要的人参考。
内核编译环境:centos7 内核配置文件启用参数:CONFIG_DEBUG_INFO_BTF
1、报错一:.tmp_vmlinux.btf: pahole (pahole) is not available
BTF: .tmp_vmlinux.btf: pahole (pahole) is not available
Failed to generate BTF for vmlinux
Try to disable CONFIG_DEBUG_INFO_BTF
make: *** [Makefile:1161: vmlinux] Error 1
解决方法:
一般是系统缺少dwarves软件包导致,下载安装dwarves软件包即可。
yum install dwarves
2、报错二:pahole版本过低
DESCEND objtool
DESCEND bpf/resolve_btfids
CALL scripts/atomic/check-atomics.sh
CALL scripts/checksyscalls.sh
CHK include/generated/compile.h
GEN .version
CHK include/generated/compile.h
UPD include/generated/compile.h
CC init/version.o
AR init/built-in.a
LD vmlinux.o
MODPOST vmlinux.symvers
MODINFO modules.builtin.modinfo
GEN modules.builtin
BTF: .tmp_vmlinux.btf: pahole version v1.9 is too old, need at least v1.16
Failed to generate BTF for vmlinux
Try to disable CONFIG_DEBUG_INFO_BTF
make: *** [Makefile:1161: vmlinux] Error 1
解决方法:
我们需要去下载dwarves的src.rpm文件自己编译,这里提供阿里云镜像站仓库网址去下载:https://developer.aliyun.com/packageSearch?word=dwarves
这里推荐先将文件下载下来,然后上传到服务器上。因为本人直接在服务器上通过wget拉取该软件包会卡住、没反应。
步骤一:安装编译dwarves相关的工具包。
yum install -y rpm-build mock
步骤二:开始编译。
#将dwarves包上传服务器,在其路径下执行以下命令
rpmbuild --rebuild dwarves-1.17-1.el7.src.rpm
出现报错:
-- Build files have been written to: /root/rpmbuild/BUILD/dwarves-1.17
+ %cmake_build
/var/tmp/rpm-tmp.a8akI5: line 47: fg: no job control
error: Bad exit status from /var/tmp/rpm-tmp.a8akI5 (%build)
如果最后包下面有上边的报错,说明没有安装完全,跳过这个错误执行后面命令。
cd /root/rpmbuild/BUILD/dwarves-1.17
make
make install
最后查看pahole版本。
pahole --version
此时大功告成,即可开始编译内核了。当然编译内核过程中出现BTF报错的时候,如若用不到BTF功能,可以根据提示在内核配置文件中禁用掉CONFIG_DEBUG_INFO_BTF,也是没问题的。