]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/commitdiff
bpftool: make libbfd optional
authorStanislav Fomichev <sdf@google.com>
Wed, 20 Nov 2019 11:48:00 +0000 (12:48 +0100)
committerKleber Sacilotto de Souza <kleber.souza@canonical.com>
Fri, 14 Feb 2020 10:40:27 +0000 (11:40 +0100)
BugLink: https://bugs.launchpad.net/bugs/1774815
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>
(backported from commit 29a9c10e4110e368443f0b606d71557edee7f2cc)
Signed-off-by: Quentin Monnet <quentin.monnet@netronome.com>
Acked-by: Seth Forshee <seth.forshee@canonical.com>
Acked-by: Kleber Sacilotto de Souza <kleber.souza@canonical.com>
Signed-off-by: Kleber Sacilotto de Souza <kleber.souza@canonical.com>
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 9e433c3f8bbefc6bef6c1c9b2e90d599c48557a0..b0a1cbde08197db53e23050a8e79f14a1358b4e0 100644 (file)
@@ -53,7 +53,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/
-LIBS = -lelf -lbfd -lopcodes $(LIBBPF)
+LIBS = -lelf $(LIBBPF)
 
 FEATURE_USER = .bpftool
 FEATURE_TESTS = libbfd disassembler-four-args
@@ -83,7 +83,16 @@ include $(wildcard *.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 034d91284ae5005a689487e7a71c168026f9c50a..ec046e3061d63f2e272c19301fd0bc0f9f81345b 100644 (file)
@@ -170,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;
+}
index d294bc8168bed8cc72f8926c6947b98aba0cbcc6..b11429bb65cbb0356c4e13728c6ab41c388c337f 100644 (file)
@@ -33,7 +33,6 @@
 
 /* Author: Jakub Kicinski <kubakici@wp.pl> */
 
-#include <bfd.h>
 #include <ctype.h>
 #include <errno.h>
 #include <getopt.h>
@@ -327,8 +326,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 8d5c76b3450dc919217025f560edcb405aad5477..f82744deadb4e0e3a8dfb1ecfb5646fa41dc849d 100644 (file)
@@ -117,7 +117,20 @@ int do_map(int argc, char **arg);
 
 int prog_parse_fd(int *argc, char ***argv);
 
+#ifdef HAVE_LIBBFD_SUPPORT
 void disasm_print_insn(unsigned char *image, ssize_t len, int opcodes);
+int disasm_init(void);
+#else
+static inline
+void disasm_print_insn(unsigned char *image, ssize_t len, int opcodes)
+{
+}
+static inline int disasm_init(void)
+{
+       p_err("No libbfd support");
+       return -1;
+}
+#endif
 void print_hex_data_json(uint8_t *data, size_t len);
 
 #endif
index 26df1a936ebfde4dd13be70834fcf847fefadd3b..caede2cd784a4a8bc320ae14f1647861a1680136 100644 (file)
@@ -521,6 +521,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")) {