[DTrace-devel] [PATCH 5/8] symtab: add support for 'traceable' flag
Kris Van Hees
kris.van.hees at oracle.com
Fri Mar 7 21:34:38 UTC 2025
Signed-off-by: Kris Van Hees <kris.van.hees at oracle.com>
---
libdtrace/dt_symtab.c | 53 +++++++++++++++++++++++++++++++++++++++----
libdtrace/dt_symtab.h | 6 +++++
2 files changed, 55 insertions(+), 4 deletions(-)
diff --git a/libdtrace/dt_symtab.c b/libdtrace/dt_symtab.c
index db63cc88..4e46f280 100644
--- a/libdtrace/dt_symtab.c
+++ b/libdtrace/dt_symtab.c
@@ -23,9 +23,12 @@
#include <dt_string.h>
#include <unistd.h>
-#define DT_ST_SORTED 0x01 /* Sorted, ready for searching. */
-#define DT_ST_PACKED 0x02 /* Symbol table packed
+#define DT_ST_SORTED 0x01 /* Sorted, ready for searching. */
+#define DT_ST_PACKED 0x02 /* Symbol table packed
* (necessarily sorted too) */
+#define DT_ST_TRACEABLE 0x04 /* Symbols have traceable flag */
+
+#define DT_STB_TRACE 8 /* traceable symbol */
struct dt_symbol {
dt_list_t dts_list; /* list forward/back pointers */
@@ -275,6 +278,12 @@ dt_symbol_by_name(dtrace_hdl_t *dtp, const char *name)
return dt_htab_lookup(dtp->dt_kernsyms, &tmpl);
}
+dt_symbol_t *
+dt_symbol_by_name_next(const dt_symbol_t *symbol)
+{
+ return symbol ? (dt_symbol_t *)symbol->dts_he.next : NULL;
+}
+
/* Find a symbol in a given module. */
dt_symbol_t *
dt_module_symbol_by_name(dtrace_hdl_t *dtp, dt_module_t *dmp, const char *name)
@@ -548,7 +557,7 @@ dt_symbol_name(const dt_symbol_t *symbol)
void
dt_symbol_to_elfsym64(dtrace_hdl_t *dtp, dt_symbol_t *symbol, Elf64_Sym *elf_symp)
{
- elf_symp->st_info = symbol->dts_info;
+ elf_symp->st_info = symbol->dts_info & ~GELF_ST_INFO(DT_STB_TRACE, 0);
elf_symp->st_value = symbol->dts_addr;
elf_symp->st_size = symbol->dts_size;
elf_symp->st_shndx = 1; /* 'not SHN_UNDEF' is all we guarantee */
@@ -557,7 +566,7 @@ dt_symbol_to_elfsym64(dtrace_hdl_t *dtp, dt_symbol_t *symbol, Elf64_Sym *elf_sym
void
dt_symbol_to_elfsym32(dtrace_hdl_t *dtp, dt_symbol_t *symbol, Elf32_Sym *elf_symp)
{
- elf_symp->st_info = symbol->dts_info;
+ elf_symp->st_info = symbol->dts_info & ~GELF_ST_INFO(DT_STB_TRACE, 0);
elf_symp->st_value = symbol->dts_addr;
elf_symp->st_size = symbol->dts_size;
elf_symp->st_shndx = 1; /* 'not SHN_UNDEF' is all we guarantee */
@@ -581,3 +590,39 @@ dt_symbol_module(dt_symbol_t *symbol)
{
return symbol->dts_dmp;
}
+
+/*
+ * Mark the symtab annotated with traceable flags on symbols.
+ */
+void
+dt_symtab_set_traceable(dt_symtab_t *symtab)
+{
+ symtab->dtst_flags |= DT_ST_TRACEABLE;
+}
+
+/*
+ * Return whether symbols have traceable flags.
+ */
+int
+dt_symtab_traceable(const dt_symtab_t *symtab)
+{
+ return symtab->dtst_flags & DT_ST_TRACEABLE;
+}
+
+/*
+ * Mark a symbol as traceable.
+ */
+void
+dt_symbol_set_traceable(dt_symbol_t *symbol)
+{
+ symbol->dts_info |= GELF_ST_INFO(DT_STB_TRACE, 0);
+}
+
+/*
+ * Return true if the symbol can be traced.
+ */
+int
+dt_symbol_traceable(const dt_symbol_t *symbol)
+{
+ return GELF_ST_BIND(symbol->dts_info) & DT_STB_TRACE;
+}
diff --git a/libdtrace/dt_symtab.h b/libdtrace/dt_symtab.h
index 8d396c46..9ee60c38 100644
--- a/libdtrace/dt_symtab.h
+++ b/libdtrace/dt_symtab.h
@@ -39,6 +39,7 @@ extern dt_symbol_t *dt_symbol_insert(dtrace_hdl_t *dtp, dt_symtab_t *symtab,
struct dt_module *dmp, const char *name, GElf_Addr addr, GElf_Xword size,
unsigned char info);
extern dt_symbol_t *dt_symbol_by_name(dtrace_hdl_t *dtp, const char *name);
+extern dt_symbol_t *dt_symbol_by_name_next(const dt_symbol_t *symbol);
extern dt_symbol_t *dt_module_symbol_by_name(dtrace_hdl_t *dtp,
struct dt_module *dmp, const char *name);
extern dt_symbol_t *dt_symbol_by_addr(dt_symtab_t *symtab, GElf_Addr dts_addr);
@@ -51,6 +52,11 @@ extern void dt_symbol_to_elfsym(dtrace_hdl_t *dtp, dt_symbol_t *symbol,
GElf_Sym *elf_symp);
extern struct dt_module *dt_symbol_module(dt_symbol_t *symbol);
+extern void dt_symtab_set_traceable(dt_symtab_t *symtab);
+extern int dt_symtab_traceable(const dt_symtab_t *symtab);
+extern void dt_symbol_set_traceable(dt_symbol_t *symbol);
+extern int dt_symbol_traceable(const dt_symbol_t *symbol);
+
#ifdef __cplusplus
}
#endif
--
2.45.2
More information about the DTrace-devel
mailing list