小编Den*_*nis的帖子

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

我正在尝试从 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 版本

c++ linux bpf ebpf

5
推荐指数
1
解决办法
4293
查看次数

eBPF:raw_tracepoint 参数

我正在进入 eBPF 编程并想要使用原始跟踪点,但我不太明白如何使用它们以及如何正确访问参数。我将不胜感激任何对文档的帮助和提示。

我的问题:

  1. 如何使用 raw_tracepoint 而不是跟踪点从系统调用获取参数?
  2. uint16_t common_type;顺便说一句:原始跟踪点是什么?

系统:Ubuntu 2004,内核 5.4 通用,x86_64

解释/示例:

我从“正常跟踪点”开始sys_enter_kill,我可以在其中使用以下参数创建结构sudo cat /sys/kernel/debug/tracing/events/syscalls/sys_enter_kill/format


// sudo cat /sys/kernel/debug/tracing/events/syscalls/sys_enter_kill/format
// name: sys_enter_kill
// ID: 184
// format:
//  field:unsigned short common_type;   offset:0;   size:2; signed:0;
//  field:unsigned char common_flags;   offset:2;   size:1; signed:0;
//  field:unsigned char common_preempt_count;   offset:3;   size:1;signed:0;
//  field:int common_pid;   offset:4;   size:4; signed:1;

//  field:int __syscall_nr; offset:8;   size:4; signed:1;
//  field:pid_t pid;    offset:16;  size:8; signed:0;
//  field:int sig;  offset:24;  size:8; signed:0;

struct syscalls_enter_kill_args …
Run Code Online (Sandbox Code Playgroud)

c c++ linux bpf ebpf

5
推荐指数
1
解决办法
2068
查看次数

标签 统计

bpf ×2

c++ ×2

ebpf ×2

linux ×2

c ×1