背景
Ubuntu22.04 の組み込みカーネル バージョンは 5.15 です。今日、5.16.5 カーネルの上位バージョンをコンパイルしようとしましたが、コンパイル中に予期せずエラーが発生しました。
CALL scripts/checksyscalls.sh
CALL scripts/atomic/check-atomics.sh
DESCEND objtool
DESCEND bpf/resolve_btfids
CHK include/generated/compile.h
CHK kernel/kheaders_data.tar.xz
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
LD .tmp_vmlinux.btf
BTF .btf.vmlinux.bin.o
LD .tmp_vmlinux.kallsyms1
KSYMS .tmp_vmlinux.kallsyms1.S
AS .tmp_vmlinux.kallsyms1.S
LD .tmp_vmlinux.kallsyms2
KSYMS .tmp_vmlinux.kallsyms2.S
AS .tmp_vmlinux.kallsyms2.S
LD vmlinux
BTFIDS vmlinux
FAILED: load BTF from vmlinux: Invalid argument
make: *** [Makefile:1161: vmlinux] Error 255
make: *** Deleting file 'vmlinux'
オンラインで検索したところ、.config 構成ファイルの CONFIG_DEBUG_INFO_BTF=y を CONFIG_DEBUG_INFO_BTF=n に変更する必要があるとのことでした。こうすることで、コンパイル時にエラーが報告されなくなります。しかし、このオプション [ebpf 関連のオプション] を有効にしたいのですが、さらに調べたところ、pahole プログラムのバージョンが高すぎるためであることがわかりました。現在のバージョンは 1.25 です。
pahole --version
v1.25
解決
カーネル ソース ディレクトリ内の scripts/pahole-flags.sh スクリプトを変更し、次のシェル コード行を追加します。
if [ "${pahole_ver}" -ge "124" ]; then
# see PAHOLE_HAS_LANG_EXCLUDE
extra_paholeopt="${extra_paholeopt} --skip_encoding_btf_enum64"
fi
問題が解決しました。
参考:
https://lore.kernel.org/bpf/[email protected]/t/
https://bbs.archlinux.org/viewtopic.php?pid=2067555