tools/bpftool: Minimize bootstrap bpftool
Build minimal "bootstrap mode" bpftool to enable skeleton (and, later, vmlinux.h generation), instead of building almost complete, but slightly different (w/o skeletons, etc) bpftool to bootstrap complete bpftool build. Current approach doesn't scale well (engineering-wise) when adding more BPF programs to bpftool and other complicated functionality, as it requires constant adjusting of the code to work in both bootstrapped mode and normal mode. So it's better to build only minimal bpftool version that supports only BPF skeleton code generation and BTF-to-C conversion. Thankfully, this is quite easy to accomplish due to internal modularity of bpftool commands. This will also allow to keep adding new functionality to bpftool in general, without the need to care about bootstrap mode for those new parts of bpftool. Signed-off-by: Andrii Nakryiko <andriin@fb.com> Signed-off-by: Alexei Starovoitov <ast@kernel.org> Reviewed-by: Quentin Monnet <quentin@isovalent.com> Link: https://lore.kernel.org/bpf/20200619231703.738941-6-andriin@fb.com
This commit is contained in:
parent
a479b8ce4e
commit
16e9b187ab
|
@ -1,6 +1,6 @@
|
|||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
*.d
|
||||
/_bpftool
|
||||
/bpftool-bootstrap
|
||||
/bpftool
|
||||
bpftool*.8
|
||||
bpf-helpers.*
|
||||
|
|
|
@ -116,40 +116,36 @@ CFLAGS += -DHAVE_LIBBFD_SUPPORT
|
|||
SRCS += $(BFD_SRCS)
|
||||
endif
|
||||
|
||||
BPFTOOL_BOOTSTRAP := $(if $(OUTPUT),$(OUTPUT)bpftool-bootstrap,./bpftool-bootstrap)
|
||||
|
||||
BOOTSTRAP_OBJS = $(addprefix $(OUTPUT),main.o common.o json_writer.o gen.o btf.o)
|
||||
OBJS = $(patsubst %.c,$(OUTPUT)%.o,$(SRCS)) $(OUTPUT)disasm.o
|
||||
_OBJS = $(filter-out $(OUTPUT)prog.o,$(OBJS)) $(OUTPUT)_prog.o
|
||||
|
||||
ifeq ($(feature-clang-bpf-global-var),1)
|
||||
__OBJS = $(OBJS)
|
||||
else
|
||||
__OBJS = $(_OBJS)
|
||||
ifneq ($(feature-clang-bpf-global-var),1)
|
||||
CFLAGS += -DBPFTOOL_WITHOUT_SKELETONS
|
||||
endif
|
||||
|
||||
$(OUTPUT)_prog.o: prog.c
|
||||
$(QUIET_CC)$(CC) $(CFLAGS) -c -MMD -DBPFTOOL_WITHOUT_SKELETONS -o $@ $<
|
||||
|
||||
$(OUTPUT)_bpftool: $(_OBJS) $(LIBBPF)
|
||||
$(QUIET_LINK)$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(_OBJS) $(LIBS)
|
||||
|
||||
skeleton/profiler.bpf.o: skeleton/profiler.bpf.c $(LIBBPF)
|
||||
$(QUIET_CLANG)$(CLANG) \
|
||||
-I$(srctree)/tools/include/uapi/ \
|
||||
-I$(LIBBPF_PATH) -I$(srctree)/tools/lib \
|
||||
-g -O2 -target bpf -c $< -o $@
|
||||
|
||||
profiler.skel.h: $(OUTPUT)_bpftool skeleton/profiler.bpf.o
|
||||
$(QUIET_GEN)$(OUTPUT)./_bpftool gen skeleton skeleton/profiler.bpf.o > $@
|
||||
profiler.skel.h: $(BPFTOOL_BOOTSTRAP) skeleton/profiler.bpf.o
|
||||
$(QUIET_GEN)$(BPFTOOL_BOOTSTRAP) gen skeleton skeleton/profiler.bpf.o > $@
|
||||
|
||||
$(OUTPUT)prog.o: prog.c profiler.skel.h
|
||||
$(QUIET_CC)$(CC) $(CFLAGS) -c -MMD -o $@ $<
|
||||
|
||||
$(OUTPUT)disasm.o: $(srctree)/kernel/bpf/disasm.c
|
||||
$(QUIET_CC)$(CC) $(CFLAGS) -c -MMD -o $@ $<
|
||||
|
||||
$(OUTPUT)feature.o: | zdep
|
||||
|
||||
$(OUTPUT)bpftool: $(__OBJS) $(LIBBPF)
|
||||
$(QUIET_LINK)$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(__OBJS) $(LIBS)
|
||||
$(BPFTOOL_BOOTSTRAP): $(BOOTSTRAP_OBJS) $(LIBBPF)
|
||||
$(QUIET_LINK)$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(BOOTSTRAP_OBJS) $(LIBS)
|
||||
|
||||
$(OUTPUT)bpftool: $(OBJS) $(LIBBPF)
|
||||
$(QUIET_LINK)$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(OBJS) $(LIBS)
|
||||
|
||||
$(OUTPUT)%.o: %.c
|
||||
$(QUIET_CC)$(CC) $(CFLAGS) -c -MMD -o $@ $<
|
||||
|
@ -157,7 +153,7 @@ $(OUTPUT)%.o: %.c
|
|||
clean: $(LIBBPF)-clean
|
||||
$(call QUIET_CLEAN, bpftool)
|
||||
$(Q)$(RM) -- $(OUTPUT)bpftool $(OUTPUT)*.o $(OUTPUT)*.d
|
||||
$(Q)$(RM) -- $(OUTPUT)_bpftool profiler.skel.h skeleton/profiler.bpf.o
|
||||
$(Q)$(RM) -- $(BPFTOOL_BOOTSTRAP) profiler.skel.h skeleton/profiler.bpf.o
|
||||
$(Q)$(RM) -r -- $(OUTPUT)libbpf/
|
||||
$(call QUIET_CLEAN, core-gen)
|
||||
$(Q)$(RM) -- $(OUTPUT)FEATURE-DUMP.bpftool
|
||||
|
|
|
@ -92,9 +92,16 @@ int cmd_select(const struct cmd *cmds, int argc, char **argv,
|
|||
if (argc < 1 && cmds[0].func)
|
||||
return cmds[0].func(argc, argv);
|
||||
|
||||
for (i = 0; cmds[i].func; i++)
|
||||
if (is_prefix(*argv, cmds[i].cmd))
|
||||
for (i = 0; cmds[i].cmd; i++) {
|
||||
if (is_prefix(*argv, cmds[i].cmd)) {
|
||||
if (!cmds[i].func) {
|
||||
p_err("command '%s' is not supported in bootstrap mode",
|
||||
cmds[i].cmd);
|
||||
return -1;
|
||||
}
|
||||
return cmds[i].func(argc - 1, argv + 1);
|
||||
}
|
||||
}
|
||||
|
||||
help(argc - 1, argv + 1);
|
||||
|
||||
|
|
|
@ -194,19 +194,22 @@ int mount_bpffs_for_pin(const char *name);
|
|||
int do_pin_any(int argc, char **argv, int (*get_fd_by_id)(int *, char ***));
|
||||
int do_pin_fd(int fd, const char *name);
|
||||
|
||||
int do_prog(int argc, char **arg);
|
||||
int do_map(int argc, char **arg);
|
||||
int do_link(int argc, char **arg);
|
||||
int do_event_pipe(int argc, char **argv);
|
||||
int do_cgroup(int argc, char **arg);
|
||||
int do_perf(int argc, char **arg);
|
||||
int do_net(int argc, char **arg);
|
||||
int do_tracelog(int argc, char **arg);
|
||||
int do_feature(int argc, char **argv);
|
||||
int do_btf(int argc, char **argv);
|
||||
/* commands available in bootstrap mode */
|
||||
int do_gen(int argc, char **argv);
|
||||
int do_struct_ops(int argc, char **argv);
|
||||
int do_iter(int argc, char **argv);
|
||||
int do_btf(int argc, char **argv);
|
||||
|
||||
/* non-bootstrap only commands */
|
||||
int do_prog(int argc, char **arg) __weak;
|
||||
int do_map(int argc, char **arg) __weak;
|
||||
int do_link(int argc, char **arg) __weak;
|
||||
int do_event_pipe(int argc, char **argv) __weak;
|
||||
int do_cgroup(int argc, char **arg) __weak;
|
||||
int do_perf(int argc, char **arg) __weak;
|
||||
int do_net(int argc, char **arg) __weak;
|
||||
int do_tracelog(int argc, char **arg) __weak;
|
||||
int do_feature(int argc, char **argv) __weak;
|
||||
int do_struct_ops(int argc, char **argv) __weak;
|
||||
int do_iter(int argc, char **argv) __weak;
|
||||
|
||||
int parse_u32_arg(int *argc, char ***argv, __u32 *val, const char *what);
|
||||
int prog_parse_fd(int *argc, char ***argv);
|
||||
|
|
Loading…
Reference in New Issue