[PATCH v2] Fix build failure due to btf on Linux < 6.0
Giulio Benetti <[email protected]> Thu, 12 Mar 2026 21:36:01 +0100
| Newsgroups | org.kernel.vger.linux-trace-devel |
|---|---|
| Message-ID | <[email protected]> |
With commit: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=6089fb325cf737eeb2c4d236c94697112ca860da enum BTF_KIND_ENUM64 has been firstly introduced and this is the latest BTF_KIND_* enumaration to be added to libtraceevent. So let's check in runtime, both in Makefile and meson, if BTF_KIND_ENUM64 does exist. If it's not there let's disable btf support. Signed-off-by: Steven Rostedt (Google) <[email protected]> Co-authored-by: Giulio Benetti <[email protected]> Signed-off-by: Giulio Benetti <[email protected]> --- V1->V2: * fixed meson check and all bft C source --- Makefile | 28 +++++++++++++++++++++------- src/meson.build | 12 ++++++++++++ src/trace-btf.c | 31 +++++++++++++++++++++++++++++-- 3 files changed, 62 insertions(+), 9 deletions(-) diff --git a/Makefile b/Makefile index e1a10a0..bd88a98 100644 --- a/Makefile +++ b/Makefile @@ -27,6 +27,13 @@ $(call allow-override,PKG_CONFIG,pkg-config) $(call allow-override,LD_SO_CONF_PATH,/etc/ld.so.conf.d/) $(call allow-override,LDCONFIG,ldconfig) +# Set compile option CFLAGS +ifdef EXTRA_CFLAGS + CFLAGS ?= $(EXTRA_CFLAGS) +else + CFLAGS ?= -g -Wall +endif + EXT = -std=gnu99 INSTALL = install @@ -37,6 +44,20 @@ INSTALL = install DESTDIR ?= DESTDIR_SQ = '$(subst ','\'',$(DESTDIR))' +test-build = $(if $(shell sh -c 'echo "$(1)" | tee /tmp/t.c| \ + $(CC) -o /dev/null -x c - > /dev/null 2>&1 && echo y'), $2) + +define BTF_LATEST_SOURCE +#include <linux/btf.h> +int main(void) { return BTF_KIND_ENUM64; } +endef + +BTF_OK := $(call test-build,$(BTF_LATEST_SOURCE),y) + +ifneq ($(strip $(BTF_OK)), y) +CFLAGS += -DNO_BTF +endif + LP64 := $(shell echo __LP64__ | ${CC} ${CFLAGS} -E -x c - | tail -n 1) ifeq ($(LP64), 1) libdir_relative_temp = lib64 @@ -123,13 +144,6 @@ INCLUDES = -I. -I $(srctree)/include -I $(EP_HEADERS_DIR) $(CONFIG_INCLUDES) export LIBTRACEEVENT_STATIC LIBTRACEEVENT_SHARED EP_HEADERS_DIR -# Set compile option CFLAGS -ifdef EXTRA_CFLAGS - CFLAGS := $(EXTRA_CFLAGS) -else - CFLAGS := -g -Wall -endif - LIBS ?= -ldl export LIBS diff --git a/src/meson.build b/src/meson.build index 3a7a082..2432dd8 100644 --- a/src/meson.build +++ b/src/meson.build @@ -17,6 +17,18 @@ sources= [ cc = meson.get_compiler('c') dl_dep = cc.find_library('dl') +btf_enum64_test_code = ''' +#include <linux/btf.h> +int main(void) { + int x = BTF_KIND_ENUM64; + return 0; +} +''' + +if not cc.compiles(btf_enum64_test_code, name : 'BTF_KIND_ENUM64 check') + add_project_arguments('-DNO_BTF', language : 'c') +endif + libtraceevent = library( 'traceevent', sources, diff --git a/src/trace-btf.c b/src/trace-btf.c index 859b086..52e933c 100644 --- a/src/trace-btf.c +++ b/src/trace-btf.c @@ -8,12 +8,13 @@ #include <stdlib.h> #include <stdbool.h> -#include <linux/btf.h> - #include "event-parse.h" #include "event-utils.h" #include "event-parse-local.h" +#ifndef NO_BTF +#include <linux/btf.h> + struct btf_header; struct btf_type; @@ -210,17 +211,24 @@ static int load_types(struct tep_btf *btf) qsort_r(btf->funcs, btf->nr_funcs, sizeof(btf->funcs[0]), cmp_funcs, btf); return 0; } +#endif __hidden void btf_free(struct tep_btf *btf) { +#ifdef NO_BTF + tep_warning("BTF not supported.\n"); + return; +#else if (!btf) return; free(btf->types); free(btf->funcs); free(btf->raw_data); +#endif } +#ifndef NO_BTF static struct tep_btf *btf_init(void *raw_data, size_t data_size) { struct tep_btf *btf; @@ -271,6 +279,7 @@ static struct tep_btf *btf_init(void *raw_data, size_t data_size) btf_free(btf); return NULL; } +#endif /** * tep_load_btf - Load BTF information into a tep handle @@ -285,6 +294,10 @@ static struct tep_btf *btf_init(void *raw_data, size_t data_size) */ int tep_load_btf(struct tep_handle *tep, void *raw_data, size_t data_size) { +#ifdef NO_BTF + tep_warning("BTF not supported.\n"); + return -1; +#else /* If btf was already loaded, free it */ btf_free(tep->btf); @@ -292,8 +305,10 @@ int tep_load_btf(struct tep_handle *tep, void *raw_data, size_t data_size) if (!tep->btf) return -1; return 0; +#endif } +#ifndef NO_BTF static struct btf_type *btf_get_type(struct tep_btf *btf, int id) { if (!id || id > btf->nr_types) @@ -457,6 +472,7 @@ static int init_btf_func(struct tep_btf *btf, struct trace_seq *s, return 0; } +#endif /** * tep_btf_list_args - List the arguments (type and name) for a function @@ -471,6 +487,10 @@ static int init_btf_func(struct tep_btf *btf, struct trace_seq *s, */ int tep_btf_list_args(struct tep_handle *tep, struct trace_seq *s, const char *func) { +#ifdef NO_BTF + tep_warning("BTF not supported.\n"); + return -1; +#else struct tep_btf *btf = tep->btf; struct btf_type *type = tep_btf_find_func(btf, func); struct btf_param *param; @@ -520,6 +540,7 @@ int tep_btf_list_args(struct tep_handle *tep, struct trace_seq *s, const char *f trace_seq_printf(s, "%s", param_name); } return p; +#endif } /** @@ -543,6 +564,11 @@ int tep_btf_list_args(struct tep_handle *tep, struct trace_seq *s, const char *f int tep_btf_print_args(struct tep_handle *tep, struct trace_seq *s, void *args, int nmem, int size, const char *func) { +#ifdef NO_BTF + tep_warning("BTF not supported. Args:\n" + "args: %08x, nmem: %d, size: %d, func: %08x\n"); + return -1; +#else struct tep_btf *btf = tep->btf; struct btf_type *type = tep_btf_find_func(btf, func); struct btf_param *param; @@ -646,4 +672,5 @@ int tep_btf_print_args(struct tep_handle *tep, struct trace_seq *s, void *args, } } return 0; +#endif } -- 2.47.3