Ubuntu20.04下bpftool读取/sys/kernel/btf/vmlinux报错如何解决
故障可能原因
- bpftool版本不兼容:你当前使用的5.4版本bpftool不支持直接读取raw BTF格式的
/sys/kernel/btf/vmlinux文件,该版本的bpftool默认将输入文件识别为ELF格式尝试解析ELF头,因此抛出"failed to get EHDR"的格式错误。直接导出raw BTF为C头文件的功能是在5.8及以上版本的bpftool中才正式支持的。 - 内核编译阶段BTF生成异常:即使开启了对应内核配置,如果编译时使用的pahole(dwarves包)版本过低,也会导致生成的BTF文件格式不符合规范。Ubuntu 20.04默认源提供的dwarves版本为1.15,生成BTF推荐使用1.17及以上版本的pahole。
- BTF文件损坏:内核编译或安装过程中出现异常,可能导致
/sys/kernel/btf/vmlinux文件本身损坏。
排查与解决方法
- 先验证BTF文件本身有效性,执行命令:
pahole /sys/kernel/btf/vmlinux,如果可以正常输出内核结构体定义则说明BTF文件无问题,故障原因为bpftool版本过低。 - 升级bpftool,可选择任意一种方式:
- 安装更高版本的系统自带工具:
sudo apt install linux-tools-generic,安装完成后用新版本bpftool重新执行导出命令即可。 - 从源码编译最新版libbpf和bpftool,获得完整功能支持。
- 安装更高版本的系统自带工具:
- 如果pahole验证BTF文件报错,则先升级dwarves包后重新编译内核:
升级完成后重新编译内核,确保CONFIG_DEBUG_INFO_BTF配置生效后再尝试导出。sudo add-apt-repository ppa:ubuntu-toolchain-r/ppa sudo apt update && sudo apt install dwarves - 临时替代方案:如果不想升级bpftool,可以直接用pahole导出vmlinux.h头文件:
pahole --dump_c_header /sys/kernel/btf/vmlinux > vmlinux.h,生成的头文件可直接用于CO:RE开发。
内容的提问来源于stack exchange,提问作者Dennis
相关产品推荐
相关产品推荐

