Linux BTF:bpftool:无法从 /sys/kernel/btf/vmlinux 获取 EHDR

Den*_*nis 5 c++ linux bpf ebpf

我正在尝试从 BPF CO:RE 开发开始。在虚拟机中使用 Ubuntu 20.04 LTS,我需要重新编译内核并安装 pahole(来自 apt install dwarves),以便启用 BTF(我设置 CONFIG_DEBUG_FS=y 和 CONFIG_DEBUG_INFO_BTF=y)。

所以我的设置是:

  • 乌班图20.04
  • 内核 5.4.0-90-通用
  • bpftool --版本:/usr/lib/linux-tools/5.4.0-90-generic/bpftool v5.4.148

/sys/kernel/btf/vmlinux 存在,可以用 cat 读出。

但 bpftool 显示以下错误:

$ sudo bpftool btf dump file /sys/kernel/btf/vmlinux format c

libbpf: failed to get EHDR from /sys/kernel/btf/vmlinux
Error: failed to load BTF from /sys/kernel/btf/vmlinux: Unknown error -4001
Run Code Online (Sandbox Code Playgroud)

https://github.com/libbpf/libbpf/blob/master/src/libbpf.h 看来它是LIBBPF_ERRNO__FORMAT, /* BPF 对象格式无效 */ 但我无法找出问题所在。

有谁知道错误可能出在哪里?

提前致谢!

编辑:添加了 bpftool 版本

pch*_*gno 5

需要更新 bpftool以支持在输入文件不是目标文件时将 BTF 作为原始数据读取的回退。所需的最低 bpftool 版本是 v5.5,因为这是补丁所在的 Linux 版本。一般来说,我建议始终使用最新的 bpftool 版本,因为没有向后移植。