[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