|
|
@@ -0,0 +1,146 @@
|
|
|
+From a82db18ab34ba7f9d38319e8cc01ffe382e3e55e Mon Sep 17 00:00:00 2001
|
|
|
+From: Andres Freund <[email protected]>
|
|
|
+Date: Sun, 31 Jul 2022 18:38:33 -0700
|
|
|
+Subject: [PATCH 5/5] tools bpftool: Fix compilation error with new binutils
|
|
|
+
|
|
|
+binutils changed the signature of init_disassemble_info(), which now causes
|
|
|
+compilation to fail for tools/bpf/bpftool/jit_disasm.c, e.g. on debian
|
|
|
+unstable.
|
|
|
+
|
|
|
+Relevant binutils commit:
|
|
|
+
|
|
|
+ https://sourceware.org/git/?p=binutils-gdb.git;a=commit;h=60a3da00bd5407f07
|
|
|
+
|
|
|
+Wire up the feature test and switch to init_disassemble_info_compat(),
|
|
|
+which were introduced in prior commits, fixing the compilation failure.
|
|
|
+
|
|
|
+I verified that bpftool can still disassemble bpf programs, both with an
|
|
|
+old and new dis-asm.h API. There are no output changes for plain and json
|
|
|
+formats. When comparing the output from old binutils (2.35)
|
|
|
+to new bintuils with the patch (upstream snapshot) there are a few output
|
|
|
+differences, but they are unrelated to this patch. An example hunk is:
|
|
|
+
|
|
|
+ 2f: pop %r14
|
|
|
+ 31: pop %r13
|
|
|
+ 33: pop %rbx
|
|
|
+ - 34: leaveq
|
|
|
+ - 35: retq
|
|
|
+ + 34: leave
|
|
|
+ + 35: ret
|
|
|
+
|
|
|
+Signed-off-by: Andres Freund <[email protected]>
|
|
|
+Acked-by: Quentin Monnet <[email protected]>
|
|
|
+Cc: Alexei Starovoitov <[email protected]>
|
|
|
+Cc: Ben Hutchings <[email protected]>
|
|
|
+Cc: Jiri Olsa <[email protected]>
|
|
|
+Cc: Quentin Monnet <[email protected]>
|
|
|
+Cc: Sedat Dilek <[email protected]>
|
|
|
+Cc: [email protected]
|
|
|
+Link: http://lore.kernel.org/lkml/[email protected]
|
|
|
+Link: https://lore.kernel.org/r/[email protected]
|
|
|
+Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
|
|
|
+(cherry picked from commit 600b7b26c07a070d0153daa76b3806c1e52c9e00)
|
|
|
+---
|
|
|
+ tools/bpf/bpftool/Makefile | 5 +++-
|
|
|
+ tools/bpf/bpftool/jit_disasm.c | 42 +++++++++++++++++++++++++++-------
|
|
|
+ 2 files changed, 38 insertions(+), 9 deletions(-)
|
|
|
+
|
|
|
+--- a/tools/bpf/bpftool/Makefile
|
|
|
++++ b/tools/bpf/bpftool/Makefile
|
|
|
+@@ -76,7 +76,7 @@ INSTALL ?= install
|
|
|
+ RM ?= rm -f
|
|
|
+
|
|
|
+ FEATURE_USER = .bpftool
|
|
|
+-FEATURE_TESTS = libbfd disassembler-four-args reallocarray zlib libcap \
|
|
|
++FEATURE_TESTS = libbfd disassembler-four-args disassembler-init-styled reallocarray zlib libcap \
|
|
|
+ clang-bpf-co-re
|
|
|
+ FEATURE_DISPLAY = libbfd disassembler-four-args zlib libcap \
|
|
|
+ clang-bpf-co-re
|
|
|
+@@ -100,6 +100,9 @@ endif
|
|
|
+ ifeq ($(feature-disassembler-four-args), 1)
|
|
|
+ CFLAGS += -DDISASM_FOUR_ARGS_SIGNATURE
|
|
|
+ endif
|
|
|
++ifeq ($(feature-disassembler-init-styled), 1)
|
|
|
++ CFLAGS += -DDISASM_INIT_STYLED
|
|
|
++endif
|
|
|
+
|
|
|
+ ifeq ($(feature-reallocarray), 0)
|
|
|
+ CFLAGS += -DCOMPAT_NEED_REALLOCARRAY
|
|
|
+--- a/tools/bpf/bpftool/jit_disasm.c
|
|
|
++++ b/tools/bpf/bpftool/jit_disasm.c
|
|
|
+@@ -24,6 +24,7 @@
|
|
|
+ #include <sys/stat.h>
|
|
|
+ #include <limits.h>
|
|
|
+ #include <bpf/libbpf.h>
|
|
|
++#include <tools/dis-asm-compat.h>
|
|
|
+
|
|
|
+ #include "json_writer.h"
|
|
|
+ #include "main.h"
|
|
|
+@@ -39,15 +40,12 @@ static void get_exec_path(char *tpath, s
|
|
|
+ }
|
|
|
+
|
|
|
+ static int oper_count;
|
|
|
+-static int fprintf_json(void *out, const char *fmt, ...)
|
|
|
++static int printf_json(void *out, const char *fmt, va_list ap)
|
|
|
+ {
|
|
|
+- va_list ap;
|
|
|
+ char *s;
|
|
|
+ int err;
|
|
|
+
|
|
|
+- va_start(ap, fmt);
|
|
|
+ err = vasprintf(&s, fmt, ap);
|
|
|
+- va_end(ap);
|
|
|
+ if (err < 0)
|
|
|
+ return -1;
|
|
|
+
|
|
|
+@@ -73,6 +71,32 @@ static int fprintf_json(void *out, const
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
++static int fprintf_json(void *out, const char *fmt, ...)
|
|
|
++{
|
|
|
++ va_list ap;
|
|
|
++ int r;
|
|
|
++
|
|
|
++ va_start(ap, fmt);
|
|
|
++ r = printf_json(out, fmt, ap);
|
|
|
++ va_end(ap);
|
|
|
++
|
|
|
++ return r;
|
|
|
++}
|
|
|
++
|
|
|
++static int fprintf_json_styled(void *out,
|
|
|
++ enum disassembler_style style __maybe_unused,
|
|
|
++ const char *fmt, ...)
|
|
|
++{
|
|
|
++ va_list ap;
|
|
|
++ int r;
|
|
|
++
|
|
|
++ va_start(ap, fmt);
|
|
|
++ r = printf_json(out, fmt, ap);
|
|
|
++ va_end(ap);
|
|
|
++
|
|
|
++ return r;
|
|
|
++}
|
|
|
++
|
|
|
+ void disasm_print_insn(unsigned char *image, ssize_t len, int opcodes,
|
|
|
+ const char *arch, const char *disassembler_options,
|
|
|
+ const struct btf *btf,
|
|
|
+@@ -99,11 +123,13 @@ void disasm_print_insn(unsigned char *im
|
|
|
+ assert(bfd_check_format(bfdf, bfd_object));
|
|
|
+
|
|
|
+ if (json_output)
|
|
|
+- init_disassemble_info(&info, stdout,
|
|
|
+- (fprintf_ftype) fprintf_json);
|
|
|
++ init_disassemble_info_compat(&info, stdout,
|
|
|
++ (fprintf_ftype) fprintf_json,
|
|
|
++ fprintf_json_styled);
|
|
|
+ else
|
|
|
+- init_disassemble_info(&info, stdout,
|
|
|
+- (fprintf_ftype) fprintf);
|
|
|
++ init_disassemble_info_compat(&info, stdout,
|
|
|
++ (fprintf_ftype) fprintf,
|
|
|
++ fprintf_styled);
|
|
|
+
|
|
|
+ /* Update architecture info for offload. */
|
|
|
+ if (arch) {
|