perf build: detect support for libbpf's emit_strings option
authorBlake Jones <blakejones@google.com>
Thu, 12 Jun 2025 19:49:35 +0000 (12:49 -0700)
committerNamhyung Kim <namhyung@kernel.org>
Fri, 20 Jun 2025 21:48:14 +0000 (14:48 -0700)
This creates a config option that detects libbpf's ability to display
character arrays as strings, which was just added to the BPF tree
(https://git.kernel.org/bpf/bpf-next/c/87c9c79a02b4).

To test this change, I built perf (from later in this patch set) with:

 - static libbpf (default, using source from kernel tree)
 - dynamic libbpf (LIBBPF_DYNAMIC=1 LIBBPF_INCLUDE=/usr/local/include)

For both the static and dynamic versions, I used headers with and without
the ".emit_strings" option.

I verified that of the four resulting binaries, the two with
".emit_strings" would successfully record BPF_METADATA events, and the two
without wouldn't.  All four binaries would successfully display
BPF_METADATA events, because the relevant bit of libbpf code is only used
during "perf record".

Signed-off-by: Blake Jones <blakejones@google.com>
Link: https://lore.kernel.org/r/20250612194939.162730-2-blakejones@google.com
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
tools/build/Makefile.feature
tools/build/feature/Makefile
tools/build/feature/test-libbpf-strings.c [new file with mode: 0644]
tools/perf/Documentation/perf-check.txt
tools/perf/Makefile.config
tools/perf/builtin-check.c

index 3a1fddd38db050ca880fd4dcf55c0d19b3e70849..2e5f4c8b6547652cd491c44d922b70e196768ec1 100644 (file)
@@ -126,6 +126,7 @@ FEATURE_TESTS_EXTRA :=                  \
          llvm                           \
          clang                          \
          libbpf                         \
+         libbpf-strings                 \
          libpfm4                        \
          libdebuginfod                 \
          clang-bpf-co-re               \
index 4aa166d3eab620bf86af279bfe3a263717c8dec7..0c4e541ed56e89c68697301502a289088726c54e 100644 (file)
@@ -59,6 +59,7 @@ FILES=                                          \
          test-lzma.bin                          \
          test-bpf.bin                           \
          test-libbpf.bin                        \
+         test-libbpf-strings.bin                \
          test-get_cpuid.bin                     \
          test-sdt.bin                           \
          test-cxx.bin                           \
@@ -339,6 +340,9 @@ $(OUTPUT)test-bpf.bin:
 $(OUTPUT)test-libbpf.bin:
        $(BUILD) -lbpf
 
+$(OUTPUT)test-libbpf-strings.bin:
+       $(BUILD)
+
 $(OUTPUT)test-sdt.bin:
        $(BUILD)
 
diff --git a/tools/build/feature/test-libbpf-strings.c b/tools/build/feature/test-libbpf-strings.c
new file mode 100644 (file)
index 0000000..83e6c45
--- /dev/null
@@ -0,0 +1,10 @@
+// SPDX-License-Identifier: GPL-2.0
+#include <bpf/btf.h>
+
+int main(void)
+{
+       struct btf_dump_type_data_opts opts;
+
+       opts.emit_strings = 0;
+       return opts.emit_strings;
+}
index a764a46292206632c9bc890342ceadbf8889c4de..799982d8d86878b9190c35ec13ce3bf7387d2a00 100644 (file)
@@ -52,6 +52,7 @@ feature::
                 dwarf-unwind            /  HAVE_DWARF_UNWIND_SUPPORT
                 auxtrace                /  HAVE_AUXTRACE_SUPPORT
                 libbfd                  /  HAVE_LIBBFD_SUPPORT
+                libbpf-strings          /  HAVE_LIBBPF_STRINGS_SUPPORT
                 libcapstone             /  HAVE_LIBCAPSTONE_SUPPORT
                 libcrypto               /  HAVE_LIBCRYPTO_SUPPORT
                 libdw-dwarf-unwind      /  HAVE_LIBDW_SUPPORT
index d1ea7bf449647eb25e836d5d0d458cf58df6d4d1..affe5e1739208e1128498c39b071a4f37b19e2be 100644 (file)
@@ -595,8 +595,16 @@ ifndef NO_LIBELF
           LIBBPF_STATIC := 1
           $(call detected,CONFIG_LIBBPF)
           CFLAGS += -DHAVE_LIBBPF_SUPPORT
+         LIBBPF_INCLUDE = $(LIBBPF_DIR)/..
         endif
       endif
+
+      FEATURE_CHECK_CFLAGS-libbpf-strings="-I$(LIBBPF_INCLUDE)"
+      $(call feature_check,libbpf-strings)
+      ifeq ($(feature-libbpf-strings), 1)
+        $(call detected,CONFIG_LIBBPF_STRINGS)
+        CFLAGS += -DHAVE_LIBBPF_STRINGS_SUPPORT
+      endif
     endif
   endif # NO_LIBBPF
 endif # NO_LIBELF
index 9a509cb3bb9a0ad626185d9c1b6cbdded7db5e5a..f4827f0ddb47167748ccde5bc9610216dc9d4b21 100644 (file)
@@ -43,6 +43,7 @@ struct feature_status supported_features[] = {
        FEATURE_STATUS("dwarf-unwind", HAVE_DWARF_UNWIND_SUPPORT),
        FEATURE_STATUS("auxtrace", HAVE_AUXTRACE_SUPPORT),
        FEATURE_STATUS_TIP("libbfd", HAVE_LIBBFD_SUPPORT, "Deprecated, license incompatibility, use BUILD_NONDISTRO=1 and install binutils-dev[el]"),
+       FEATURE_STATUS("libbpf-strings", HAVE_LIBBPF_STRINGS_SUPPORT),
        FEATURE_STATUS("libcapstone", HAVE_LIBCAPSTONE_SUPPORT),
        FEATURE_STATUS("libcrypto", HAVE_LIBCRYPTO_SUPPORT),
        FEATURE_STATUS("libdw-dwarf-unwind", HAVE_LIBDW_SUPPORT),