我正在用 eBPF 代码和一个文件做一个项目,它变得很长,我希望我可以把它分成多个文件。我正在尝试将多个文件构建到 bpf 目标文件中,然后将它们链接到一个目标文件中。这是我正在使用的 Makefile,
KDIR ?= /lib/modules/$(shell uname -r)/build
CLANG ?= clang
LLC ?= llc
ARCH := $(subst x86_64,x86,$(shell arch))
BIN := a.o
CLANG_FLAGS = -I. -I$(KDIR)/arch/$(ARCH)/include \
-I$(KDIR)/arch/$(ARCH)/include/generated \
-I$(KDIR)/include \
-I$(KDIR)/arch/$(ARCH)/include/uapi \
-I$(KDIR)/include/uapi \
-include $(KDIR)/include/linux/kconfig.h \
-D__KERNEL__ -D__BPF_TRACING__ -Wno-unused-value -Wno-pointer-sign \
-D__TARGET_ARCH_$(ARCH) -Wno-compare-distinct-pointer-types \
-Wno-gnu-variable-sized-type-not-at-end \
-Wno-address-of-packed-member -Wno-tautological-compare \
-O2 -emit-llvm
all: $(BIN)
a.o: program.c program.h
$(CLANG) $(CLANG_FLAGS) -g -c $< -o - | \
$(LLC) -march=bpf -mcpu=$(CPU) -filetype=obj -o $@
clean:
rm -f *.o
如何修改此 Makefile 以从多个 C 文件编译和链接 eBPF 目标文件?
编译器通常不支持将来自不同目标文件的 eBPF 代码链接到一个文件中,因为有一些特定于 eBPF 程序的处理要做,但 libbpf(自 v0.4.0 起)和 bpftool(v5.13 起)支持) 依赖于这个库。特别是,您可以使用以下命令从多个对象生成包含 eBPF 字节码的单个对象文件:
$ bpftool gen object <output_file> <input_file> [<input_file> ...]
有关详细信息,请参阅相关的 bpftool 文档。