前段时间编译 bpf c 文件,都是用的 bpf2go 这个 go 包,这个包尽管很不便,然而指定参数比拟艰难,
学习到 tracee falco 这种大型项目都是通过 makefile 间接编译 bpf 代码,因而打算本人写 Makefile
clang -D__KERNEL__ -D__ASM_SYSREG_H \
-D__BPF_TRACING__ \
-Wunused \
-Wall \
-Wno-frame-address \
-Wno-unused-value \
-Wno-unknown-warning-option \
-Wno-pragma-once-outside-header \
-Wno-pointer-sign \
-Wno-gnu-variable-sized-type-not-at-end \
-Wno-deprecated-declarations \
-Wno-compare-distinct-pointer-types \
-Wno-address-of-packed-member \
-fno-stack-protector \
-fno-jump-tables \
-fno-unwind-tables \
-fno-asynchronous-unwind-tables \
-xc \
-nostdinc \
-I $(LIBBPF_HEADERS)\
-include $(KERN_SRC_PATH)/include/linux/kconfig.h \
-I$(BPF_HEADERS) \
-I$(KERN_SRC_PATH)/include \
-I$(KERN_SRC_PATH)/include/uapi \
-I$(KERN_SRC_PATH)/include/generated \
-I$(KERN_SRC_PATH)/include/generated/uapi \
-I$(KERN_SRC_PATH)/arch/$(linux_arch)/include \
-I$(KERN_SRC_PATH)/arch/$(linux_arch)/include/uapi \
-I$(KERN_SRC_PATH)/arch/$(linux_arch)/include/generated \
-I$(KERN_SRC_PATH)/arch/$(linux_arch)/include/generated/uapi \
-O2 -emit-llvm \
$(BPF_SRC) \
-c -o - | llc -march=bpf -filetype=obj -o $(OUT_BPF)
Makefile 写起来很简略,生产.o 文件也很 easy,然而当用 cilium/ebpf 加载生成的.o 文件时,却报错
loading objects: %v can't load DemoInfo: load BTF maps: missing BTF
2021/12/24 16:35:05 link func: prog cannot be nil: invalid input
什么状况,我没有用 BTF 啊,为啥会报这个谬误。
于是开始调试 bpf2go 包,在认真比照他的编译参数的时候,终于发现了区别
也就是说生成的.o 带调试信息即可,也就是加上 - g 参数,坑啊,就不能提醒的清晰一些吗???
于是给 Makefile 中退出 - g 参数,解决了问题,耗时 2 天,特此记录。
本文由博客一文多发平台 OpenWrite 公布!