无法编译示例 bpf 程序,缺少 bpf/bpf.h
Can't compile sample bpf program, bpf/bpf.h is missing
我正在尝试编译 Linux 源代码中的示例 bpf 程序。于是下载了当前内核源码,进入samples/bpf
文件夹
apt source linux
cd linux-*/samples/bpf
然后我尝试用gcc编译一个示例程序:
# gcc sock_example.c
sock_example.c:29:10: fatal error: bpf/bpf.h: No such file or directory
29 | #include <bpf/bpf.h>
| ^~~~~~~~~~~
compilation terminated.
而且我找不到 bpf/bpf.h
和 apt-file
# apt-file find bpf/bpf.h
(no output)
怎么了?
您需要安装libbpf:
git clone --depth 1 https://github.com/libbpf/libbpf
cd src
sudo make install
Linux eBPF 示例带有一个相当长的 Makefile。它处理了很多情况并与内核构建工作流程很好地集成,但使得在内核树之外构建示例变得更加复杂。
例如,此 Makefile 添加了一些包含目录,例如 TPROGS_CFLAGS += -I$(srctree)/tools/lib/
,这意味着 bpf/bpf.h
不会从您的 OS' 库中获取,而是从 [=12] 中获取=] 在您的内核存储库下。
以下是您可以考虑编译程序的几个选项:
- 调整现有的 Makefile 以使用它来构建您自己的程序,例如将您的内核代码添加到
tprogs-y
目标。
- 从内核仓库 (
sudo make -C tools/lib/bpf install
) 或 its GitHub mirror 安装 libbpf。这应该安装 headers,然后 gcc 应该能够找到它们。
- 调整你的编译选项来告诉 gcc 在哪里寻找 header (
gcc -I <path/to/linux>/tools/lib
).
- (调整
#include <bpf/bpf.h>
中的包含路径,使其指向您的库。)
我正在尝试编译 Linux 源代码中的示例 bpf 程序。于是下载了当前内核源码,进入samples/bpf
文件夹
apt source linux
cd linux-*/samples/bpf
然后我尝试用gcc编译一个示例程序:
# gcc sock_example.c
sock_example.c:29:10: fatal error: bpf/bpf.h: No such file or directory
29 | #include <bpf/bpf.h>
| ^~~~~~~~~~~
compilation terminated.
而且我找不到 bpf/bpf.h
和 apt-file
# apt-file find bpf/bpf.h
(no output)
怎么了?
您需要安装libbpf:
git clone --depth 1 https://github.com/libbpf/libbpf
cd src
sudo make install
Linux eBPF 示例带有一个相当长的 Makefile。它处理了很多情况并与内核构建工作流程很好地集成,但使得在内核树之外构建示例变得更加复杂。
例如,此 Makefile 添加了一些包含目录,例如 TPROGS_CFLAGS += -I$(srctree)/tools/lib/
,这意味着 bpf/bpf.h
不会从您的 OS' 库中获取,而是从 [=12] 中获取=] 在您的内核存储库下。
以下是您可以考虑编译程序的几个选项:
- 调整现有的 Makefile 以使用它来构建您自己的程序,例如将您的内核代码添加到
tprogs-y
目标。 - 从内核仓库 (
sudo make -C tools/lib/bpf install
) 或 its GitHub mirror 安装 libbpf。这应该安装 headers,然后 gcc 应该能够找到它们。 - 调整你的编译选项来告诉 gcc 在哪里寻找 header (
gcc -I <path/to/linux>/tools/lib
). - (调整
#include <bpf/bpf.h>
中的包含路径,使其指向您的库。)