bpftool: make libbfd optional
authorStanislav Fomichev <sdf@google.com>
Mon, 12 Nov 2018 21:44:10 +0000 (13:44 -0800)
committerAlexei Starovoitov <ast@kernel.org>
Sat, 17 Nov 2018 04:45:01 +0000 (20:45 -0800)
Make it possible to build bpftool without libbfd. libbfd and libopcodes are
typically provided in dev/dbg packages (binutils-dev in debian) which we
usually don't have installed on the fleet machines and we'd like a way to have
bpftool version that works without installing any additional packages.
This excludes support for disassembling jit-ted code and prints an error if
the user tries to use these features.

Tested by:
cat > FEATURES_DUMP.bpftool <<EOF
feature-libbfd=0
feature-disassembler-four-args=1
feature-reallocarray=0
feature-libelf=1
feature-libelf-mmap=1
feature-bpf=1
EOF
FEATURES_DUMP=$PWD/FEATURES_DUMP.bpftool make
ldd bpftool | grep libbfd

Signed-off-by: Stanislav Fomichev <sdf@google.com>
Acked-by: Jakub Kicinski <jakub.kicinski@netronome.com>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
tools/bpf/bpftool/Makefile
tools/bpf/bpftool/jit_disasm.c
tools/bpf/bpftool/main.c
tools/bpf/bpftool/main.h
tools/bpf/bpftool/prog.c

index dac7eff4c7e5d4534e4f0ed6655b2db6d51351d4..1bea6b979082325e73cabeaaeb2aafd19d8d9edd 100644 (file)
@@ -53,7 +53,7 @@ ifneq ($(EXTRA_LDFLAGS),)
 LDFLAGS += $(EXTRA_LDFLAGS)
 endif
 
-LIBS = -lelf -lbfd -lopcodes $(LIBBPF)
+LIBS = -lelf $(LIBBPF)
 
 INSTALL ?= install
 RM ?= rm -f
@@ -90,7 +90,16 @@ include $(wildcard $(OUTPUT)*.d)
 
 all: $(OUTPUT)bpftool
 
-SRCS = $(wildcard *.c)
+BFD_SRCS = jit_disasm.c
+
+SRCS = $(filter-out $(BFD_SRCS),$(wildcard *.c))
+
+ifeq ($(feature-libbfd),1)
+CFLAGS += -DHAVE_LIBBFD_SUPPORT
+SRCS += $(BFD_SRCS)
+LIBS += -lbfd -lopcodes
+endif
+
 OBJS = $(patsubst %.c,$(OUTPUT)%.o,$(SRCS)) $(OUTPUT)disasm.o
 
 $(OUTPUT)disasm.o: $(srctree)/kernel/bpf/disasm.c
index c75ffd9ce2bb30c34ae644f617d667348431f5bd..b2ed5ee1af5fed76a4e65fb9db728121705c1a46 100644 (file)
@@ -109,7 +109,7 @@ void disasm_print_insn(unsigned char *image, ssize_t len, int opcodes,
                if (inf) {
                        bfdf->arch_info = inf;
                } else {
-                       p_err("No libfd support for %s", arch);
+                       p_err("No libbfd support for %s", arch);
                        return;
                }
        }
@@ -183,3 +183,9 @@ void disasm_print_insn(unsigned char *image, ssize_t len, int opcodes,
 
        bfd_close(bfdf);
 }
+
+int disasm_init(void)
+{
+       bfd_init();
+       return 0;
+}
index 75a3296dc0bc8172117d87666cd85117c5560874..5c4c1cd5a7ba24166a84c7badd929c82552e1deb 100644 (file)
@@ -31,7 +31,6 @@
  * SOFTWARE.
  */
 
-#include <bfd.h>
 #include <ctype.h>
 #include <errno.h>
 #include <getopt.h>
@@ -399,8 +398,6 @@ int main(int argc, char **argv)
        if (argc < 0)
                usage();
 
-       bfd_init();
-
        ret = cmd_select(cmds, argc, argv, do_help);
 
        if (json_output)
index 61d82020af58eb5547969ba875a184089f23611c..10c6c16fae29a25b98dcd1a8a59e53579b193fc7 100644 (file)
@@ -147,8 +147,22 @@ int prog_parse_fd(int *argc, char ***argv);
 int map_parse_fd(int *argc, char ***argv);
 int map_parse_fd_and_info(int *argc, char ***argv, void *info, __u32 *info_len);
 
+#ifdef HAVE_LIBBFD_SUPPORT
 void disasm_print_insn(unsigned char *image, ssize_t len, int opcodes,
                       const char *arch, const char *disassembler_options);
+int disasm_init(void);
+#else
+static inline
+void disasm_print_insn(unsigned char *image, ssize_t len, int opcodes,
+                      const char *arch, const char *disassembler_options)
+{
+}
+static inline int disasm_init(void)
+{
+       p_err("No libbfd support");
+       return -1;
+}
+#endif
 void print_data_json(uint8_t *data, size_t len);
 void print_hex_data_json(uint8_t *data, size_t len);
 
index 5ff5544596e71808fbb4b76c951efadaead3d28f..c176e1aa66fe144e2aa503a0beab0688b5849748 100644 (file)
@@ -467,6 +467,9 @@ static int do_dump(int argc, char **argv)
        int fd;
 
        if (is_prefix(*argv, "jited")) {
+               if (disasm_init())
+                       return -1;
+
                member_len = &info.jited_prog_len;
                member_ptr = &info.jited_prog_insns;
        } else if (is_prefix(*argv, "xlated")) {