当我在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
// ....
}
|
此外,在低版本和高版本之间,还有很多除了名字不同之前,完全相同的结构体可以使用此方法解决。