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

Linux BTF: bpftool: Failed to get EHDR from /sys/kernel/btf/vmlinux

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

所以我的设置是:

/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

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

有谁知道哪里出错了?

提前致谢!

编辑:添加了 bpftool 版本

更新: 看起来 bpftool 只接受一个包含编译运行内核的 ELF 文件,但我的 /sys/kernel/btf/vmlinux 不是:

$ file /sys/kernel/btf/vmlinux 
/sys/kernel/btf/vmlinux: data

/boot/vmlinuz 相同:

$ sudo file /boot/vmlinuz-5.4.0-90-generic 
/boot/vmlinuz-5.4.0-90-generic: Linux kernel x86 boot executable bzImage, version 5.4.0-90-generic (root@elde-dev) #101+test1 SMP Tue Nov 23 16:38:41 UTC 2021, RO-rootFS, swap_dev 0xD, Normal VGA

有人知道为什么我的 /sys/kernel/btf/vmlinux 没有显示正确的格式吗?

我找到了这个解决方法:
使用此脚本 (https://elixir.bootlin.com/linux/latest/source/scripts/extract-vmlinux) as suggested here (https://unix.stackexchange.com/questions/610672/where-is-the-linux-kernel-elf-file-located) 我可以获得“工作”vmlinux 文件,然后 bpftool 可以读取该文件。但这并不是 BPF 的正确方法 CO:RE 我猜...另外,在所有教程中,bpftool 直接与 /sys/kernel/btf/vmlinux.
一起使用 那么为什么我会得到错误的格式?

编辑:如上建议,只需下载最新的 linux 内核,从那里编译 bpftool 并使用它。

需要更新 bpftool 以支持 a fallback to reading BTF as raw data if the input file is not an object file。所需的最低 bpftool 版本是 v5.5,因为这是补丁登陆的 Linux 版本。一般来说,我建议始终使用最新的 bpftool 版本,因为没有反向移植。