编译sched_tp.ko内核模块时pahole报vmlinux无效参数错误
启用FTrace的ARM64内核模块编译pahole报错排查
操作流程复现
编译带FTrace与调试信息的Linux内核
执行以下命令完成内核编译:
$ cd /path/to/linux-debug-workshop $ source /path/to/environment-setup-aarch64-poky-linux $ make training_defconfig $ ./scripts/config -e CONFIG_FTRACE $ ./scripts/config -e CONFIG_DEBUG_INFO $ ./scripts/config -e CONFIG_DEBUG_INFO_DWARF5 $ ./scripts/config -e CONFIG_DEBUG_INFO_BTF $ ./scripts/config -d CONFIG_DEBUG_INFO_REDUCED $ make -j$(nproc) Image dtbs modules
编译完成后会在/path/to/linux-debug-workshop目录下生成vmlinux文件。
编译sched_tp.ko内核模块
后续执行以下命令编译模块:
$ cd /path/to/lisa $ source /path/to/poky/poky/3.1.9/environment-setup-aarch64-poky-linux $ source init_env $ ./tools/kmodules/build_module \ /path/to/linux-debug-workshop ./tools/kmodules/sched_tp/
报错信息
编译模块时抛出如下错误:
Building module for ARCH=arm64 make: Entering directory 'linux-debug-workshop/lisa/tools/kmodules/sched_tp' make -C /linux-debug-workshop M=/linux-debug-workshop/lisa/tools/kmodules/sched_tp modules make[1]: Entering directory '/linux-debug-workshop' pahole -F btf,dwarf -E --suppress_force_paddings --show_only_data_members --skip_missing --expand_types_once --expanded_prefix "KERNEL_PRIVATE_" -C file:///linux-debug-workshop/lisa/tools/kmodules/sched_tp/private_types.txt /linux-debug-workshop/vmlinux > _header pahole: /linux-debug-workshop/vmlinux: Invalid argument
当前环境已确认pahole版本为v1.23。
报错根因
该错误由两个核心问题触发:
- pahole版本兼容性缺陷:v1.23版本的pahole对DWARF5格式调试信息的支持存在已知bug,当vmlinux同时开启
CONFIG_DEBUG_INFO_DWARF5和CONFIG_DEBUG_INFO_BTF时,pahole无法正确识别aarch64架构vmlinux的调试段格式,执行双格式(btf+dwarf)解析时直接返回参数无效错误。 - 交叉编译环境不匹配:编译内核和编译模块时source了不同路径下的poky环境初始化脚本,两次加载的环境中pahole、binutils、交叉编译器版本可能存在差异,会进一步加剧调试信息解析的兼容性问题。
排查解决步骤
按以下顺序操作即可解决问题:
- 首先验证内核编译产物完整性,执行
readelf -S /path/to/linux-debug-workshop/vmlinux | grep -E "(debug_info|BTF)",确认输出中存在.debug_info和.BTF段,排除内核编译阶段调试信息未正确生成的问题。 - 解决pahole与DWARF5的兼容性问题,二选一即可:
- 方案1:升级环境内pahole版本到v1.25及以上,该版本已修复DWARF5解析的相关bug,升级后无需修改内核配置。
- 方案2:临时调整内核调试信息格式为DWARF4,重新编译内核:
cd /path/to/linux-debug-workshop ./scripts/config -d CONFIG_DEBUG_INFO_DWARF5 ./scripts/config -e CONFIG_DEBUG_INFO_DWARF4 make -j$(nproc) Image dtbs modules
- 统一交叉编译环境,编译内核和编译内核模块阶段必须source同一份poky环境初始化脚本,禁止混用不同版本的交叉编译工具链。
- 若上述操作后仍报错,可临时修改
tools/kmodules/sched_tp/目录下的Makefile,将pahole调用参数中的-F btf,dwarf改为-F dwarf,跳过BTF格式解析验证是否为BTF段损坏导致的错误。
内容的提问来源于stack exchange,提问作者user3565150
相关产品推荐
相关产品推荐

