void mdb_create_loadable_disasms(void) { DIR *dir; struct dirent *dp; char buf[PATH_MAX], *p, *q; size_t len; #ifdef _LP64 len = mdb_snprintf(buf, sizeof (buf), "%s/usr/lib/mdb/disasm/%s", mdb.m_root, mdb_conf_isa()); #else len = mdb_snprintf(buf, sizeof (buf), "%s/usr/lib/mdb/disasm", mdb.m_root); #endif p = &buf[len]; if ((dir = opendir(buf)) == NULL) return; while ((dp = readdir(dir)) != NULL) { if (dp->d_name[0] == '.') continue; /* skip "." and ".." */ if ((q = strrchr(dp->d_name, '.')) == NULL || strcmp(q, ".so") != 0) continue; (void) mdb_snprintf(p, sizeof (buf) - len, "/%s", dp->d_name); (void) mdb_module_load(buf, MDB_MOD_SILENT); } (void) closedir(dir); }
static int identify_xvm_file(const char *file, int *longmode) { int (*identify)(const char *, int *); if (mdb_module_load("mdb_kb", MDB_MOD_GLOBAL | MDB_MOD_SILENT) != 0) return (0); identify = (int (*)())dlsym(RTLD_NEXT, "xkb_identify"); if (identify == NULL) return (0); return (identify(file, longmode)); }
void kt_activate(mdb_tgt_t *t) { static const mdb_nv_disc_t reg_disc = { NULL, reg_disc_get }; kt_data_t *kt = t->t_data; void *sym; int oflag; mdb_prop_postmortem = (kt->k_dumphdr != NULL); mdb_prop_kernel = TRUE; mdb_prop_datamodel = MDB_TGT_MODEL_NATIVE; if (kt->k_activated == FALSE) { struct utsname u1, u2; /* * If we're examining a crash dump, root is /, and uname(2) * does not match the utsname in the dump, issue a warning. * Note that we are assuming that the modules and macros in * /usr/lib are compiled against the kernel from uname -rv. */ if (mdb_prop_postmortem && strcmp(mdb.m_root, "/") == 0 && uname(&u1) >= 0 && kt_uname(t, &u2) >= 0 && (strcmp(u1.release, u2.release) || strcmp(u1.version, u2.version))) { mdb_warn("warning: dump is from %s %s %s; dcmds and " "macros may not match kernel implementation\n", u2.sysname, u2.release, u2.version); } if (mdb_module_load(KT_MODULE, MDB_MOD_GLOBAL) < 0) { warn("failed to load kernel support module -- " "some modules may not load\n"); } if (mdb_prop_postmortem) { sym = dlsym(RTLD_NEXT, "mdb_dump_print_content"); if (sym != NULL) kt->k_dump_print_content = (void (*)())sym; sym = dlsym(RTLD_NEXT, "mdb_dump_find_curproc"); if (sym != NULL) kt->k_dump_find_curproc = (int (*)())sym; kt->k_dumpcontent = kt_find_dump_contents(kt); } if (t->t_flags & MDB_TGT_F_PRELOAD) { oflag = mdb_iob_getflags(mdb.m_out) & MDB_IOB_PGENABLE; mdb_iob_clrflags(mdb.m_out, oflag); mdb_iob_puts(mdb.m_out, "Preloading module symbols: ["); mdb_iob_flush(mdb.m_out); } if (!(t->t_flags & MDB_TGT_F_NOLOAD)) kt_load_modules(kt, t); if (t->t_flags & MDB_TGT_F_PRELOAD) { mdb_iob_puts(mdb.m_out, " ]\n"); mdb_iob_setflags(mdb.m_out, oflag); } kt->k_activated = TRUE; } (void) mdb_tgt_register_dcmds(t, &kt_dcmds[0], MDB_MOD_FORCE); /* Export some of our registers as named variables */ mdb_tgt_register_regvars(t, kt->k_rds, ®_disc, MDB_NV_RDONLY); mdb_tgt_elf_export(kt->k_file); }