eBPF - vmlinux.h 헤더 포함하는 방법 (bpf2go에서 사용)
지난 글에 만든 eBPF 소스코드를,
#include <linux/bpf.h>
#include <linux/types.h>
#include <bpf/bpf_helpers.h>
#include <bpf/bpf_tracing.h>
SEC("kprobe/sys_clone") int kprobe_sys_clone(void *ctx)
{
u64 bpf_id = bpf_get_current_pid_tgid();
pid_t tgid = bpf_id >> 32;
pid_t pid = bpf_id;
bpf_printk("[v1] pid == %d, thread_id == %d\n", tgid, pid);
return -1;
}
bpf2go를 호출하는 go generate로 생성하면 이런 오류가 발생합니다.
$ go generate
/mnt/c/temp/ebpf_sample/basic.c:12:5: error: use of undeclared identifier 'u64'
12 | u64 bpf_id = bpf_get_current_pid_tgid();
| ^
/mnt/c/temp/ebpf_sample/basic.c:13:5: error: use of undeclared identifier 'pid_t'
13 | pid_t tgid = bpf_id >> 32;
| ^
/mnt/c/temp/ebpf_sample/basic.c:14:5: error: use of undeclared identifier 'pid_t'
14 | pid_t pid = bpf_id;
| ^
/mnt/c/temp/ebpf_sample/basic.c:18:53: error: use of undeclared identifier 'tgid'
18 | bpf_printk("[v1] pid == %d, thread_id == %d\n", tgid, pid);
| ^
/mnt/c/temp/ebpf_sample/basic.c:18:58: error: use of undeclared identifier 'pid'
18 | bpf_printk("[v1] pid == %d, thread_id == %d\n", tgid, pid);
| ^
5 errors generated.
Error: compile: exit status 1
exit status 1
main.go:3: running "go": exit status 1
이와 유사한 다른 예제들을 보면,
// kprobe Example
// https://eunomia.dev/en/tutorials/2-kprobe-unlink/#kprobe-example
#include "vmlinux.h"
#include <bpf/bpf_helpers.h>
#include <bpf/bpf_tracing.h>
#include <bpf/bpf_core_read.h>
char LICENSE[] SEC("license") = "Dual BSD/GPL";
SEC("kprobe/do_unlinkat")
int BPF_KPROBE(do_unlinkat, int dfd, struct filename *name)
{
pid_t pid;
const char *filename;
// ...[생략]...
return 0;
}
// ...[생략]...
저렇게 "vmlinux.h" 헤더를 포함해 해결하는 듯한데요, 저게 도대체 어디서 오는 것일까요? ^^
What is vmlinux.h and Why is It Important for Your eBPF Programs?
; https://www.aquasec.com/blog/vmlinux-h-ebpf-programs/
그러니까,
bpftool을 이용해 /sys/kernel/btf/vmlinux 파일에 대해,
// https://www.kernel.org/doc/Documentation/ABI/testing/sysfs-kernel-btf
What: /sys/kernel/btf/vmlinux
Date: Aug 2019
KernelVersion: 5.5
Contact: bpf@vger.kernel.org
Description:
Read-only binary attribute exposing kernel's own BTF type
information with description of all internal kernel types. See
Documentation/bpf/btf.rst for detailed description of format
itself.
다음과 같이 C 헤더 파일로 변환해 저장한 것입니다.
$ bpftool btf dump file /sys/kernel/btf/vmlinux format c > vmlinux.h
이렇게 생성한 vmlinux.h 파일을 eBPF 소스코드가 있는 디렉터리에 복사한 후, #include 부분에서 "vmlinux.h"를 포함하면 됩니다.
#include "vmlinux.h"
// #include <linux/bpf.h>
// #include <linux/types.h>
#include <bpf/bpf_helpers.h>
#include <bpf/bpf_tracing.h>
// ...[생략]...
[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]