我编写了以下BPF程序:
#include <uapi/linux/ptrace.h>
#include <uapi/linux/bpf.h>
#include <linux/version.h>
#include "include/bpf_helpers.h"
#define DEBUG
#ifdef DEBUG
/* Only use this for debug output. Notice output from bpf_trace_printk()
* ends up in /sys/kernel/debug/tracing/trace_pipe
*/
#define bpf_debug(fmt, ...) \
({ \
char ____fmt[] = fmt; \
bpf_trace_printk(____fmt, sizeof(____fmt), ##__VA_ARGS__); \
})
#else
#define bpf_debug(fmt, ...){;}
#endif
SEC("kprobe/sys_connect")
int bpf_prog1(struct pt_regs *ctx)
{
int sockaddr_len = (int)PT_REGS_PARM3(ctx);
bpf_debug("sockaddr_len: %d\n", sockaddr_len);
return 0;
}
char _license[] SEC("license") = "GPL";
__u32 _version SEC("version") = LINUX_VERSION_CODE;
这可以成功编译和加载(使用gobpf-elf),但是运行cat /sys/kernel/debug/tracing/trace_pipe
可以看到...sockaddr_len: 0
,即长度始终为零。在我用来测试该BPF程序的程序(即进行连接syscall的程序)上运行strace
时,该长度不为0。我在做什么错了?
该程序的功能类似于Linux内核示例here,所以我很困惑为什么它不起作用。
uname -a
:Linux ubuntu-bionic 4.18.0-16-generic#17〜18.04.1-Ubuntu SMP Tue Feb 12 13:35:51 UTC 2019 x86_64 x86_64 x86_64 GNU / Linux
编辑:由于gobpf的兼容模式here,在使用SEC("kprobe/__sys_connect")
之前使用__x64_sys_connect
对其进行了修复-不确定为什么这样做