c - 致命错误:找不到“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
解决方案
当您使用#include <linux/something.h> 编译用户空间程序时,您提取的头文件来自/usr/include/linux(从内核存储库中的include/uapi 安装)。
内核空间标头是故意不同的,以防止您尝试访问无法从内核外部访问的内容。
更新:我不是 bpf 程序方面的专家,但快速阅读表明 bpf 示例是(或在某些时候)使用 Linux 内核的 KConfig Makefile 系统编译的。如果您使用 samples/bpf/Makefile 作为模板,您可能能够针对更多的内核头文件进行编译。我不确定这是否是故意的。
推荐阅读
- android - SetBackgroundColor 到自定义适配器上的列表视图项不起作用
- ember.js - Ember 并发超时挂在 qunit
- swift - MapKit addAnnotation 与 addAnnotations
- ios - Catalyst 应用的 Firebase 权限被拒绝
- javascript - 对获取 DataTables Render Text Helper 感到困惑?
- python - python 2/3升级后运行django测试出错,unittest.loader._FailedTest
- python - 根据某些条件计算值并将其分配给新变量
- javascript - 类中数组的 Javascript 总和
- go - 如何在 Go 代码覆盖率计算中包含所有文件?
- r - 找到 Prophet 模型中变量的指定重要性?