首页 > 解决方案 > 如何从内核源代码树中编译工具和示例?(例如 bpftool、bpf 样本)

问题描述

目标:编译samples/bpf、编译bpf/bpftool和使用它们。

问题:在带有内核的 Ubuntu 18.04 仿生虚拟机上,4.18.0-25-generic我安装了内核 src 代码正在执行apt install linux-source-4.18.0。现在我cd进入/usr/src/linux-source-4.18.0/linux-source-4.18.0/samples/bpf并运行make,结果是

make -C ../../ /usr/src/linux-source-4.18.0/linux-source-4.18.0/samples/bpf/ BPF_SAMPLES_PATH=/usr/src/linux-source-4.18.0/linux-source-4.18.0/samples/bpf
make[1]: Entering directory '/usr/src/linux-source-4.18.0/linux-source-4.18.0'
scripts/kconfig/conf  --syncconfig Kconfig
***
*** Configuration file ".config" not found!
***
*** Please run some configurator (e.g. "make oldconfig" or
*** "make menuconfig" or "make xconfig").
***
scripts/kconfig/Makefile:40: recipe for target 'syncconfig' failed
make[3]: *** [syncconfig] Error 1
Makefile:562: recipe for target 'syncconfig' failed
make[2]: *** [syncconfig] Error 2
make[1]: *** No rule to make target 'include/config/auto.conf', needed by 'include/config/kernel.release'.  Stop.
make[1]: Leaving directory '/usr/src/linux-source-4.18.0/linux-source-4.18.0'
Makefile:203: recipe for target 'all' failed
make: *** [all] Error 2

如果我cd进入 ../samples/bpf并运行sudo make结果是

Auto-detecting system features:
...                        libbfd: [ OFF ]
...        disassembler-four-args: [ OFF ]

  CC       map_perf_ring.o
  CC       xlated_dumper.o
  CC       perf.o
  CC       cfg.o
  CC       common.o
  CC       cgroup.o
  CC       main.o
main.c:36:10: fatal error: bfd.h: No such file or directory
 #include <bfd.h>
          ^~~~~~~
compilation terminated.
Makefile:92: recipe for target 'main.o' failed
make: *** [main.o] Error 1

问题:我错过了什么?在我编译它们之后,如果我想编写一个程序,例如,需要使用bpftool我必须在源内核目录中编写程序,或者我可以在任何地方编写它?

标签: makefilekernelbpf

解决方案


构建错误

第一种情况( Makefile:562: recipe for target 'syncconfig' failed) 失败,因为您make从 linux 内核存储库的顶部运行,并且在尝试编译示例之前,构建系统尝试加载配置文件以用于您的系统(但没有找到)。

在尝试构建示例 ( ) 之前,您可以从当前的内核配置make -C samples/bpf创建一个文件,如下所示:.config

$ cp /usr/src/linux-headers-$(uname -r)/.config <path to repo>/.config
$ make olddefconfig

或者甚至只是从头开始生成默认配置文件:

$ make defconfig

从顶层目录查看make help可用的 make 选项。

您的第二个错误(关于bfd.h未找到)是您错过了一个库。Ubuntu 上的 libbfd 带有 binutils-dev,所以apt install binutils-dev应该这样做。

编译程序

最后,关于您关于编译程序的问题:

  • 您可以从内核存储库编写和构建程序,只需创建一个新示例并重用现有的 Makefile。
  • 您还可以在内核树之外编写和编译程序。编译它们的基本clang(v4.0 或更高版本,如果可能,v6.0 或更高版本)命令通常如下所示:
$ clang -O2 -emit-llvm -c my_bpf_prog.c -o - | \
          llc -march=bpf -filetype=obj -o my_bpf_prog.o

您可以在该存储库(免责声明:由我的公司提供)或XDP 教程存储库中找到从内核树编译的程序示例。


推荐阅读