1 # SPDX-License-Identifier: GPL-2.0
3 BPF_SAMPLES_PATH ?
= $(abspath
$(src
))
4 TOOLS_PATH
:= $(BPF_SAMPLES_PATH
)/..
/..
/tools
8 # List of programs to build
9 tprogs-y
:= test_lru_dist
10 tprogs-y
+= sock_example
11 tprogs-y
+= fds_example
20 tprogs-y
+= trace_output
22 tprogs-y
+= offwaketime
24 tprogs-y
+= map_perf_test
25 tprogs-y
+= xdp_router_ipv4
26 tprogs-y
+= trace_event
28 tprogs-y
+= tc_l2_redirect
29 tprogs-y
+= lwt_len_hist
30 tprogs-y
+= xdp_tx_iptunnel
31 tprogs-y
+= test_map_in_map
32 tprogs-y
+= per_socket_stats_example
33 tprogs-y
+= syscall_tp
35 tprogs-y
+= xdp_adjust_tail
37 tprogs-y
+= task_fd_query
42 LIBBPF_SRC
= $(TOOLS_PATH
)/lib
/bpf
43 LIBBPF_OUTPUT
= $(abspath
$(BPF_SAMPLES_PATH
))/libbpf
44 LIBBPF_DESTDIR
= $(LIBBPF_OUTPUT
)
45 LIBBPF_INCLUDE
= $(LIBBPF_DESTDIR
)/include
46 LIBBPF
= $(LIBBPF_OUTPUT
)/libbpf.a
48 CGROUP_HELPERS
:= ..
/..
/tools
/testing
/selftests
/bpf
/cgroup_helpers.o
49 TRACE_HELPERS
:= ..
/..
/tools
/testing
/selftests
/bpf
/trace_helpers.o
50 XDP_SAMPLE
:= xdp_sample_user.o
52 fds_example-objs
:= fds_example.o
53 sockex1-objs
:= sockex1_user.o
54 sockex2-objs
:= sockex2_user.o
55 sockex3-objs
:= sockex3_user.o
56 tracex1-objs
:= tracex1_user.o
$(TRACE_HELPERS
)
57 tracex3-objs
:= tracex3_user.o
58 tracex4-objs
:= tracex4_user.o
59 tracex5-objs
:= tracex5_user.o
$(TRACE_HELPERS
)
60 tracex6-objs
:= tracex6_user.o
61 trace_output-objs
:= trace_output_user.o
62 lathist-objs
:= lathist_user.o
63 offwaketime-objs
:= offwaketime_user.o
$(TRACE_HELPERS
)
64 spintest-objs
:= spintest_user.o
$(TRACE_HELPERS
)
65 map_perf_test-objs
:= map_perf_test_user.o
66 test_overhead-objs
:= test_overhead_user.o
67 trace_event-objs
:= trace_event_user.o
$(TRACE_HELPERS
)
68 sampleip-objs
:= sampleip_user.o
$(TRACE_HELPERS
)
69 tc_l2_redirect-objs
:= tc_l2_redirect_user.o
70 lwt_len_hist-objs
:= lwt_len_hist_user.o
71 xdp_tx_iptunnel-objs
:= xdp_tx_iptunnel_user.o
72 test_map_in_map-objs
:= test_map_in_map_user.o
73 per_socket_stats_example-objs
:= cookie_uid_helper_example.o
74 syscall_tp-objs
:= syscall_tp_user.o
75 cpustat-objs
:= cpustat_user.o
76 xdp_adjust_tail-objs
:= xdp_adjust_tail_user.o
77 xdp_fwd-objs
:= xdp_fwd_user.o
78 task_fd_query-objs
:= task_fd_query_user.o
$(TRACE_HELPERS
)
79 ibumad-objs
:= ibumad_user.o
80 hbm-objs
:= hbm.o
$(CGROUP_HELPERS
)
82 xdp_router_ipv4-objs
:= xdp_router_ipv4_user.o
$(XDP_SAMPLE
)
84 # Tell kbuild to always build the programs
85 always-y
:= $(tprogs-y
)
86 always-y
+= sockex1_kern.o
87 always-y
+= sockex2_kern.o
88 always-y
+= sockex3_kern.o
89 always-y
+= tracex1.bpf.o
90 always-y
+= tracex3.bpf.o
91 always-y
+= tracex4.bpf.o
92 always-y
+= tracex5.bpf.o
93 always-y
+= tracex6.bpf.o
94 always-y
+= trace_output.bpf.o
95 always-y
+= tcbpf1_kern.o
96 always-y
+= tc_l2_redirect_kern.o
97 always-y
+= lathist_kern.o
98 always-y
+= offwaketime.bpf.o
99 always-y
+= spintest.bpf.o
100 always-y
+= map_perf_test.bpf.o
101 always-y
+= parse_varlen.o parse_simple.o parse_ldabs.o
102 always-y
+= trace_event_kern.o
103 always-y
+= sampleip_kern.o
104 always-y
+= lwt_len_hist.bpf.o
105 always-y
+= xdp_tx_iptunnel_kern.o
106 always-y
+= test_map_in_map.bpf.o
107 always-y
+= tcp_synrto_kern.o
108 always-y
+= tcp_rwnd_kern.o
109 always-y
+= tcp_bufs_kern.o
110 always-y
+= tcp_cong_kern.o
111 always-y
+= tcp_iw_kern.o
112 always-y
+= tcp_clamp_kern.o
113 always-y
+= tcp_basertt_kern.o
114 always-y
+= tcp_tos_reflect_kern.o
115 always-y
+= tcp_dumpstats_kern.o
116 always-y
+= xdp2skb_meta_kern.o
117 always-y
+= syscall_tp_kern.o
118 always-y
+= cpustat_kern.o
119 always-y
+= xdp_adjust_tail_kern.o
120 always-y
+= xdp_fwd_kern.o
121 always-y
+= task_fd_query_kern.o
122 always-y
+= ibumad_kern.o
123 always-y
+= hbm_out_kern.o
124 always-y
+= hbm_edt_kern.o
126 TPROGS_CFLAGS
= $(TPROGS_USER_CFLAGS
)
127 TPROGS_LDFLAGS
= $(TPROGS_USER_LDFLAGS
)
130 # Strip all except -D__LINUX_ARM_ARCH__ option needed to handle linux
131 # headers when arm instruction set identification is requested.
132 ARM_ARCH_SELECTOR
:= $(filter -D__LINUX_ARM_ARCH__
%, $(KBUILD_CFLAGS
))
133 BPF_EXTRA_CFLAGS
:= $(ARM_ARCH_SELECTOR
)
134 TPROGS_CFLAGS
+= $(ARM_ARCH_SELECTOR
)
138 TPROGS_CFLAGS
+= -D__SANE_USERSPACE_TYPES__
139 ifdef CONFIG_MACH_LOONGSON64
140 BPF_EXTRA_CFLAGS
+= -I
$(srctree
)/arch
/mips
/include/asm
/mach-loongson64
141 BPF_EXTRA_CFLAGS
+= -I
$(srctree
)/arch
/mips
/include/asm
/mach-generic
146 BPF_EXTRA_CFLAGS
+= -fcf-protection
149 TPROGS_CFLAGS
+= -Wall
-O2
150 TPROGS_CFLAGS
+= -Wmissing-prototypes
151 TPROGS_CFLAGS
+= -Wstrict-prototypes
152 TPROGS_CFLAGS
+= $(call try-run
,\
153 printf
"int main() { return 0; }" |\
154 $(CC
) -Werror
-fsanitize
=bounds
-x c
- -o
"$$TMP",-fsanitize
=bounds
,)
156 TPROGS_CFLAGS
+= -I
$(objtree
)/usr
/include
157 TPROGS_CFLAGS
+= -I
$(srctree
)/tools
/testing
/selftests
/bpf
/
158 TPROGS_CFLAGS
+= -I
$(LIBBPF_INCLUDE
)
159 TPROGS_CFLAGS
+= -I
$(srctree
)/tools
/include
160 TPROGS_CFLAGS
+= -I
$(srctree
)/tools
/perf
161 TPROGS_CFLAGS
+= -I
$(srctree
)/tools
/lib
162 TPROGS_CFLAGS
+= -DHAVE_ATTR_TEST
=0
165 TPROGS_CFLAGS
+= --sysroot
=$(SYSROOT
)
166 TPROGS_LDFLAGS
:= -L
$(SYSROOT
)/usr
/lib
169 TPROGS_LDLIBS
+= $(LIBBPF
) -lelf
-lz
170 TPROGLDLIBS_xdp_router_ipv4
+= -lm
-pthread
171 TPROGLDLIBS_tracex4
+= -lrt
172 TPROGLDLIBS_trace_output
+= -lrt
173 TPROGLDLIBS_map_perf_test
+= -lrt
175 # Allows pointing LLC/CLANG to a LLVM backend with bpf support, redefine on cmdline:
176 # make M=samples/bpf LLC=~/git/llvm-project/llvm/build/bin/llc CLANG=~/git/llvm-project/llvm/build/bin/clang
181 LLVM_OBJCOPY ?
= llvm-objcopy
182 LLVM_READELF ?
= llvm-readelf
185 # Detect that we're cross compiling and use the cross compiler
187 CLANG_ARCH_ARGS
= --target
=$(notdir $(CROSS_COMPILE
:%-=%))
190 # Don't evaluate probes and warnings if we need to run make recursively
192 HDR_PROBE
:= $(shell printf
"$(pound)include <linux/types.h>\n struct list_head { int a; }; int main() { return 0; }" | \
193 $(CC
) $(TPROGS_CFLAGS
) $(TPROGS_LDFLAGS
) -x c
- \
194 -o
/dev
/null
2>/dev
/null
&& echo okay
)
197 $(warning WARNING
: Detected possible issues with
include path.
)
198 $(warning WARNING
: Please
install kernel headers locally
(make headers_install
).
)
201 BTF_LLC_PROBE
:= $(shell $(LLC
) -march
=bpf
-mattr
=help
2>&1 | grep dwarfris
)
202 BTF_PAHOLE_PROBE
:= $(shell $(BTF_PAHOLE
) --help
2>&1 | grep BTF
)
203 BTF_OBJCOPY_PROBE
:= $(shell $(LLVM_OBJCOPY
) --help
2>&1 | grep
-i
'usage.*llvm')
204 BTF_LLVM_PROBE
:= $(shell echo
"int main() { return 0; }" | \
205 $(CLANG
) --target
=bpf
-O2
-g
-c
-x c
- -o .
/llvm_btf_verify.o
; \
206 $(LLVM_READELF
) -S .
/llvm_btf_verify.o | grep BTF
; \
207 /bin
/rm -f .
/llvm_btf_verify.o
)
209 BPF_EXTRA_CFLAGS
+= -fno-stack-protector
210 ifneq ($(BTF_LLVM_PROBE
),)
211 BPF_EXTRA_CFLAGS
+= -g
213 ifneq ($(and
$(BTF_LLC_PROBE
),$(BTF_PAHOLE_PROBE
),$(BTF_OBJCOPY_PROBE
)),)
214 BPF_EXTRA_CFLAGS
+= -g
215 LLC_FLAGS
+= -mattr
=dwarfris
221 # Trick to allow make to be run from this directory
223 $(MAKE
) -C ..
/..
/ M
=$(CURDIR
) BPF_SAMPLES_PATH
=$(CURDIR
)
226 $(MAKE
) -C ..
/..
/ M
=$(CURDIR
) clean
227 @find
$(CURDIR
) -type f
-name
'*~' -delete
228 @
$(RM
) -r
$(CURDIR
)/libbpf
$(CURDIR
)/bpftool
230 $(LIBBPF
): $(wildcard $(LIBBPF_SRC
)/*.
[ch
] $(LIBBPF_SRC
)/Makefile
) |
$(LIBBPF_OUTPUT
)
231 # Fix up variables inherited from Kbuild that tools/ build system won't like
232 $(MAKE
) -C
$(LIBBPF_SRC
) RM
='rm -rf' EXTRA_CFLAGS
="$(TPROGS_CFLAGS)" \
233 LDFLAGS
="$(TPROGS_LDFLAGS)" srctree
=$(BPF_SAMPLES_PATH
)/..
/..
/ \
234 O
= OUTPUT
=$(LIBBPF_OUTPUT
)/ DESTDIR
=$(LIBBPF_DESTDIR
) prefix= \
237 BPFTOOLDIR
:= $(TOOLS_PATH
)/bpf
/bpftool
238 BPFTOOL_OUTPUT
:= $(abspath
$(BPF_SAMPLES_PATH
))/bpftool
239 DEFAULT_BPFTOOL
:= $(BPFTOOL_OUTPUT
)/bootstrap
/bpftool
240 BPFTOOL ?
= $(DEFAULT_BPFTOOL
)
241 $(DEFAULT_BPFTOOL
): $(wildcard $(BPFTOOLDIR
)/*.
[ch
] $(BPFTOOLDIR
)/Makefile
) |
$(BPFTOOL_OUTPUT
)
242 $(MAKE
) -C
$(BPFTOOLDIR
) srctree
=$(BPF_SAMPLES_PATH
)/..
/..
/ \
243 OUTPUT
=$(BPFTOOL_OUTPUT
)/ bootstrap
245 $(LIBBPF_OUTPUT
) $(BPFTOOL_OUTPUT
):
249 $(obj
)/syscall_nrs.h
: $(obj
)/syscall_nrs.s FORCE
250 $(call filechk
,offsets
,__SYSCALL_NRS_H__
)
252 targets
+= syscall_nrs.s
253 clean-files
+= syscall_nrs.h
258 # Verify LLVM compiler tools are available and bpf target is supported by llc
259 .PHONY
: verify_cmds verify_target_bpf
$(CLANG
) $(LLC
)
261 verify_cmds
: $(CLANG
) $(LLC
)
262 @for TOOL in
$^
; do \
263 if
! (which
-- "$${TOOL}" > /dev
/null
2>&1); then \
264 echo
"*** ERROR: Cannot find LLVM tool $${TOOL}" ;\
269 verify_target_bpf
: verify_cmds
270 @if
! (${LLC} -march
=bpf
-mattr
=help
> /dev
/null
2>&1); then \
271 echo
"*** ERROR: LLVM (${LLC}) does not support 'bpf' target" ;\
272 echo
" NOTICE: LLVM version >= 3.7.1 required" ;\
276 $(BPF_SAMPLES_PATH
)/*.c
: verify_target_bpf
$(LIBBPF
)
277 $(src
)/*.c
: verify_target_bpf
$(LIBBPF
)
279 libbpf_hdrs
: $(LIBBPF
)
280 $(obj
)/$(TRACE_HELPERS
) $(obj
)/$(CGROUP_HELPERS
) $(obj
)/$(XDP_SAMPLE
): | libbpf_hdrs
284 $(obj
)/xdp_router_ipv4_user.o
: $(obj
)/xdp_router_ipv4.skel.h
286 $(obj
)/tracex5.bpf.o
: $(obj
)/syscall_nrs.h
287 $(obj
)/hbm_out_kern.o
: $(src
)/hbm.h
$(src
)/hbm_kern.h
288 $(obj
)/hbm.o
: $(src
)/hbm.h
289 $(obj
)/hbm_edt_kern.o
: $(src
)/hbm.h
$(src
)/hbm_kern.h
291 # Override includes for xdp_sample_user.o because $(srctree)/usr/include in
292 # TPROGS_CFLAGS causes conflicts
293 XDP_SAMPLE_CFLAGS
+= -Wall
-O2 \
294 -I
$(src
)/..
/..
/tools
/include \
295 -I
$(src
)/..
/..
/tools
/include/uapi \
296 -I
$(LIBBPF_INCLUDE
) \
297 -I
$(src
)/..
/..
/tools
/testing
/selftests
/bpf
299 $(obj
)/$(XDP_SAMPLE
): TPROGS_CFLAGS
= $(XDP_SAMPLE_CFLAGS
) $(TPROGS_USER_CFLAGS
)
300 $(obj
)/$(XDP_SAMPLE
): $(src
)/xdp_sample_user.h
$(src
)/xdp_sample_shared.h
301 # Override includes for trace_helpers.o because __must_check won't be defined
302 # in our include path.
303 $(obj
)/$(TRACE_HELPERS
): TPROGS_CFLAGS
:= $(TPROGS_CFLAGS
) -D__must_check
=
305 -include $(BPF_SAMPLES_PATH
)/Makefile.target
307 VMLINUX_BTF_PATHS ?
= $(abspath
$(if
$(O
),$(O
)/vmlinux
)) \
308 $(abspath
$(if
$(KBUILD_OUTPUT
),$(KBUILD_OUTPUT
)/vmlinux
)) \
310 VMLINUX_BTF ?
= $(abspath
$(firstword $(wildcard $(VMLINUX_BTF_PATHS
))))
312 $(obj
)/vmlinux.h
: $(VMLINUX_BTF
) $(BPFTOOL
)
314 ifeq ($(VMLINUX_BTF
),)
315 $(error Cannot find a vmlinux for VMLINUX_BTF at any of
"$(VMLINUX_BTF_PATHS)",\
316 build the kernel or set VMLINUX_BTF like
"VMLINUX_BTF=/sys/kernel/btf/vmlinux" or VMLINUX_H variable
)
318 $(Q
)$(BPFTOOL
) btf dump file
$(VMLINUX_BTF
) format c
> $@
320 $(Q
)cp
"$(VMLINUX_H)" $@
323 clean-files
+= vmlinux.h
325 # Get Clang's default includes on this system, as opposed to those seen by
326 # '--target=bpf'. This fixes "missing" files on some architectures/distros,
327 # such as asm/byteorder.h, asm/socket.h, asm/sockios.h, sys/cdefs.h etc.
329 # Use '-idirafter': Don't interfere with include mechanics except where the
330 # build would have failed anyways.
331 define get_sys_includes
332 $(shell $(1) -v
-E
- </dev
/null
2>&1 \
333 | sed
-n
'/<...> search starts here:/,/End of search list./{ s| \(/.*\)|-idirafter \1|p }') \
334 $(shell $(1) -dM
-E
- </dev
/null | grep
'#define __riscv_xlen ' | sed
's/#define /-D/' | sed
's/ /=/')
337 CLANG_SYS_INCLUDES
= $(call get_sys_includes
,$(CLANG
))
339 $(obj
)/xdp_router_ipv4.bpf.o
: $(obj
)/xdp_sample.bpf.o
341 $(obj
)/%.bpf.o
: $(src
)/%.bpf.c
$(obj
)/vmlinux.h
$(src
)/xdp_sample.bpf.h
$(src
)/xdp_sample_shared.h
342 @echo
" CLANG-BPF " $@
343 $(Q
)$(CLANG
) -g
-O2
--target
=bpf
-D__TARGET_ARCH_
$(SRCARCH
) \
344 -Wno-compare-distinct-pointer-types
-I
$(srctree
)/include \
345 -I
$(srctree
)/samples
/bpf
-I
$(srctree
)/tools
/include \
346 -I
$(LIBBPF_INCLUDE
) $(CLANG_SYS_INCLUDES
) \
347 -c
$(filter %.bpf.c
,$^
) -o
$@
349 LINKED_SKELS
:= xdp_router_ipv4.skel.h
350 clean-files
+= $(LINKED_SKELS
)
352 xdp_router_ipv4.skel.h-deps
:= xdp_router_ipv4.bpf.o xdp_sample.bpf.o
354 LINKED_BPF_SRCS
:= $(patsubst %.bpf.o
,%.bpf.c
,$(foreach skel
,$(LINKED_SKELS
),$($(skel
)-deps
)))
356 BPF_SRCS_LINKED
:= $(notdir $(wildcard $(src
)/*.bpf.c
))
357 BPF_OBJS_LINKED
:= $(patsubst %.bpf.c
,$(obj
)/%.bpf.o
, $(BPF_SRCS_LINKED
))
358 BPF_SKELS_LINKED
:= $(addprefix $(obj
)/,$(LINKED_SKELS
))
360 $(BPF_SKELS_LINKED
): $(BPF_OBJS_LINKED
) $(BPFTOOL
)
361 @echo
" BPF GEN-OBJ " $(@
:.skel.h
=)
362 $(Q
)$(BPFTOOL
) gen object
$(@
:.skel.h
=.lbpf.o
) $(addprefix $(obj
)/,$($(@F
)-deps
))
363 @echo
" BPF GEN-SKEL" $(@
:.skel.h
=)
364 $(Q
)$(BPFTOOL
) gen skeleton
$(@
:.skel.h
=.lbpf.o
) name
$(notdir $(@
:.skel.h
=)) > $@
366 # asm/sysreg.h - inline assembly used by it is incompatible with llvm.
367 # But, there is no easy way to fix it, so just exclude it since it is
368 # useless for BPF samples.
369 # below we use long chain of commands, clang | opt | llvm-dis | llc,
370 # to generate final object file. 'clang' compiles the source into IR
371 # with native target, e.g., x64, arm64, etc. 'opt' does bpf CORE IR builtin
372 # processing (llvm12) and IR optimizations. 'llvm-dis' converts
373 # 'opt' output to IR, and finally 'llc' generates bpf byte code.
374 $(obj
)/%.o
: $(src
)/%.c
375 @echo
" CLANG-bpf " $@
376 $(Q
)$(CLANG
) $(NOSTDINC_FLAGS
) $(LINUXINCLUDE
) $(BPF_EXTRA_CFLAGS
) \
377 -I
$(obj
) -I
$(srctree
)/tools
/testing
/selftests
/bpf
/ \
378 -I
$(LIBBPF_INCLUDE
) \
379 -D__KERNEL__
-D__BPF_TRACING__
-Wno-unused-value
-Wno-pointer-sign \
380 -D__TARGET_ARCH_
$(SRCARCH
) -Wno-compare-distinct-pointer-types \
381 -Wno-gnu-variable-sized-type-not-at-end \
382 -Wno-address-of-packed-member
-Wno-tautological-compare \
383 -Wno-unknown-warning-option
$(CLANG_ARCH_ARGS
) \
384 -fno-asynchronous-unwind-tables \
385 -I
$(srctree
)/samples
/bpf
/ -include asm_goto_workaround.h \
386 -O2
-emit-llvm
-Xclang
-disable-llvm-passes
-c
$< -o
- | \
387 $(OPT
) -O2
-mtriple
=bpf-pc-linux |
$(LLVM_DIS
) | \
388 $(LLC
) -march
=bpf
$(LLC_FLAGS
) -filetype
=obj
-o
$@
389 ifeq ($(DWARF2BTF
),y
)