linux 将多个文件上的eBPF程序编译成单个BPF对象文件

ui7jx7zq  于 2023-03-17  发布在  Linux
关注(0)|答案(1)|浏览(147)

我正在一个项目上工作的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目标文件?

gmxoilav

gmxoilav1#

编译器通常不支持将不同对象文件中的eBPF代码链接到一个对象文件中,因为有些特定于eBPF程序的处理要做,但libbpf(从v0.4.0开始)和依赖于此库的bpftool(v5.13)支持。特别是,您可以使用以下命令生成包含多个对象中eBPF字节码的单个对象文件:

$ bpftool gen object <output_file> <input_file> [<input_file> ...]

有关详细信息,请参阅相关的bpftool文档。

相关问题