Linux 编译期间未找到外部头文件

Linux 编译期间未找到外部头文件,linux,makefile,clang,bpf,Linux,Makefile,Clang,Bpf,我试图在树之外编译bpf示例。 这是我的文件夹: . ├── bpf_load.c ├── bpf_load.h ├── bpf_load.o ├── libbpf.h ├── Makefile ├── xdp1 ├── xdp1_kern.c ├── xdp1_kern.o ├── xdp1_user.c ├── xdp2_kern.c └── xdp2_user.c 这是Makefile: # # Makefile for out-of-tree building eBPF program

我试图在树之外编译bpf示例。 这是我的文件夹:

.
├── bpf_load.c
├── bpf_load.h
├── bpf_load.o
├── libbpf.h
├── Makefile
├── xdp1
├── xdp1_kern.c
├── xdp1_kern.o
├── xdp1_user.c
├── xdp2_kern.c
└── xdp2_user.c
这是Makefile:

#
# Makefile for out-of-tree building eBPF programs
#  similar to kernel/samples/bpf/
#
# Still depend on a kernel source tree.
#
TARGETS = xdp1

TOOLS_PATH = /usr/src/kernels/$(shell uname -r)/tools

TARGETS_ALL = $(TARGETS)

# Generate file name-scheme based on TARGETS
KERN_SOURCES = ${TARGETS_ALL:=_kern.c}
USER_SOURCES = ${TARGETS_ALL:=_user.c}
KERN_OBJECTS = ${KERN_SOURCES:.c=.o}
USER_OBJECTS = ${USER_SOURCES:.c=.o}

# Notice: the kbuilddir can be redefined on make cmdline
kbuilddir ?= /lib/modules/`uname -r`/build/
KERNEL=$(kbuilddir)

CFLAGS := -g -O2 -Wall

# Local copy of include/linux/bpf.h kept under ./kernel-usr-include
#
CFLAGS += /usr/include/linux/bpf.h
#
# Interacting with libbpf
CFLAGS += -I$(TOOLS_PATH)/lib
CFLAGS += -I$(TOOLS_PATH)/testing/selftests/bpf

LDFLAGS= -lelf

# Objects that xxx_user program is linked with:
OBJECT_LOADBPF = bpf_load.o
OBJECTS = $(OBJECT_LOADBPF)
#
# The static libbpf library
LIBBPF = $(TOOLS_PATH)/lib/bpf/libbpf.a

# Allows pointing LLC/CLANG to another LLVM backend, redefine on cmdline:
#  make LLC=~/git/llvm/build/bin/llc CLANG=~/git/llvm/build/bin/clang
LLC ?= llc
CLANG ?= clang

CC = gcc

NOSTDINC_FLAGS := -nostdinc -isystem $(shell $(CC) -print-file-name=include)

# TODO: can we remove(?) copy of uapi/linux/bpf.h stored here: ./tools/include/
# LINUXINCLUDE := -I./tools/include/
#
# bpf_helper.h need newer version of uapi/linux/bpf.h
# (as this git-repo use new devel kernel features)
KERNEL_PATH = /usr/src/kernels/$(shell uname -r)
LINUXINCLUDE := -I$(KERNEL_PATH)/include
#
LINUXINCLUDE += -I$(KERNEL_PATH)/arch/x86/include
LINUXINCLUDE += -I$(KERNEL_PATH)/arch/x86/include/generated/uapi
LINUXINCLUDE += -I$(KERNEL_PATH)/arch/x86/include/generated
LINUXINCLUDE += -I$(KERNEL_PATH)/include
LINUXINCLUDE += -I$(KERNEL_PATH)/arch/x86/include/uapi
LINUXINCLUDE += -I$(KERNEL_PATH)/include/uapi
LINUXINCLUDE += -I$(KERNEL_PATH)/include/generated/uapi
LINUXINCLUDE += -include $(KERNEL_PATH)/include/linux/kconfig.h
#LINUXINCLUDE += -I$(KERNEL)/tools/lib
EXTRA_CFLAGS=-Werror

all: dependencies $(TARGETS_ALL) $(KERN_OBJECTS)

.PHONY: dependencies clean verify_cmds verify_llvm_target_bpf $(CLANG) $(LLC)

# Most xxx_user program still depend on old bpf_load.c
$(OBJECT_LOADBPF): bpf_load.c bpf_load.h
    $(CC) $(CFLAGS) -o $@ -c $<

LIBBPF_SOURCES  = $(TOOLS_PATH)/lib/bpf/*.c

# New ELF-loaded avail in libbpf (in bpf/libbpf.c)
$(LIBBPF): $(LIBBPF_SOURCES) $(TOOLS_PATH)/lib/bpf/Makefile
    make -C $(TOOLS_PATH)/lib/bpf/ all

# Compiling of eBPF restricted-C code with LLVM
#  clang option -S generated output file with suffix .ll
#   which is the non-binary LLVM assembly language format
#   (normally LLVM bitcode format .bc is generated)
#
# Use -Wno-address-of-packed-member as eBPF verifier enforces
# unaligned access checks where necessary
#
$(KERN_OBJECTS): %.o: %.c Makefile
    $(CLANG) -S $(NOSTDINC_FLAGS) $(LINUXINCLUDE) $(EXTRA_CFLAGS) \
        -D__KERNEL__ -D__ASM_SYSREG_H \
        -D__BPF_TRACING__ \
        -Wall \
        -Wno-unused-value -Wno-pointer-sign \
        -D__TARGET_ARCH_$(ARCH) \
        -Wno-compare-distinct-pointer-types \
        -Wno-gnu-variable-sized-type-not-at-end \
        -Wno-tautological-compare \
        -Wno-unknown-warning-option \
        -Wno-address-of-packed-member \
        -O2 -emit-llvm -c $< -o ${@:.o=.ll}
    $(LLC) -march=bpf -filetype=obj -o $@ ${@:.o=.ll}

$(TARGETS): %: xdp1_user.c $(OBJECTS) $(LIBBPF) Makefile
    $(CC) $(CFLAGS) $(OBJECTS) $(LDFLAGS) -o $@ $<  $(LIBBPF)
#
#树外构建eBPF程序的生成文件
#类似于kernel/samples/bpf/
#
#仍然依赖于内核源代码树。
#
目标=xdp1
TOOLS\u PATH=/usr/src/kernels/$(shell uname-r)/TOOLS
目标\所有=$(目标)
#基于目标生成文件名方案
KERN_SOURCES=${TARGETS_ALL:=\u KERN.c}
USER\u SOURCES=${TARGETS\u ALL:=\u USER.c}
KERN_OBJECTS=${KERN_SOURCES:.c=.o}
USER\u OBJECTS=${USER\u SOURCES:.c=.o}
#注意:可以在make cmdline上重新定义kbuilddir
kbuilddir?=/lib/modules/`uname-r`/build/
内核=$(kbuilddir)
CFLAGS:=-g-O2-壁
#include/linux/bpf.h的本地副本保存在./kernel usr include下
#
CFLAGS+=/usr/include/linux/bpf.h
#
#与libbpf交互
CFLAGS+=-I$(工具路径)/lib
CFLAGS+=-I$(工具路径)/测试/自测试/bpf
LDFLAGS=-lelf
#xxx_用户程序链接到的对象:
对象\加载bpf=bpf\加载.o
OBJECTS=$(OBJECT\u LOADBPF)
#
#静态libbpf库
LIBBPF=$(工具路径)/lib/bpf/LIBBPF.a
#允许将LLC/CLANG指向另一个LLVM后端,在cmdline上重新定义:
#make LLC=~/git/llvm/build/bin/LLC CLANG=~/git/llvm/build/bin/CLANG
有限责任公司
叮当声
CC=gcc
NOSTDINC_标志:=-NOSTDINC-isystem$(shell$(CC)-print file name=include)
#TODO:我们是否可以删除存储在此处的uapi/linux/bpf.h的(?)副本:./tools/include/
#LINUXINCLUDE:=-I./tools/include/
#
#bpf_helper.h需要更新版本的uapi/linux/bpf.h
#(由于git repo使用了新的devel内核特性)
KERNEL\u PATH=/usr/src/kernels/$(shell uname-r)
LINUXINCLUDE:=-I$(内核路径)/include
#
LINUXINCLUDE+=-I$(内核路径)/arch/x86/include
LINUXINCLUDE+=-I$(内核路径)/arch/x86/include/generated/uapi
LINUXINCLUDE+=-I$(内核路径)/arch/x86/include/generated
LINUXINCLUDE+=-I$(内核路径)/include
LINUXINCLUDE+=-I$(内核路径)/arch/x86/include/uapi
LINUXINCLUDE+=-I$(内核路径)/include/uapi
LINUXINCLUDE+=-I$(内核路径)/include/generated/uapi
LINUXINCLUDE+=-include$(内核路径)/include/linux/kconfig.h
#LINUXINCLUDE+=-I$(内核)/tools/lib
额外费用=-Werror
所有:依赖项$(目标所有)$(内核对象)
.PHONY:dependencies clean verify\u cmds verify\u llvm\u target\u bpf$(CLANG)$(LLC)
#大多数xxx_用户程序仍然依赖于旧的bpf_load.c
$(OBJECT_LOADBPF):bpf_load.c bpf_load.h
$(CC)$(CFLAGS)-o$@-c$<
LIBBPF_SOURCES=$(工具路径)/lib/bpf/*.c
#libbpf(在bpf/libbpf.c中)中新加载ELF的avail
$(LIBBPF):$(LIBBPF_源代码)$(工具路径)/lib/bpf/Makefile
make-C$(工具路径)/lib/bpf/all
#用LLVM编译eBPF受限C代码
#clang option-S生成了后缀为.ll的输出文件
#这是非二进制LLVM汇编语言格式
#(通常生成LLVM位码格式.bc)
#
#使用-打包成员的Wno地址作为eBPF验证器强制执行
#必要时进行未对齐的访问检查
#
$(内核对象):%.o:%.c生成文件
$(铿锵)-S$(诺斯蒂尼旗帜)$(利努克斯包括)$(额外旗帜)\
-D_uuu内核\uuuu-D_uuuASM\u系统注册表\u H\
-D__BPF_跟踪__\
-墙\
-Wno未使用值-Wno指针符号\
-D___目标_拱门_$(拱门)\
-Wno比较不同的指针类型\
-Wno gnu可变大小类型不在末尾\
-Wno重言式比较\
-Wno未知警告选项\
-打包成员的Wno地址\
-O2-emit llvm-c$<-o${@:.o=.ll}
$(LLC)-march=bpf-filetype=obj-o$@${:.o=.ll}
$(目标):%:xdp1_user.c$(对象)$(LIBBPF)生成文件
$(CC)$(CFLAGS)$(OBJECTS)$(LDFLAGS)-o$@$<$(LIBBPF)
我只是复制了我在这里找到的文件: 并删除了一堆我不需要的东西,还将其更改为更具动态性,并使用“uname-r”计算不同的路径。 问题是原始Makefile假设bfp_helpers.h与这些文件位于同一目录中。但是我的xdp1_kern.c使用它,我不能将它放在同一个目录中。我添加了-I(bpf_helpers.h的路径),但运行它时仍然会抛出错误

 make LLC=<path to llc> CLANG=<path to clang>
gcc -g -O2 -Wall /usr/include/linux/bpf.h -I/usr/src/kernels/4.18.0-mlnx/tools/lib -I/usr/src/kernels/4.18.0-mlnx/tools/testing/selftests/bpf bpf_load.o -lelf -o xdp1 xdp1_user.c  /usr/src/kernels/4.18.0-mlnx/tools/lib/bpf/libbpf.a
/.autodirect/net_linux_verification/tools/clang+llvm-3.8.0-linux-x86_64-centos6/bin/clang -S -nostdinc -isystem /usr/lib/gcc/x86_64-redhat-linux/7/include -I/usr/src/kernels/4.18.0-mlnx/include -I/usr/src/kernels/4.18.0-mlnx/arch/x86/include -I/usr/src/kernels/4.18.0-mlnx/arch/x86/include/generated/uapi -I/usr/src/kernels/4.18.0-mlnx/arch/x86/include/generated -I/usr/src/kernels/4.18.0-mlnx/include -I/usr/src/kernels/4.18.0-mlnx/arch/x86/include/uapi -I/usr/src/kernels/4.18.0-mlnx/include/uapi -I/usr/src/kernels/4.18.0-mlnx/include/generated/uapi -include /usr/src/kernels/4.18.0-mlnx/include/linux/kconfig.h -Werror \
    -D__KERNEL__ -D__ASM_SYSREG_H \
    -D__BPF_TRACING__ \
    -Wall \
    -Wno-unused-value -Wno-pointer-sign \
    -D__TARGET_ARCH_ \
    -Wno-compare-distinct-pointer-types \
    -Wno-gnu-variable-sized-type-not-at-end \
    -Wno-tautological-compare \
    -Wno-unknown-warning-option \
    -Wno-address-of-packed-member \
    -O2 -emit-llvm -c xdp1_kern.c -o xdp1_kern.ll
xdp1_kern.c:15:10: fatal error: 'bpf_helpers.h' file not found
#include "bpf_helpers.h"
         ^
1 error generated.
make: *** [Makefile:93: xdp1_kern.o] Error 1
makellc=CLANG=
gcc-g-O2-Wall/usr/include/linux/bpf.h-I/usr/src/kernels/4.18.0-mlnx/tools/lib-I/usr/src/kernels/4.18.0-mlnx/tools/testing/selftests/bpf\u load.o-lelf-o xdp1 xdp1用户.c/usr/src/kernels/4.18.0-mlnx/tools/lib/bpf/libbpf.a
/.autodirect/net\u linux\u verification/tools/clang+llvm-3.8.0-linux-x86\u 64-centos6/bin/clang-S-nostinc-isystem/usr/lib/gcc/x86\u 64-redhat-linux/7/include-I/usr/src/kernels/4.18.0-mlnx/include-I/usr/src/kernels/4.18.0-mlnx/arch/x86/include-I/usr/src-I/usr/src/kernels/4.18.0-mlnx/arch/x86/include/generated-I/usr/src/kernels/4.18.0-mlnx/include-I/usr/src/src/kernels/4.18.0-mlnx/include/uapi-I/usr/src/kernels/4.18.0-mlnx/kernels/4.18.0-mlnx/include/generated/ua/ua-include/usr/src/kernels/4.18.18.0-linux/mlnx\
-D_uuu内核\uuuu-D_uuuASM\u系统注册表\u H\
-D__BPF_跟踪__\
-墙\
-Wno未使用值-Wno指针符号\
-D___目标_拱门_\
-Wno比较不同的指针类型\
-Wno gnu可变大小类型不在末尾\
-Wno重言式比较\
-Wno未知警告选项\
-打包成员的Wno地址\
-O2-emit llvm-c xdp1_kern.c-o xdp1_kern.ll
xdp1_kern.c:15:10:致命错误:“找不到bpf_helpers.h”文件
#包括“bpf_helpers.h”
^
生成1个错误。
make:**[Makefile:93:xdp1_kern.o]错误1

我确信添加-I/usr/src/kernels/4.18.0-mlnx/tools/testing/selftests/bpf会解决这个问题,因为这就是我的机器上bpf_helpers.h的位置。但它没有,它只解决了bpf_utils.h的include问题。

您不使用在编译bpf程序时修改的
CFLAGS

编译用户空间程序时,确实要使用
CFLAGS

#大多数xxx_用户程序仍然依赖于ol