]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blobdiff - tools/bpf/bpftool/jit_disasm.c
bpftool: make libbfd optional
[mirror_ubuntu-bionic-kernel.git] / tools / bpf / bpftool / jit_disasm.c
index 1551d3918d4cdc7c73e9b0e5f952740b6c6d40b9..ec046e3061d63f2e272c19301fd0bc0f9f81345b 100644 (file)
@@ -10,6 +10,8 @@
  * Licensed under the GNU General Public License, version 2.0 (GPLv2)
  */
 
+#define _GNU_SOURCE
+#include <stdio.h>
 #include <stdarg.h>
 #include <stdint.h>
 #include <stdio.h>
@@ -51,11 +53,13 @@ static int fprintf_json(void *out, const char *fmt, ...)
        char *s;
 
        va_start(ap, fmt);
+       if (vasprintf(&s, fmt, ap) < 0)
+               return -1;
+       va_end(ap);
+
        if (!oper_count) {
                int i;
 
-               s = va_arg(ap, char *);
-
                /* Strip trailing spaces */
                i = strlen(s) - 1;
                while (s[i] == ' ')
@@ -68,11 +72,10 @@ static int fprintf_json(void *out, const char *fmt, ...)
        } else if (!strcmp(fmt, ",")) {
                   /* Skip */
        } else {
-               s = va_arg(ap, char *);
                jsonw_string(json_wtr, s);
                oper_count++;
        }
-       va_end(ap);
+       free(s);
        return 0;
 }
 
@@ -107,7 +110,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)
@@ -160,3 +170,9 @@ void disasm_print_insn(unsigned char *image, ssize_t len, int opcodes)
 
        bfd_close(bfdf);
 }
+
+int disasm_init(void)
+{
+       bfd_init();
+       return 0;
+}