Я написал следующую программу 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
, то есть длина продолжает выходить как ноль. Выполнение strace
в программе, которую я использую для тестирования этой программы BPF (то есть той, которая выполняет системный вызов connect), показывает, что длина не равна 0. Что я делаю неправильно?
Эта программа работает аналогично примеру с ядром Linux здесь , поэтому я совершенно запутался, почему это не работает.
uname -a
: Linux ubuntu-bionic 4.18.0-16-generic # 17 ~ 18.04.1-Ubuntu SMP Вт 12 февраля 13:35:51 UTC 2019 x86_64 x86_64 x86_64 GNU / Linux
EDIT: исправлено с помощью SEC("kprobe/__sys_connect")
, до использования __x64_sys_connect
из-за режима совместимости gobpf здесь - не уверен, почему это помогло