Featured image of post eBPF报错: fail to resolve CO-RE relocation struct trace_event_raw_sys_enter

eBPF报错: fail to resolve CO-RE relocation struct trace_event_raw_sys_enter

eBPF报错: fail to resolve CO-RE relocation struct trace_event_raw_sys_enter

当我在CentOS 7.6.1810 (内核版本: 3.10-957.el7.x86_64)上,运行使用tracepoint的bpf程序时遇到的如下错误:

1
2
3
4
libbpf: prog 'tp_sys_enter_connect': -- BEGIN PROG LOAD LOG --
0: <invalid CO-RE relocation>
failed to resolve CO-RE relocation <byte_off> [200] struct trace_event_raw_sys_enter.args[0] (0:2:0 @ offset 16)
-- END PROG LOAD LOG --

当然,我肯定是使用了从btfhub下载的BTF文件。报错信息提示] struct trace_event_raw_sys_enter这个结构体信息似乎找不到。

于是bpftool btf dump file 3.10.0-957.el7.x86_64.btf format c > vmlinux_310.h得到一下对应的头文件,查看后确实没发现该结构体。

但是找到了:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
struct ftrace_raw_sys_enter {
    struct trace_entry ent;
    long int id;
    long unsigned int args[6];
    char __data[0];
};

struct ftrace_raw_sys_exit {
    struct trace_entry ent;
    long int id;
    long int ret;
    char __data[0];
};

而高版本中:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
struct trace_event_raw_sys_enter {
    struct trace_entry ent;
    long int id;
    long unsigned int args[6];
    char __data[0];
};

struct trace_event_raw_sys_exit {
    struct trace_entry ent;
    long int id;
    long int ret;
    char __data[0];
};

其实可以发现,除了名称不一样,其他地方完全一样。

所以,解决方法可以是:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
struct custom_raw_sys_enter {
    struct trace_entry ent;
    long int id;
    long unsigned int args[6];
    char __data[0];
};

struct custom_raw_sys_exit {
    struct trace_entry ent;
    long int id;
    long int ret;
    char __data[0];
};

在使用tracepoint的地方改为:

1
2
3
4
5
6
SEC("tracepoint/syscalls/sys_exit_connect")
int tp_sys_exit_connect(struct custom_raw_sys_exit *ctx) {
    // ....
    // your code 
    // ....
}

此外,在低版本和高版本之间,还有很多除了名字不同之前,完全相同的结构体可以使用此方法解决。

哦吼是一首歌。
Built with Hugo
Theme Stack designed by Jimmy