From owner-p4-projects@FreeBSD.ORG Sat Feb 9 07:47:58 2008 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id D273216A468; Sat, 9 Feb 2008 07:47:57 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 978CE16A417 for ; Sat, 9 Feb 2008 07:47:57 +0000 (UTC) (envelope-from jb@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id 8D79B13C43E for ; Sat, 9 Feb 2008 07:47:57 +0000 (UTC) (envelope-from jb@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.1/8.14.1) with ESMTP id m197lvZN077592 for ; Sat, 9 Feb 2008 07:47:57 GMT (envelope-from jb@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.1/8.14.1/Submit) id m197lvIc077589 for perforce@freebsd.org; Sat, 9 Feb 2008 07:47:57 GMT (envelope-from jb@freebsd.org) Date: Sat, 9 Feb 2008 07:47:57 GMT Message-Id: <200802090747.m197lvIc077589@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to jb@freebsd.org using -f From: John Birrell To: Perforce Change Reviews Cc: Subject: PERFORCE change 135097 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 09 Feb 2008 07:47:58 -0000 http://perforce.freebsd.org/chv.cgi?CH=135097 Change 135097 by jb@jb_freebsd1 on 2008/02/09 07:47:16 More WIP. Start using some of the functions in our libproc. More to come. Affected files ... .. //depot/projects/dtrace/src/contrib/opensolaris/lib/libdtrace/common/dt_aggregate.c#15 edit .. //depot/projects/dtrace/src/contrib/opensolaris/lib/libdtrace/common/dt_consume.c#12 edit .. //depot/projects/dtrace/src/contrib/opensolaris/lib/libdtrace/common/dt_pid.c#12 edit .. //depot/projects/dtrace/src/contrib/opensolaris/lib/libdtrace/common/dt_subr.c#18 edit Differences ... ==== //depot/projects/dtrace/src/contrib/opensolaris/lib/libdtrace/common/dt_aggregate.c#15 (text) ==== @@ -236,8 +236,6 @@ static void dt_aggregate_usym(dtrace_hdl_t *dtp, uint64_t *data) { -printf("%s:%s(%d): DOODAD\n",__FUNCTION__,__FILE__,__LINE__); -#ifdef DOODAD uint64_t pid = data[0]; uint64_t *pc = &data[1]; struct ps_prochandle *P; @@ -251,19 +249,20 @@ dt_proc_lock(dtp, P); +#if defined(sun) if (Plookup_by_addr(P, *pc, NULL, 0, &sym) == 0) +#else + if (proc_addr2sym(P, *pc, NULL, 0, &sym) == 0) +#endif *pc = sym.st_value; dt_proc_unlock(dtp, P); dt_proc_release(dtp, P); -#endif } static void dt_aggregate_umod(dtrace_hdl_t *dtp, uint64_t *data) { -printf("%s:%s(%d): DOODAD\n",__FUNCTION__,__FILE__,__LINE__); -#ifdef DOODAD uint64_t pid = data[0]; uint64_t *pc = &data[1]; struct ps_prochandle *P; @@ -277,12 +276,15 @@ dt_proc_lock(dtp, P); +#if defined(sun) if ((map = Paddr_to_map(P, *pc)) != NULL) +#else + if ((map = proc_addr2map(P, *pc)) != NULL) +#endif *pc = map->pr_vaddr; dt_proc_unlock(dtp, P); dt_proc_release(dtp, P); -#endif } static void ==== //depot/projects/dtrace/src/contrib/opensolaris/lib/libdtrace/common/dt_consume.c#12 (text) ==== @@ -568,8 +568,6 @@ dt_print_ustack(dtrace_hdl_t *dtp, FILE *fp, const char *format, caddr_t addr, uint64_t arg) { -printf("%s:%s(%d): DOODAD\n",__FUNCTION__,__FILE__,__LINE__); -#ifdef DOODAD /* LINTED - alignment */ uint64_t *pc = (uint64_t *)addr; uint32_t depth = DTRACE_USTACK_NFRAMES(arg); @@ -614,17 +612,22 @@ dt_proc_lock(dtp, P); /* lock handle while we perform lookups */ for (i = 0; i < depth && pc[i] != 0; i++) { -printf("%s:%s(%d): DOODAD\n",__FUNCTION__,__FILE__,__LINE__); -#ifdef DOODAD const prmap_t *map; -#endif if ((err = dt_printf(dtp, fp, "%*s", indent, "")) < 0) break; +#if defined(sun) if (P != NULL && Plookup_by_addr(P, pc[i], +#else + if (P != NULL && proc_addr2sym(P, pc[i], +#endif name, sizeof (name), &sym) == 0) { +#if defined(sun) (void) Pobjname(P, pc[i], objname, sizeof (objname)); +#else + (void) proc_objname(P, pc[i], objname, sizeof (objname)); +#endif if (pc[i] > sym.st_value) { (void) snprintf(c, sizeof (c), @@ -634,11 +637,13 @@ (void) snprintf(c, sizeof (c), "%s`%s", dt_basename(objname), name); } -printf("%s:%s(%d): DOODAD\n",__FUNCTION__,__FILE__,__LINE__); -#ifdef DOODAD } else if (str != NULL && str[0] != '\0' && str[0] != '@' && +#if defined(sun) (P != NULL && ((map = Paddr_to_map(P, pc[i])) == NULL || (map->pr_mflags & MA_WRITE)))) { +#else + (P != NULL && ((map = proc_addr2map(P, pc[i])) == NULL))) { +#endif /* * If the current string pointer in the string table * does not point to an empty string _and_ the program @@ -653,9 +658,12 @@ * case and we refuse to use the string. */ (void) snprintf(c, sizeof (c), "%s", str); -#endif } else { +#if defined(sun) if (P != NULL && Pobjname(P, pc[i], objname, +#else + if (P != NULL && proc_objname(P, pc[i], objname, +#endif sizeof (objname)) != 0) { (void) snprintf(c, sizeof (c), "%s`0x%llx", dt_basename(objname), (u_longlong_t)pc[i]); @@ -703,16 +711,11 @@ } return (err); -#else -return 0; -#endif } static int dt_print_usym(dtrace_hdl_t *dtp, FILE *fp, caddr_t addr, dtrace_actkind_t act) { -printf("%s:%s(%d): DOODAD\n",__FUNCTION__,__FILE__,__LINE__); -#ifdef DOODAD /* LINTED - alignment */ uint64_t pid = ((uint64_t *)addr)[0]; /* LINTED - alignment */ @@ -730,7 +733,11 @@ dt_proc_lock(dtp, P); +#if defined(sun) if (Plookup_by_addr(P, pc, NULL, 0, &sym) == 0) +#else + if (proc_addr2sym(P, pc, NULL, 0, &sym) == 0) +#endif pc = sym.st_value; dt_proc_unlock(dtp, P); @@ -744,16 +751,11 @@ } while ((len = dtrace_uaddr2str(dtp, pid, pc, s, n)) >= n); return (dt_printf(dtp, fp, format, s)); -#else -return 0; -#endif } int dt_print_umod(dtrace_hdl_t *dtp, FILE *fp, const char *format, caddr_t addr) { -printf("%s:%s(%d): DOODAD\n",__FUNCTION__,__FILE__,__LINE__); -#ifdef DOODAD /* LINTED - alignment */ uint64_t pid = ((uint64_t *)addr)[0]; /* LINTED - alignment */ @@ -778,7 +780,11 @@ if (P != NULL) dt_proc_lock(dtp, P); /* lock handle while we perform lookups */ +#if defined(sun) if (P != NULL && Pobjname(P, pc, objname, sizeof (objname)) != 0) { +#else + if (P != NULL && proc_objname(P, pc, objname, sizeof (objname)) != 0) { +#endif (void) snprintf(c, sizeof (c), "%s", dt_basename(objname)); } else { (void) snprintf(c, sizeof (c), "0x%llx", (u_longlong_t)pc); @@ -792,9 +798,6 @@ } return (err); -#else -return 0; -#endif } int ==== //depot/projects/dtrace/src/contrib/opensolaris/lib/libdtrace/common/dt_pid.c#12 (text) ==== @@ -43,7 +43,6 @@ #include #include -#ifdef DOODAD typedef struct dt_pid_probe { dtrace_hdl_t *dpp_dtp; dt_pcb_t *dpp_pcb; @@ -61,24 +60,24 @@ GElf_Sym dpp_last; uint_t dpp_last_taken; } dt_pid_probe_t; -#endif /* * Compose the lmid and object name into the canonical representation. We * omit the lmid for the default link map for convenience. */ -#ifdef DOODAD static void dt_pid_objname(char *buf, size_t len, Lmid_t lmid, const char *obj) { +#if defined(sun) if (lmid == LM_ID_BASE) (void) strncpy(buf, obj, len); else (void) snprintf(buf, len, "LM%lx`%s", lmid, obj); +#else + (void) strncpy(buf, obj, len); +#endif } -#endif -#ifdef DOODAD static int dt_pid_error(dtrace_hdl_t *dtp, dt_pcb_t *pcb, dt_proc_t *dpr, fasttrap_probe_spec_t *ftp, dt_errtag_t tag, const char *fmt, ...) @@ -105,9 +104,7 @@ return (1); } -#endif -#ifdef DOODAD static int dt_pid_per_sym(dt_pid_probe_t *pp, const GElf_Sym *symp, const char *func) { @@ -123,7 +120,11 @@ int isdash = strcmp("-", func) == 0; pid_t pid; +#if defined(sun) pid = Pstatus(pp->dpp_pr)->pr_pid; +#else + pid = proc_getpid(pp->dpp_pr); +#endif dt_dprintf("creating probe pid%d:%s:%s:%s\n", (int)pid, pp->dpp_obj, func, pp->dpp_name); @@ -143,6 +144,7 @@ pp->dpp_obj); if (!isdash && gmatch("return", pp->dpp_name)) { +#ifdef DOODAD if (dt_pid_create_return_probe(pp->dpp_pr, dtp, ftp, symp, pp->dpp_stret) < 0) { return (dt_pid_error(dtp, pcb, dpr, ftp, @@ -150,17 +152,20 @@ "for '%s': %s", func, dtrace_errmsg(dtp, dtrace_errno(dtp)))); } +#endif nmatches++; } if (!isdash && gmatch("entry", pp->dpp_name)) { +#ifdef DOODAD if (dt_pid_create_entry_probe(pp->dpp_pr, dtp, ftp, symp) < 0) { return (dt_pid_error(dtp, pcb, dpr, ftp, D_PROC_CREATEFAIL, "failed to create entry probe " "for '%s': %s", func, dtrace_errmsg(dtp, dtrace_errno(dtp)))); } +#endif nmatches++; } @@ -179,8 +184,10 @@ (u_longlong_t)off, func)); } +#ifdef DOODAD err = dt_pid_create_offset_probe(pp->dpp_pr, pp->dpp_dtp, ftp, symp, off); +#endif if (err == DT_PROC_ERR) { return (dt_pid_error(dtp, pcb, dpr, ftp, @@ -198,6 +205,7 @@ nmatches++; } else if (glob && !isdash) { +#ifdef DOODAD if (dt_pid_create_glob_offset_probes(pp->dpp_pr, pp->dpp_dtp, ftp, symp, pp->dpp_name) < 0) { return (dt_pid_error(dtp, pcb, dpr, ftp, @@ -205,6 +213,7 @@ "failed to create offset probes in '%s': %s", func, dtrace_errmsg(dtp, dtrace_errno(dtp)))); } +#endif nmatches++; } @@ -215,9 +224,7 @@ return (0); } -#endif -#ifdef DOODAD static int dt_pid_sym_filt(void *arg, const GElf_Sym *symp, const char *func) { @@ -252,9 +259,7 @@ return (0); } -#endif -#ifdef DOODAD static int dt_pid_per_mod(void *arg, const prmap_t *pmp, const char *obj) { @@ -267,13 +272,17 @@ if (obj == NULL) return (0); +#if defined(sun) (void) Plmid(pp->dpp_pr, pmp->pr_vaddr, &pp->dpp_lmid); +#endif + if ((pp->dpp_obj = strrchr(obj, '/')) == NULL) pp->dpp_obj = obj; else pp->dpp_obj++; +#if defined(sun) if (Pxlookup_by_name(pp->dpp_pr, pp->dpp_lmid, obj, ".stret1", &sym, NULL) == 0) pp->dpp_stret[0] = sym.st_value; @@ -297,6 +306,27 @@ pp->dpp_stret[3] = sym.st_value; else pp->dpp_stret[3] = 0; +#else + if (proc_name2sym(pp->dpp_pr, obj, ".stret1", &sym) == 0) + pp->dpp_stret[0] = sym.st_value; + else + pp->dpp_stret[0] = 0; + + if (proc_name2sym(pp->dpp_pr, obj, ".stret2", &sym) == 0) + pp->dpp_stret[1] = sym.st_value; + else + pp->dpp_stret[1] = 0; + + if (proc_name2sym(pp->dpp_pr, obj, ".stret4", &sym) == 0) + pp->dpp_stret[2] = sym.st_value; + else + pp->dpp_stret[2] = 0; + + if (proc_name2sym(pp->dpp_pr, obj, ".stret8", &sym) == 0) + pp->dpp_stret[3] = sym.st_value; + else + pp->dpp_stret[3] = 0; +#endif dt_dprintf("%s stret %llx %llx %llx %llx\n", obj, (u_longlong_t)pp->dpp_stret[0], (u_longlong_t)pp->dpp_stret[1], @@ -317,16 +347,24 @@ * just fail silently in the hopes that some other object will * contain the desired symbol. */ +#if defined(sun) if (Pxlookup_by_name(pp->dpp_pr, pp->dpp_lmid, obj, pp->dpp_func, &sym, NULL) != 0) { +#else + if (proc_name2sym(pp->dpp_pr, obj, pp->dpp_func, &sym) != 0) { +#endif if (strcmp("-", pp->dpp_func) == 0) { sym.st_name = 0; sym.st_info = GELF_ST_INFO(STB_LOCAL, STT_FUNC); sym.st_other = 0; sym.st_value = 0; +#if defined(sun) sym.st_size = Pstatus(pp->dpp_pr)->pr_dmodel == PR_MODEL_ILP32 ? -1U : -1ULL; +#else + sym.st_size = ~((Elf64_Xword) 0); +#endif } else if (!strisglob(pp->dpp_mod)) { return (dt_pid_error(dtp, pcb, dpr, NULL, @@ -349,14 +387,21 @@ * We don't instrument PLTs -- they're dynamically rewritten, * and, so, inherently dicey to instrument. */ +#ifdef DOODAD if (Ppltdest(pp->dpp_pr, sym.st_value) != NULL) return (0); +#endif +#if defined(sun) (void) Plookup_by_addr(pp->dpp_pr, sym.st_value, pp->dpp_func, +#else + (void) proc_addr2sym(pp->dpp_pr, sym.st_value, pp->dpp_func, +#endif DTRACE_FUNCNAMELEN, &sym); return (dt_pid_per_sym(pp, &sym, pp->dpp_func)); } else { +#ifdef DOODAD uint_t nmatches = pp->dpp_nmatches; if (Psymbol_iter_by_addr(pp->dpp_pr, obj, PR_SYMTAB, @@ -372,13 +417,12 @@ BIND_ANY | TYPE_FUNC, dt_pid_sym_filt, pp) == 1) return (1); } +#endif } return (0); } -#endif -#ifdef DOODAD static int dt_pid_mod_filt(void *arg, const prmap_t *pmp, const char *obj) { @@ -388,7 +432,11 @@ if (gmatch(obj, pp->dpp_mod)) return (dt_pid_per_mod(pp, pmp, obj)); +#if defined(sun) (void) Plmid(pp->dpp_pr, pmp->pr_vaddr, &pp->dpp_lmid); +#else + pp->dpp_lmid = 0; +#endif if ((pp->dpp_obj = strrchr(obj, '/')) == NULL) pp->dpp_obj = obj; @@ -402,17 +450,18 @@ return (0); } -#endif -#ifdef DOODAD static const prmap_t * dt_pid_fix_mod(dtrace_probedesc_t *pdp, struct ps_prochandle *P) { +#ifdef DOODAD char m[MAXPATHLEN]; Lmid_t lmid = PR_LMID_EVERY; const char *obj; +#endif const prmap_t *pmp; +#ifdef DOODAD /* * Pick apart the link map from the library name. */ @@ -444,19 +493,20 @@ obj++; (void) Plmid(P, pmp->pr_vaddr, &lmid); + dt_pid_objname(pdp->dtpd_mod, sizeof (pdp->dtpd_mod), lmid, obj); +#else +pmp = NULL; +#endif return (pmp); } -#endif static int dt_pid_create_pid_probes(dtrace_probedesc_t *pdp, dtrace_hdl_t *dtp, dt_pcb_t *pcb, dt_proc_t *dpr) { -printf("%s:%s(%d): DOODAD\n",__FUNCTION__,__FILE__,__LINE__); -#ifdef DOODAD dt_pid_probe_t pp; int ret = 0; @@ -465,6 +515,7 @@ pp.dpp_pr = dpr->dpr_proc; pp.dpp_pcb = pcb; +#ifdef DOODAD /* * We can only trace dynamically-linked executables (since we've * hidden some magic in ld.so.1 as well as libc.so.1). @@ -474,6 +525,7 @@ "process %s is not a dynamically-linked executable", &pdp->dtpd_provider[3])); } +#endif pp.dpp_mod = pdp->dtpd_mod[0] != '\0' ? pdp->dtpd_mod : "*"; pp.dpp_func = pdp->dtpd_func[0] != '\0' ? pdp->dtpd_func : "*"; @@ -487,8 +539,13 @@ pp.dpp_mod = pdp->dtpd_mod; (void) strcpy(pdp->dtpd_mod, "a.out"); } else if (strisglob(pp.dpp_mod) || +#if defined(sun) (aout = Pname_to_map(pp.dpp_pr, "a.out")) == NULL || (pmp = Pname_to_map(pp.dpp_pr, pp.dpp_mod)) == NULL || +#else + (aout = proc_name2map(pp.dpp_pr, "a.out")) == NULL || + (pmp = proc_name2map(pp.dpp_pr, pp.dpp_mod)) == NULL || +#endif aout->pr_vaddr != pmp->pr_vaddr) { return (dt_pid_error(dtp, pcb, dpr, NULL, D_PROC_LIB, "only the a.out module is valid with the " @@ -507,6 +564,7 @@ * to iterate over each module and compare its name against the * pattern. An empty module name is treated as '*'. */ +#ifdef DOODAD if (strisglob(pp.dpp_mod)) { ret = Pobject_iter(pp.dpp_pr, dt_pid_mod_filt, &pp); } else { @@ -527,20 +585,19 @@ ret = dt_pid_per_mod(&pp, pmp, obj); } } +#endif return (ret); -#else -return 0; -#endif } -#ifdef DOODAD static int dt_pid_usdt_mapping(void *data, const prmap_t *pmp, const char *oname) { struct ps_prochandle *P = data; GElf_Sym sym; +#if defined(sun) prsyminfo_t sip; +#endif dof_helper_t dh; GElf_Half e_type; const char *mname; @@ -554,8 +611,12 @@ * run the code to instantiate these providers. */ for (i = 0; i < 2; i++) { +#if defined(sun) if (Pxlookup_by_name(P, PR_LMID_EVERY, oname, syms[i], &sym, &sip) != 0) { +#else + if (proc_name2sym(P, oname, syms[i], &sym) != 0) { +#endif continue; } @@ -566,18 +627,25 @@ dt_dprintf("lookup of %s succeeded for %s\n", syms[i], mname); +#ifdef DOODAD if (Pread(P, &e_type, sizeof (e_type), pmp->pr_vaddr + offsetof(Elf64_Ehdr, e_type)) != sizeof (e_type)) { dt_dprintf("read of ELF header failed"); continue; } +#endif dh.dofhp_dof = sym.st_value; dh.dofhp_addr = (e_type == ET_EXEC) ? 0 : pmp->pr_vaddr; dt_pid_objname(dh.dofhp_mod, sizeof (dh.dofhp_mod), +#if defined(sun) sip.prs_lmid, mname); +#else + 0, mname); +#endif +#ifdef DOODAD if (fd == -1 && (fd = pr_open(P, "/dev/dtrace/helper", O_RDWR, 0)) < 0) { dt_dprintf("pr_open of helper device failed: %s\n", @@ -587,33 +655,39 @@ if (pr_ioctl(P, fd, DTRACEHIOC_ADDDOF, &dh, sizeof (dh)) < 0) dt_dprintf("DOF was rejected for %s\n", dh.dofhp_mod); +#endif } +#ifdef DOODAD if (fd != -1) (void) pr_close(P, fd); +#endif return (0); } -#endif static int dt_pid_create_usdt_probes(dtrace_probedesc_t *pdp, dtrace_hdl_t *dtp, dt_pcb_t *pcb, dt_proc_t *dpr) { -printf("%s:%s(%d): DOODAD\n",__FUNCTION__,__FILE__,__LINE__); -#ifdef DOODAD struct ps_prochandle *P = dpr->dpr_proc; int ret = 0; assert(DT_MUTEX_HELD(&dpr->dpr_lock)); +#ifdef DOODAD (void) Pupdate_maps(P); if (Pobject_iter(P, dt_pid_usdt_mapping, P) != 0) { ret = -1; (void) dt_pid_error(dtp, pcb, dpr, NULL, D_PROC_USDT, "failed to instantiate probes for pid %d: %s", +#if defined(sun) (int)Pstatus(P)->pr_pid, strerror(errno)); +#else + (int)proc_getpid(P), strerror(errno)); +#endif } +#endif /* * Put the module name in its canonical form. @@ -621,9 +695,6 @@ (void) dt_pid_fix_mod(pdp, P); return (ret); -#else -return 0; -#endif } static pid_t @@ -639,10 +710,8 @@ } if (last == NULL || (*(++last) == '\0')) { -#ifdef DOODAD (void) dt_pid_error(dtp, pcb, dpr, NULL, D_PROC_BADPROV, "'%s' is not a valid provider", pdp->dtpd_provider); -#endif return (-1); } @@ -650,10 +719,8 @@ pid = strtol(last, &end, 10); if (errno != 0 || end == last || end[0] != '\0' || pid <= 0) { -#ifdef DOODAD (void) dt_pid_error(dtp, pcb, dpr, NULL, D_PROC_BADPID, "'%s' does not contain a valid pid", pdp->dtpd_provider); -#endif return (-1); } @@ -663,8 +730,6 @@ int dt_pid_create_probes(dtrace_probedesc_t *pdp, dtrace_hdl_t *dtp, dt_pcb_t *pcb) { -printf("%s:%s(%d): DOODAD\n",__FUNCTION__,__FILE__,__LINE__); -#ifdef DOODAD char provname[DTRACE_PROVNAMELEN]; struct ps_prochandle *P; dt_proc_t *dpr; @@ -729,9 +794,6 @@ } return (err ? -1 : 0); -#else -return 0; -#endif } int ==== //depot/projects/dtrace/src/contrib/opensolaris/lib/libdtrace/common/dt_subr.c#18 (text) ==== @@ -948,8 +948,6 @@ dtrace_uaddr2str(dtrace_hdl_t *dtp, pid_t pid, uint64_t addr, char *str, int nbytes) { -printf("%s:%s(%d): DOODAD\n",__FUNCTION__,__FILE__,__LINE__); -#ifdef DOODAD char name[PATH_MAX], objname[PATH_MAX], c[PATH_MAX * 2]; struct ps_prochandle *P = NULL; GElf_Sym sym; @@ -965,8 +963,13 @@ dt_proc_lock(dtp, P); +#if defined(sun) if (Plookup_by_addr(P, addr, name, sizeof (name), &sym) == 0) { (void) Pobjname(P, addr, objname, sizeof (objname)); +#else + if (proc_addr2sym(P, addr, name, sizeof (name), &sym) == 0) { + (void) proc_objname(P, addr, objname, sizeof (objname)); +#endif obj = dt_basename(objname); @@ -976,7 +979,11 @@ } else { (void) snprintf(c, sizeof (c), "%s`%s", obj, name); } +#if defined(sun) } else if (Pobjname(P, addr, objname, sizeof (objname)) != 0) { +#else + } else if (proc_objname(P, addr, objname, sizeof (objname)) != 0) { +#endif (void) snprintf(c, sizeof (c), "%s`0x%llx", dt_basename(objname), addr); } else { @@ -987,7 +994,4 @@ dt_proc_release(dtp, P); return (dt_string2str(c, str, nbytes)); -#else -return 0; -#endif }