mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	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 <andres@anarazel.de> Acked-by: Quentin Monnet <quentin@isovalent.com> Cc: Alexei Starovoitov <ast@kernel.org> Cc: Ben Hutchings <benh@debian.org> Cc: Jiri Olsa <jolsa@kernel.org> Cc: Quentin Monnet <quentin@isovalent.com> Cc: Sedat Dilek <sedat.dilek@gmail.com> Cc: bpf@vger.kernel.org Link: http://lore.kernel.org/lkml/20220622181918.ykrs5rsnmx3og4sv@alap3.anarazel.de Link: https://lore.kernel.org/r/20220801013834.156015-8-andres@anarazel.de Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
		
							parent
							
								
									bab211f637
								
							
						
					
					
						commit
						600b7b26c0
					
				
					 2 changed files with 38 additions and 9 deletions
				
			
		| 
						 | 
					@ -93,7 +93,7 @@ INSTALL ?= install
 | 
				
			||||||
RM ?= rm -f
 | 
					RM ?= rm -f
 | 
				
			||||||
 | 
					
 | 
				
			||||||
FEATURE_USER = .bpftool
 | 
					FEATURE_USER = .bpftool
 | 
				
			||||||
FEATURE_TESTS = libbfd disassembler-four-args zlib libcap \
 | 
					FEATURE_TESTS = libbfd disassembler-four-args disassembler-init-styled zlib libcap \
 | 
				
			||||||
	clang-bpf-co-re
 | 
						clang-bpf-co-re
 | 
				
			||||||
FEATURE_DISPLAY = libbfd disassembler-four-args zlib libcap \
 | 
					FEATURE_DISPLAY = libbfd disassembler-four-args zlib libcap \
 | 
				
			||||||
	clang-bpf-co-re
 | 
						clang-bpf-co-re
 | 
				
			||||||
| 
						 | 
					@ -117,6 +117,9 @@ endif
 | 
				
			||||||
ifeq ($(feature-disassembler-four-args), 1)
 | 
					ifeq ($(feature-disassembler-four-args), 1)
 | 
				
			||||||
CFLAGS += -DDISASM_FOUR_ARGS_SIGNATURE
 | 
					CFLAGS += -DDISASM_FOUR_ARGS_SIGNATURE
 | 
				
			||||||
endif
 | 
					endif
 | 
				
			||||||
 | 
					ifeq ($(feature-disassembler-init-styled), 1)
 | 
				
			||||||
 | 
					    CFLAGS += -DDISASM_INIT_STYLED
 | 
				
			||||||
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
LIBS = $(LIBBPF) -lelf -lz
 | 
					LIBS = $(LIBBPF) -lelf -lz
 | 
				
			||||||
LIBS_BOOTSTRAP = $(LIBBPF_BOOTSTRAP) -lelf -lz
 | 
					LIBS_BOOTSTRAP = $(LIBBPF_BOOTSTRAP) -lelf -lz
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -24,6 +24,7 @@
 | 
				
			||||||
#include <sys/stat.h>
 | 
					#include <sys/stat.h>
 | 
				
			||||||
#include <limits.h>
 | 
					#include <limits.h>
 | 
				
			||||||
#include <bpf/libbpf.h>
 | 
					#include <bpf/libbpf.h>
 | 
				
			||||||
 | 
					#include <tools/dis-asm-compat.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "json_writer.h"
 | 
					#include "json_writer.h"
 | 
				
			||||||
#include "main.h"
 | 
					#include "main.h"
 | 
				
			||||||
| 
						 | 
					@ -39,15 +40,12 @@ static void get_exec_path(char *tpath, size_t size)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int oper_count;
 | 
					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;
 | 
						char *s;
 | 
				
			||||||
	int err;
 | 
						int err;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	va_start(ap, fmt);
 | 
					 | 
				
			||||||
	err = vasprintf(&s, fmt, ap);
 | 
						err = vasprintf(&s, fmt, ap);
 | 
				
			||||||
	va_end(ap);
 | 
					 | 
				
			||||||
	if (err < 0)
 | 
						if (err < 0)
 | 
				
			||||||
		return -1;
 | 
							return -1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -73,6 +71,32 @@ static int fprintf_json(void *out, const char *fmt, ...)
 | 
				
			||||||
	return 0;
 | 
						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,
 | 
					void disasm_print_insn(unsigned char *image, ssize_t len, int opcodes,
 | 
				
			||||||
		       const char *arch, const char *disassembler_options,
 | 
							       const char *arch, const char *disassembler_options,
 | 
				
			||||||
		       const struct btf *btf,
 | 
							       const struct btf *btf,
 | 
				
			||||||
| 
						 | 
					@ -99,11 +123,13 @@ void disasm_print_insn(unsigned char *image, ssize_t len, int opcodes,
 | 
				
			||||||
	assert(bfd_check_format(bfdf, bfd_object));
 | 
						assert(bfd_check_format(bfdf, bfd_object));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (json_output)
 | 
						if (json_output)
 | 
				
			||||||
		init_disassemble_info(&info, stdout,
 | 
							init_disassemble_info_compat(&info, stdout,
 | 
				
			||||||
				      (fprintf_ftype) fprintf_json);
 | 
										     (fprintf_ftype) fprintf_json,
 | 
				
			||||||
 | 
										     fprintf_json_styled);
 | 
				
			||||||
	else
 | 
						else
 | 
				
			||||||
		init_disassemble_info(&info, stdout,
 | 
							init_disassemble_info_compat(&info, stdout,
 | 
				
			||||||
				      (fprintf_ftype) fprintf);
 | 
										     (fprintf_ftype) fprintf,
 | 
				
			||||||
 | 
										     fprintf_styled);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Update architecture info for offload. */
 | 
						/* Update architecture info for offload. */
 | 
				
			||||||
	if (arch) {
 | 
						if (arch) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue