首页 > 解决方案 > 致命错误:找不到“linux/bio.h”文件

问题描述

当我尝试编译包含 bio.h 的 eBPF 程序时,出现错误。为什么我可以包含其他 Linux 头文件,但不能包含这个特定的头文件?

我使用以下命令编译

clang -O2 -target bpf -c src/bpf_program.c -Ikernel-src/tools/testing/selftests/bpf -Ikernel-src/tools/lib/bpf -o src/bpf_program.o

程序:

#include <asm/ptrace.h>
#include <linux/bpf.h>
#include "bpf_helpers.h"
#include <linux/bio.h>

SEC("kprobe/nvme_queue_rq")
int bpf_prog(struct pt_regs *ctx) {
    ..
}

char _license[] SEC("license") = "GPL";

我得到这个错误

src/bpf_program.c:4:10: fatal error: 'linux/bio.h' file not found
#include <linux/bio.h>
         ^~~~~~~~~~~~~
1 error generated.
make: *** [Makefile:36: build] Error 1

标签: clinuxlinux-kernelclang

解决方案


当您使用#include <linux/something.h> 编译用户空间程序时,您提取的头文件来自/usr/include/linux(从内核存储库中的include/uapi 安装)。

内核空间标头是故意不同的,以防止您尝试访问无法从内核外部访问的内容。

更新:我不是 bpf 程序方面的专家,但快速阅读表明 bpf 示例是(或在某些时候)使用 Linux 内核的 KConfig Makefile 系统编译的。如果您使用 samples/bpf/Makefile 作为模板,您可能能够针对更多的内核头文件进行编译。我不确定这是否是故意的。


推荐阅读