【问题标题】:Linux BTF: bpftool: Failed to get EHDR from /sys/kernel/btf/vmlinuxLinux BTF:bpftool:无法从 /sys/kernel/btf/vmlinux 获取 EHDR
【发布时间】:2022-01-02 17:05:09
【问题描述】:

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

所以我的设置是:

  • Ubuntu 20.04
  • 内核 5.4.0-90-generic
  • bpftool --version: /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

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

有谁知道哪里出错了?

提前致谢!

编辑:添加 bpftool 版本

【问题讨论】:

  • 你的 bpftool 版本是什么? (bpftool version)。您是否尝试过使用最新版本?
  • 是v5.4.148,在哪里可以看到最新的版本?
  • 最新版本附带最新的内核源代码 :) 如果您有内核源代码的本地克隆,您可以从那里build bpftool。但请注意,我不知道使用更新的版本是否能解决问题,我只是建议它可能值得检查。
  • 因为我没有使用最新的内核,所以从我使用的内核源构建 bpftool 并没有改变任何东西。我可以下载最新的内核并试一试,但我猜它仍然应该与内核附带的 bpftool 一起工作:/
  • 您尝试过raw 格式吗?

标签: c++ linux bpf ebpf


【解决方案1】:

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

【讨论】:

  • 因此是最初的建议。感谢 pchaigno 找到相关的提交! +1
  • 谢谢! :D 另一个问题:在 bpftool 5.5 之前获取 vmlinux.h 的官方方法是什么?
  • 我猜它会在你的应用程序中使用 libbpf,就像 bpftool 在补丁之后所做的那样。目前我不知道有任何其他用于转储 BTF 信息的命令行工具。
  • 谢谢! pahole 怎么样,它也可以生成(略有不同!:/)vmlinux.h?
  • 啊,也许是pahole。我不记得了。它可以转储 BTF,还是仅将其生成为二进制数据?
【解决方案2】:

更新: 看起来 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) (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 并使用它。

【讨论】:

  • 很高兴您找到了解决方法。对于它的价值,file /sys/kernel/btf/vmlinux 还在我的设置中返回databpftool 可以成功读取它。不过,我不确定您的情况出了什么问题,抱歉。
猜你喜欢
  • 1970-01-01
  • 2020-12-23
  • 1970-01-01
  • 2013-10-25
  • 2020-07-12
  • 2013-06-27
  • 2015-09-19
  • 2023-03-05
  • 1970-01-01
相关资源
最近更新 更多