无法编译示例 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.hapt-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> 中的包含路径,使其指向您的库。)