tools/bpftool: use version from the kernel source tree
Subsystems (4)
PATCH v3 1/2 tools/bpftool: use version from the kernel source tree
Bpftool determines it's own version based on the kernel version, which is picked from the linux/version.h header.
It's strange to use the version of the installed kernel headers, and makes much more sense to use the version of the actual source tree, where bpftool sources are.
Fix this by building kernelversion target and use the resulting string as bpftool version.
Example:
before:
$ bpftool version bpftool v4.14.6
after:
$ bpftool version bpftool v4.15.0-rc3
$bpftool version --json
{"version":"4.15.0-rc3"}
--- tools/bpf/bpftool/Makefile | 3 +++ tools/bpf/bpftool/main.c | 13 ++----------- 2 files changed, 5 insertions(+), 11 deletions(-)
tools/bpf/bpftool/Makefile +3 -0
@@ -23,6 +23,8 @@ endif LIBBPF = $(BPF_PATH)libbpf.a +BPFTOOL_VERSION=$(shell make --no-print-directory -sC ../../.. kernelversion) + $(LIBBPF): FORCE $(Q)$(MAKE) -C $(BPF_DIR) OUTPUT=$(OUTPUT) $(OUTPUT)libbpf.a FEATURES_DUMP=$(FEATURE_DUMP_EXPORT)
@@ -38,6 +40,7 @@ CC = gcc CFLAGS += -O2 CFLAGS += -W -Wall -Wextra -Wno-unused-parameter -Wshadow CFLAGS += -D__EXPORTED_HEADERS__ -I$(srctree)/tools/include/uapi -I$(srctree)/tools/include -I$(srctree)/tools/lib/bpf -I$(srctree)/kernel/bpf/ +CFLAGS += -DBPFTOOL_VERSION='"$(BPFTOOL_VERSION)"' LIBS = -lelf -lbfd -lopcodes $(LIBBPF) INSTALL ?= install
tools/bpf/bpftool/main.c +2 -11
@@ -38,7 +38,6 @@#include <errno.h> #include <getopt.h> #include <linux/bpf.h> -#include <linux/version.h> #include <stdio.h> #include <stdlib.h> #include <string.h>
@@ -95,21 +94,13 @@ static int do_help(int argc, char **argv)static int do_version (int argc,char **argv) { -unsigned int version[3 ]; - - version[0 ] =LINUX_VERSION_CODE >>16 ; - version[1 ] =LINUX_VERSION_CODE >>8 &0xf ; - version[2 ] =LINUX_VERSION_CODE &0xf ; -if (json_output) {jsonw_start_object (json_wtr);jsonw_name (json_wtr,"version" ); -jsonw_printf (json_wtr,"\"%u.%u.%u\"" , - version[0 ], version[1 ], version[2 ]); +jsonw_printf (json_wtr,"\"%s\"" ,BPFTOOL_VERSION );jsonw_end_object (json_wtr); }else { -printf ("%s v%u.%u.%u\n" , bin_name, - version[0 ], version[1 ], version[2 ]); +printf ("%s v%s\n" , bin_name,BPFTOOL_VERSION ); }return 0 ; }
Signature · 1 line
2.14.3
PATCH v3 2/2 tools/bpftool: fix bpftool build with bintutils >= 2.9
Bpftool build is broken with binutils version 2.29 and later. The cause is commit 003ca0fd2286 ("Refactor disassembler selection") in the binutils repo, which changed the disassembler() function signature.
Fix this by adding a new "feature" to the tools/build/features infrastructure and make it responsible for decision which disassembler() function signature to use.
--- tools/bpf/Makefile | 29 +++++++++++++++++++++++ tools/bpf/bpf_jit_disasm.c | 7 ++++++ tools/bpf/bpftool/Makefile | 24 +++++++++++++++++++ tools/bpf/bpftool/jit_disasm.c | 7 ++++++ tools/build/feature/Makefile | 4 ++++ tools/build/feature/test-disassembler-four-args.c | 15 ++++++++++++ 6 files changed, 86 insertions(+) create mode 100644 tools/build/feature/test-disassembler-four-args.c
tools/bpf/Makefile +29 -0
@@ -9,6 +9,35 @@ MAKE = make CFLAGS += -Wall -O2 CFLAGS += -D__EXPORTED_HEADERS__ -I../../include/uapi -I../../include +ifeq ($(srctree),) +srctree := $(patsubst %/,%,$(dir $(CURDIR))) +srctree := $(patsubst %/,%,$(dir $(srctree))) +endif + +FEATURE_USER = .bpf +FEATURE_TESTS = libbfd disassembler-four-args +FEATURE_DISPLAY = libbfd disassembler-four-args + +check_feat := 1 +NON_CHECK_FEAT_TARGETS := clean bpftool_clean +ifdef MAKECMDGOALS +ifeq ($(filter-out $(NON_CHECK_FEAT_TARGETS),$(MAKECMDGOALS)),) + check_feat := 0 +endif +endif + +ifeq ($(check_feat),1) +ifeq ($(FEATURES_DUMP),) +include $(srctree)/tools/build/Makefile.feature +else +include $(FEATURES_DUMP) +endif +endif + +ifeq ($(feature-disassembler-four-args), 1) +CFLAGS += -DDISASM_FOUR_ARGS_SIGNATURE +endif + %.yacc.c: %.y $(YACC) -o $@ -d $<
tools/bpf/bpf_jit_disasm.c +7 -0
@@ -72,7 +72,14 @@ static void get_asm_insns(uint8_t *image, size_t len, int opcodes)disassemble_init_for_target (&info); +#ifdef DISASM_FOUR_ARGS_SIGNATURE + disassemble =disassembler (info.arch, +bfd_big_endian (bfdf), + info.mach, + bfdf); +#else disassemble =disassembler (bfdf); +#endif assert (disassemble); do {
tools/bpf/bpftool/Makefile +24 -0
@@ -46,6 +46,30 @@ LIBS = -lelf -lbfd -lopcodes $(LIBBPF) INSTALL ?= install RM ?= rm -f +FEATURE_USER = .bpftool +FEATURE_TESTS = libbfd disassembler-four-args +FEATURE_DISPLAY = libbfd disassembler-four-args + +check_feat := 1 +NON_CHECK_FEAT_TARGETS := clean uninstall doc doc-clean doc-install doc-uninstall +ifdef MAKECMDGOALS +ifeq ($(filter-out $(NON_CHECK_FEAT_TARGETS),$(MAKECMDGOALS)),) + check_feat := 0 +endif +endif + +ifeq ($(check_feat),1) +ifeq ($(FEATURES_DUMP),) +include $(srctree)/tools/build/Makefile.feature +else +include $(FEATURES_DUMP) +endif +endif + +ifeq ($(feature-disassembler-four-args), 1) +CFLAGS += -DDISASM_FOUR_ARGS_SIGNATURE +endif + include $(wildcard *.d) all: $(OUTPUT)bpftool
tools/bpf/bpftool/jit_disasm.c +7 -0
@@ -107,7 +107,14 @@ void disasm_print_insn(unsigned char *image, ssize_t len, int opcodes)disassemble_init_for_target (&info); +#ifdef DISASM_FOUR_ARGS_SIGNATURE + disassemble =disassembler (info.arch, +bfd_big_endian (bfdf), + info.mach, + bfdf); +#else disassemble =disassembler (bfdf); +#endif assert (disassemble);if (json_output)
tools/build/feature/Makefile +4 -0
@@ -13,6 +13,7 @@ FILES= \ test-hello.bin \ test-libaudit.bin \ test-libbfd.bin \ + test-disassembler-four-args.bin \ test-liberty.bin \ test-liberty-z.bin \ test-cplus-demangle.bin \
@@ -188,6 +189,9 @@ $(OUTPUT)test-libpython-version.bin: $(OUTPUT)test-libbfd.bin: $(BUILD) -DPACKAGE='"perf"' -lbfd -lz -liberty -ldl +$(OUTPUT)test-disassembler-four-args.bin: + $(BUILD) -lbfd -lopcodes + $(OUTPUT)test-liberty.bin: $(CC) $(CFLAGS) -Wall -Werror -o $@ test-libbfd.c -DPACKAGE='"perf"' $(LDFLAGS) -lbfd -ldl -liberty
tools/build/feature/test-disassembler-four-args.c new file +15 -0
@@ -0,0 +1,15 @@ +// SPDX-License-Identifier: GPL-2.0 +#include <bfd.h> +#include <dis-asm.h> + +int main (void ) +{ +bfd *abfd =bfd_openr (NULL ,NULL ); + +disassembler (bfd_get_arch (abfd), +bfd_big_endian (abfd), +bfd_get_mach (abfd), + abfd); + +return 0 ; +}
Signature · 1 line
2.14.3
Re: [PATCH v3 bpf-next 2/2] tools/bpftool: fix bpftool build with bintutils >= 2.9
Quoted 5 lines · Roman Gushchin
Bpftool build is broken with binutils version 2.29 and later. The cause is commit
003ca0fd2286("Refactor disassembler selection") in the binutils repo, which changed thedisassembler()function signature.
Quoted 8 lines
Fix this by adding a new "feature" to the
tools/build/featuresinfrastructure and make it responsible for decision whichdisassembler()function signature to use.Signed-off-by Roman Gushchin <[email protected]>Cc Jakub Kicinski <[email protected]>Cc Alexei Starovoitov <[email protected]>Cc Daniel Borkmann <[email protected]>
Daniel Borkmann
maintainerQuoted 9 lines · Roman Gushchin
Bpftool determines it's own version based on the kernel version, which is picked from the
linux/version.hheader.It's strange to use the version of the installed kernel headers, and makes much more sense to use the version of the actual source tree, where bpftool sources are.
Fix this by building kernelversion target and use the resulting string as bpftool version.
Series applied to bpf-next, thanks everyone!