[PATCH 3/3] bpftool: Allow to link libbpf dynamically
From: Jiri Olsa
Date: Wed Nov 27 2019 - 04:49:06 EST
Currently we support only static linking with kernel's libbpf
(tools/lib/bpf). This patch adds LIBBPF_DYNAMIC compile variable
that triggers libbpf detection and bpf dynamic linking:
$ make -C tools/bpf/bpftool make LIBBPF_DYNAMIC=1
If libbpf is not installed, build (with LIBBPF_DYNAMIC=1) stops with:
$ make -C tools/bpf/bpftool LIBBPF_DYNAMIC=1
Auto-detecting system features:
... libbfd: [ on ]
... disassembler-four-args: [ on ]
... zlib: [ on ]
... libbpf: [ OFF ]
Makefile:102: *** Error: libbpf-devel is missing, please install it. Stop.
Adding specific bpftool's libbpf check for libbpf_netlink_open (LIBBPF_0.0.6)
which is the latest we need for bpftool at the moment.
Adding LIBBPF_DIR compile variable to allow linking with
libbpf installed into specific directory:
$ make -C tools/lib/bpf/ prefix=/tmp/libbpf/ install_lib install_headers
$ make -C tools/bpf/bpftool/ LIBBPF_DYNAMIC=1 LIBBPF_DIR=/tmp/libbpf/
It might be needed to clean build tree first because features
framework does not detect the change properly:
$ make -C tools/build/feature clean
$ make -C tools/bpf/bpftool/ clean
Signed-off-by: Jiri Olsa <jolsa@xxxxxxxxxx>
---
tools/bpf/bpftool/Makefile | 40 ++++++++++++++++++++++++++++++-
tools/build/feature/test-libbpf.c | 9 +++++++
2 files changed, 48 insertions(+), 1 deletion(-)
diff --git a/tools/bpf/bpftool/Makefile b/tools/bpf/bpftool/Makefile
index 39bc6f0f4f0b..2b6ed08cb31e 100644
--- a/tools/bpf/bpftool/Makefile
+++ b/tools/bpf/bpftool/Makefile
@@ -1,6 +1,15 @@
# SPDX-License-Identifier: GPL-2.0-only
+# LIBBPF_DYNAMIC to enable libbpf dynamic linking.
+
include ../../scripts/Makefile.include
include ../../scripts/utilities.mak
+include ../../scripts/Makefile.arch
+
+ifeq ($(LP64), 1)
+ libdir_relative = lib64
+else
+ libdir_relative = lib
+endif
ifeq ($(srctree),)
srctree := $(patsubst %/,%,$(dir $(CURDIR)))
@@ -55,7 +64,7 @@ ifneq ($(EXTRA_LDFLAGS),)
LDFLAGS += $(EXTRA_LDFLAGS)
endif
-LIBS = $(LIBBPF) -lelf -lz
+LIBS = -lelf -lz
INSTALL ?= install
RM ?= rm -f
@@ -64,6 +73,23 @@ FEATURE_USER = .bpftool
FEATURE_TESTS = libbfd disassembler-four-args reallocarray zlib
FEATURE_DISPLAY = libbfd disassembler-four-args zlib
+ifdef LIBBPF_DYNAMIC
+ # Add libbpf check with the flags to ensure bpftool
+ # specific version is detected.
+ FEATURE_CHECK_CFLAGS-libbpf := -DBPFTOOL
+ FEATURE_TESTS += libbpf
+ FEATURE_DISPLAY += libbpf
+
+ # for linking with debug library run:
+ # make LIBBPF_DYNAMIC=1 LIBBPF_DIR=/opt/libbpf
+ ifdef LIBBPF_DIR
+ LIBBPF_CFLAGS := -I$(LIBBPF_DIR)/include
+ LIBBPF_LDFLAGS := -L$(LIBBPF_DIR)/$(libdir_relative)
+ FEATURE_CHECK_CFLAGS-libbpf := $(LIBBPF_CFLAGS)
+ FEATURE_CHECK_LDFLAGS-libbpf := $(LIBBPF_LDFLAGS)
+ endif
+endif
+
check_feat := 1
NON_CHECK_FEAT_TARGETS := clean uninstall doc doc-clean doc-install doc-uninstall
ifdef MAKECMDGOALS
@@ -88,6 +114,18 @@ ifeq ($(feature-reallocarray), 0)
CFLAGS += -DCOMPAT_NEED_REALLOCARRAY
endif
+ifdef LIBBPF_DYNAMIC
+ ifeq ($(feature-libbpf), 1)
+ LIBS += -lbpf
+ CFLAGS += $(LIBBPF_CFLAGS)
+ LDFLAGS += $(LIBBPF_LDFLAGS)
+ else
+ dummy := $(error Error: No libbpf devel library found, please install libbpf-devel)
+ endif
+else
+ LIBS += $(LIBBPF)
+endif
+
include $(wildcard $(OUTPUT)*.d)
all: $(OUTPUT)bpftool
diff --git a/tools/build/feature/test-libbpf.c b/tools/build/feature/test-libbpf.c
index a508756cf4cc..93566d105a64 100644
--- a/tools/build/feature/test-libbpf.c
+++ b/tools/build/feature/test-libbpf.c
@@ -3,5 +3,14 @@
int main(void)
{
+#ifdef BPFTOOL
+ /*
+ * libbpf_netlink_open (LIBBPF_0.0.6) is the latest
+ * we need for bpftool at the moment
+ */
+ libbpf_netlink_open(NULL);
+ return 0;
+#else
return bpf_object__open("test") ? 0 : -1;
+#endif
}
--
2.21.0