tools/bpftool: use version from the kernel source tree
Subsystems (4)
PATCH v2 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 v2 2/2 tools/bpftool: fix bpftool build with bintutils >= 2.8
Bpftool build is broken with binutils version 2.28 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 v2 bpf-next 2/2] tools/bpftool: fix bpftool build with bintutils >= 2.8
Hi Roman,
2017-12-22 16:11 UTC+0000 ~ Roman Gushchin <[email protected]>
Quoted 1 line
Bpftool build is broken with binutils version 2.28 and later.
Could you check the binutils version? I believe it changed in 2.29 instead of 2.28. Could you update your commit log and subject accordingly, please?
Quoted 28 lines
The cause is commit
003ca0fd2286("Refactor disassembler selection") in the binutils repo, which changed thedisassembler()function signature.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]>--- 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.ctools/bpf/Makefile +0
-0@@ -9,6 +9,35 @@ MAKE = make CFLAGS += -Wall -O2
tools/bpf/Makefile MAKE = make · line 19
Quoted 10 lines
tools/bpf/Makefile +8
-0CFLAGS += -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
Thanks for adding libbfd as I requested. However, you do not use it in the Makefile to prevent compilation if the feature is not detected (see "bpfdep" or "elfdep" in tools/lib/bpf/Makefile. Sorry, I should have pointed it in my previous review.
But actually, I have another issue related to the libbfd feature: since commit 280e7c48c3b8 ("perf tools: fix BFD detection on opensuse") it requires libiberty so that libbfd is correctly detected, but libiberty is not needed on all distros (at least Ubuntu can have libbfd without libiberty). Typically, detection fails on my setup, although I do have libbfd installed. So forcing libbfd feature here may eventually force users to install libraries they do not need to compile bpftool, which is not what we want.
I do not have a clean work around to suggest. Maybe have one "libbfd-something" feature that tries to compile without libiberty, then another one that tries with it, and compile the tools if at least one of them succeeds. But it's probably for another patch series. In the meantime, would you please simply remove libbfd detection here and accept my apologies for suggesting to add it in the previous review?
Quoted 48 lines
tools/bpf/Makefile +21
-0+ +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 +0
-0
tools/bpf/bpftool/Makefile LIBS = -lelf -lbfd -lopcodes $(LIBBPF) · line 54
Quoted 9 lines
tools/bpf/bpftool/Makefile +6
-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
Nit: exclude "install" as well? I know libbpf does not exclude it, but if the user runs make then make install we do not need to check again the features for binary installation.
Quoted 74 lines
tools/bpf/bpftool/Makefile +18
-0+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)bpftooltools/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 -libertytools/build/feature/test-disassembler-four-args.c new file +5
-0@@ -0,0 +1,15 @@ +// SPDX-License-Identifier: GPL-2.0 +#include <bfd.h> +#include <dis-asm.h> + +int main (void )
tools/build/feature/test-disassembler-four-args.c line 15
Quoted 10 lines
tools/build/feature/test-disassembler-four-args.c new file +10
-0+{ +bfd *abfd =bfd_openr (NULL ,NULL ); + +disassembler (bfd_get_arch (abfd), +bfd_big_endian (abfd), +bfd_get_mach (abfd), + abfd); + +return 0 ; +}
The rest of the patch looks fine to me, thanks for addressing all my comments!
Quentin
Re: [PATCH v2 bpf-next 2/2] tools/bpftool: fix bpftool build with bintutils >= 2.8
Quoted 62 lines · Quentin Monnet
Hi Roman,
2017-12-22 16:11 UTC+0000 ~ Roman Gushchin <[email protected]>
Quoted 1 line
Bpftool build is broken with binutils version 2.28 and later.
Could you check the binutils version? I believe it changed in 2.29 instead of 2.28. Could you update your commit log and subject accordingly, please?
Quoted 28 lines
The cause is commit
003ca0fd2286("Refactor disassembler selection") in the binutils repo, which changed thedisassembler()function signature.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]>--- 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.ctools/bpf/Makefile +0
-0@@ -9,6 +9,35 @@ MAKE = make CFLAGS += -Wall -O2tools/bpf/Makefile MAKE = make · line 19
Quoted 10 lines
tools/bpf/Makefile +8
-0CFLAGS += -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-argsThanks for adding libbfd as I requested. However, you do not use it in the
Makefileto prevent compilation if the feature is not detected (see "bpfdep" or "elfdep" intools/lib/bpf/Makefile. Sorry, I should have pointed it in my previous review.But actually, I have another issue related to the libbfd feature: since commit
280e7c48c3b8("perf tools: fix BFD detection on opensuse") it requires libiberty so that libbfd is correctly detected, but libiberty is not needed on all distros (at least Ubuntu can have libbfd without libiberty). Typically, detection fails on my setup, although I do have libbfd installed. So forcing libbfd feature here may eventually force users to install libraries they do not need to compile bpftool, which is not what we want.
Quoted 6 lines
I do not have a clean work around to suggest. Maybe have one "libbfd-something" feature that tries to compile without libiberty, then another one that tries with it, and compile the tools if at least one of them succeeds. But it's probably for another patch series. In the meantime, would you please simply remove libbfd detection here and accept my apologies for suggesting to add it in the previous review?
I think since libbfd is already used by bpftool it's a good thing to add feature detection. Even if it's not perfect on some setups.
Roman,
I think you still need to do one more respin to address commit log nit?
Re: [PATCH v2 bpf-next 2/2] tools/bpftool: fix bpftool build with bintutils >= 2.8
Quoted 9 lines · Alexei Starovoitov
Quoted 8 lines · Quentin Monnet
Hi Roman,
2017-12-22 16:11 UTC+0000 ~ Roman Gushchin <[email protected]>
Quoted 1 line
Bpftool build is broken with binutils version 2.28 and later.
Could you check the binutils version? I believe it changed in 2.29 instead of 2.28. Could you update your commit log and subject accordingly, please?
Yes, you're right. Thanks!
Quoted 61 lines
Quoted 54 lines
Quoted 29 lines
The cause is commit
003ca0fd2286("Refactor disassembler selection") in the binutils repo, which changed thedisassembler()function signature.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]>--- 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.ctools/bpf/Makefile +0
-0@@ -9,6 +9,35 @@ MAKE = make CFLAGS += -Wall -O2tools/bpf/Makefile MAKE = make · line 19
Quoted 10 lines
tools/bpf/Makefile +8
-0CFLAGS += -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-argsThanks for adding libbfd as I requested. However, you do not use it in the
Makefileto prevent compilation if the feature is not detected (see "bpfdep" or "elfdep" intools/lib/bpf/Makefile. Sorry, I should have pointed it in my previous review.But actually, I have another issue related to the libbfd feature: since commit
280e7c48c3b8("perf tools: fix BFD detection on opensuse") it requires libiberty so that libbfd is correctly detected, but libiberty is not needed on all distros (at least Ubuntu can have libbfd without libiberty). Typically, detection fails on my setup, although I do have libbfd installed. So forcing libbfd feature here may eventually force users to install libraries they do not need to compile bpftool, which is not what we want.Quoted 6 lines
I do not have a clean work around to suggest. Maybe have one "libbfd-something" feature that tries to compile without libiberty, then another one that tries with it, and compile the tools if at least one of them succeeds. But it's probably for another patch series. In the meantime, would you please simply remove libbfd detection here and accept my apologies for suggesting to add it in the previous review?
Quoted 2 lines
I think since libbfd is already used by bpftool it's a good thing to add feature detection. Even if it's not perfect on some setups.
Agree, we can enhance it later.
Quoted 4 lines
Roman,
I think you still need to do one more respin to address commit log nit?
Sure, will send soon-ish.
Thanks!
Quoted 20 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.
Example:
before:$ bpftool version bpftool v4.14.6after:
$ bpftool version bpftool v4.15.0-rc3
Quoted 7 lines
$bpftool version --json
{"version":"4.15.0-rc3"}Signed-off-by Roman Gushchin <[email protected]>Cc Jakub Kicinski <[email protected]>Cc Alexei Starovoitov <[email protected]>Cc Daniel Borkmann <[email protected]>
Thanks Roman!