[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