[DTrace-devel] [PATCH] btf: fix symbol BTF ID lookup

Kris Van Hees kris.van.hees at oracle.com
Thu Jul 24 18:56:20 UTC 2025


The logic to perform a BTF ID lookup for a symbol did not guard against
BTF data not having been loaded for the module that contains the symbol.

Signed-off-by: Kris Van Hees <kris.van.hees at oracle.com>
---
 libdtrace/dt_bpf.c      |  2 +-
 libdtrace/dt_btf.c      | 32 +++++++++++++++++---------------
 libdtrace/dt_btf.h      |  2 +-
 libdtrace/dt_prov_fbt.c |  3 +--
 4 files changed, 20 insertions(+), 19 deletions(-)

diff --git a/libdtrace/dt_bpf.c b/libdtrace/dt_bpf.c
index 2ae7fed1..ccec8b43 100644
--- a/libdtrace/dt_bpf.c
+++ b/libdtrace/dt_bpf.c
@@ -523,7 +523,7 @@ dt_bpf_init_features(dtrace_hdl_t *dtp)
 {
 	uint32_t	btf_id;
 
-	btf_id = dt_btf_lookup_name_kind(dtp, dtp->dt_shared_btf,
+	btf_id = dt_btf_lookup_name_kind(dtp, dtp->dt_exec,
 					 "bpf_get_btf_vmlinux", BTF_KIND_FUNC);
 	if (btf_id >= 0 &&
 	    have_attach_type(BPF_PROG_TYPE_TRACING, BPF_TRACE_FENTRY, btf_id))
diff --git a/libdtrace/dt_btf.c b/libdtrace/dt_btf.c
index e9ead435..b84bba73 100644
--- a/libdtrace/dt_btf.c
+++ b/libdtrace/dt_btf.c
@@ -867,29 +867,32 @@ ok:
 }
 
 int32_t
-dt_btf_lookup_name_kind(dtrace_hdl_t *dtp, dt_btf_t *btf, const char *name,
+dt_btf_lookup_name_kind(dtrace_hdl_t *dtp, dt_module_t *dmp, const char *name,
 			uint32_t kind)
 {
-	int32_t	i, base = 0;
+	dt_btf_t	*btf = dmp->dm_btf;
+	int32_t		i, base = 0;
 
 	if (kind == BTF_KIND_UNKN)
 		return -ENOENT;
 	if (strcmp(name, "void") == 0)
 		return 0;
 
-	/*
-	 * Ensure the shared BTF is loaded, and if no BTF is given, use the
-	 * shared one.
-	 */
-	 if (!dtp->dt_shared_btf) {
-		  dt_btf_load_module(dtp, dtp->dt_exec);
+	/* Ensure the shared BTF is loaded. */
+	if (!dtp->dt_shared_btf)
+		dt_btf_load_module(dtp, dtp->dt_exec);
 
-		  if (!btf)
-			   btf = dtp->dt_shared_btf;
-	 }
+	/* If the module does not have BTF data yet, try to load it. */
+	if (!btf) {
+		btf = dt_btf_load_module(dtp, dmp);
 
-	 if (!btf)
-		  return -ENOENT;
+		/* If no BTF momdule data was found, use the shared BTF. */
+		if (!btf)
+			btf = dtp->dt_shared_btf;
+
+		if (!btf)
+			return -ENOENT;
+	}
 
 	/*
 	 * Any module other than 'vmlinux' inherits the types from 'vmlinux'.
@@ -915,8 +918,7 @@ dt_btf_lookup_name_kind(dtrace_hdl_t *dtp, dt_btf_t *btf, const char *name,
 	}
 
 	if (base > 0)
-		return dt_btf_lookup_name_kind(dtp, dtp->dt_shared_btf,
-					       name, kind);
+		return dt_btf_lookup_name_kind(dtp, dtp->dt_exec, name, kind);
 
 	return -ENOENT;
 }
diff --git a/libdtrace/dt_btf.h b/libdtrace/dt_btf.h
index e05b30d0..18fc70b5 100644
--- a/libdtrace/dt_btf.h
+++ b/libdtrace/dt_btf.h
@@ -21,7 +21,7 @@ extern void dt_btf_destroy(dtrace_hdl_t *, dt_btf_t *);
 extern dt_btf_t *dt_btf_load_module(dtrace_hdl_t *, dt_module_t *);
 extern ctf_dict_t *dt_btf_module_ctf(dtrace_hdl_t *, dt_module_t *);
 extern const char *dt_btf_get_string(dtrace_hdl_t *, dt_btf_t *, uint32_t);
-extern int32_t dt_btf_lookup_name_kind(dtrace_hdl_t *, dt_btf_t *,
+extern int32_t dt_btf_lookup_name_kind(dtrace_hdl_t *, dt_module_t *,
 				       const char *, uint32_t);
 extern int dt_btf_func_argc(dtrace_hdl_t *dtp, const dt_btf_t *btf,
 			    uint32_t id);
diff --git a/libdtrace/dt_prov_fbt.c b/libdtrace/dt_prov_fbt.c
index 2dd2b7f6..0ba20988 100644
--- a/libdtrace/dt_prov_fbt.c
+++ b/libdtrace/dt_prov_fbt.c
@@ -350,8 +350,7 @@ static int fprobe_probe_info(dtrace_hdl_t *dtp, const dt_probe_t *prp,
 	if (dmp == NULL)
 		goto done;
 
-	btf_id = dt_btf_lookup_name_kind(dtp, dmp->dm_btf, desc->fun,
-					 BTF_KIND_FUNC);
+	btf_id = dt_btf_lookup_name_kind(dtp, dmp, desc->fun, BTF_KIND_FUNC);
 	if (btf_id <= 0)
 		goto done;
 
-- 
2.43.5




More information about the DTrace-devel mailing list