diff options
Diffstat (limited to 'usr/src/cmd/mdb/common/mdb/mdb_modapi.c')
-rw-r--r-- | usr/src/cmd/mdb/common/mdb/mdb_modapi.c | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/usr/src/cmd/mdb/common/mdb/mdb_modapi.c b/usr/src/cmd/mdb/common/mdb/mdb_modapi.c index 509ffeb6ac..59c34022c7 100644 --- a/usr/src/cmd/mdb/common/mdb/mdb_modapi.c +++ b/usr/src/cmd/mdb/common/mdb/mdb_modapi.c @@ -793,6 +793,55 @@ mdb_object_iter(mdb_object_cb_t cb, void *data) } /* + * Private callback structure for implementing mdb_symbol_iter, below. + */ +typedef struct { + mdb_symbol_cb_t si_cb; + void *si_arg; + int si_rval; +} symbol_iter_arg_t; + +/*ARGSUSED*/ +static int +mdb_symbol_cb(void *data, const GElf_Sym *gsym, const char *name, + const mdb_syminfo_t *sip, const char *obj) +{ + symbol_iter_arg_t *arg = data; + mdb_symbol_t sym; + + if (arg->si_rval != 0) + return (0); + + bzero(&sym, sizeof (sym)); + sym.sym_name = name; + sym.sym_object = obj; + sym.sym_sym = gsym; + sym.sym_table = sip->sym_table; + sym.sym_id = sip->sym_id; + + arg->si_rval = arg->si_cb(&sym, arg->si_arg); + + return (0); +} + +int +mdb_symbol_iter(const char *obj, uint_t which, uint_t type, + mdb_symbol_cb_t cb, void *data) +{ + symbol_iter_arg_t arg; + + arg.si_cb = cb; + arg.si_arg = data; + arg.si_rval = 0; + + if (mdb_tgt_symbol_iter(mdb.m_target, obj, which, type, + mdb_symbol_cb, &arg) != 0) + return (-1); + + return (arg.si_rval); +} + +/* * Private structure and function for implementing mdb_dumpptr on top * of mdb_dump_internal */ |