个人环境
ubantu 22.04
内核版本:5.15.0-127-generic
第二章
环境上编译linux-observability-with-bpf配套代码hello_word时报错:
对应下载的内核源码samples/bpf下没有bpf_load.c。这是什么原因?
加载BPF程序的用户态代码里也#include “bpf_load.h”。samples/bpf下也没有bpf_load.h。下载的配套示例代码没有任何修改,内核代码也是正常下载,不知道原因出在哪里?
#include "bpf_load.h"
#include <stdio.h>
int main(int argc, char **argv) {
if (load_bpf_file("bpf_program.o") != 0) {
printf("The kernel didn't load the BPF program\n");
return -1;
}
read_trace_pipe();
return 0;
}
有没有可能是5.15.0的内核代码samples/bpf下没有了bpf_load.c和bpf_load.h?
内核官网上下载5.15.175和5.10.232版本代码,对比发现5.15版本samples/bpf下确实没有这两个文件,5.10版本下有这两个文件。说明是内核版本差异,5.15版本内核samples/bpf下删除了这两个文件。
网上查找资料,发现5.11版本以上,内核对BPF模块进行了修改:
5.11BPF修改
将5.10内核bpf_load.c和bpf_load.h拷贝到5.15内核代码里即可解决。
链接里修改了用户态代码,注释了read_trace_pipe,该函数会在内核执行execve事件时,打印出"Hello, BPF World!"。
问题解决的还不彻底,如何放开read_trace_pipe的注释?
在5.15内核代码里搜索read_trace_pipe,发现定义在tools/testing/selftests/bpf/trace_helpers.h。
加上#include “trace_helpers.h”:
#include "bpf_load.h"
#include "trace_helpers.h"
#include <stdio.h>
int main(int argc, char **argv) {
if (load_bpf_file("bpf_program.o") != 0) {
printf("The kernel didn't load the BPF program\n");
return -1;
}
read_trace_pipe();
return 0;
}
修改makefile
可以正确编译。
运行效果如下: