17c478bd9Sstevel@tonic-gate /* 27c478bd9Sstevel@tonic-gate * CDDL HEADER START 37c478bd9Sstevel@tonic-gate * 47c478bd9Sstevel@tonic-gate * The contents of this file are subject to the terms of the 55aefb655Srie * Common Development and Distribution License (the "License"). 65aefb655Srie * You may not use this file except in compliance with the License. 77c478bd9Sstevel@tonic-gate * 87c478bd9Sstevel@tonic-gate * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 97c478bd9Sstevel@tonic-gate * or http://www.opensolaris.org/os/licensing. 107c478bd9Sstevel@tonic-gate * See the License for the specific language governing permissions 117c478bd9Sstevel@tonic-gate * and limitations under the License. 127c478bd9Sstevel@tonic-gate * 137c478bd9Sstevel@tonic-gate * When distributing Covered Code, include this CDDL HEADER in each 147c478bd9Sstevel@tonic-gate * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 157c478bd9Sstevel@tonic-gate * If applicable, add the following below this CDDL HEADER, with the 167c478bd9Sstevel@tonic-gate * fields enclosed by brackets "[]" replaced with your own identifying 177c478bd9Sstevel@tonic-gate * information: Portions Copyright [yyyy] [name of copyright owner] 187c478bd9Sstevel@tonic-gate * 197c478bd9Sstevel@tonic-gate * CDDL HEADER END 207c478bd9Sstevel@tonic-gate */ 215aefb655Srie 227c478bd9Sstevel@tonic-gate /* 232020b2b6SRod Evans * Copyright (c) 2001, 2010, Oracle and/or its affiliates. All rights reserved. 247c478bd9Sstevel@tonic-gate */ 257c478bd9Sstevel@tonic-gate 267c478bd9Sstevel@tonic-gate #include <msg.h> 277c478bd9Sstevel@tonic-gate #include <_rtld.h> 287c478bd9Sstevel@tonic-gate #include <conv.h> 297c478bd9Sstevel@tonic-gate #include <sys/mdb_modapi.h> 307c478bd9Sstevel@tonic-gate #include <sys/param.h> 317c478bd9Sstevel@tonic-gate #include <stdlib.h> 327c478bd9Sstevel@tonic-gate 337c478bd9Sstevel@tonic-gate /* 347c478bd9Sstevel@tonic-gate * Data structure for walkers. 357c478bd9Sstevel@tonic-gate */ 367c478bd9Sstevel@tonic-gate typedef struct { 377c478bd9Sstevel@tonic-gate uint_t w_flags; 387c478bd9Sstevel@tonic-gate } W_desc; 397c478bd9Sstevel@tonic-gate 407c478bd9Sstevel@tonic-gate /* 417c478bd9Sstevel@tonic-gate * Flags values for dcmds 427c478bd9Sstevel@tonic-gate */ 437c478bd9Sstevel@tonic-gate 447c478bd9Sstevel@tonic-gate #define RTLD_FLG_VERBOSE 0x0001 /* verbose output */ 457c478bd9Sstevel@tonic-gate 467c478bd9Sstevel@tonic-gate static const mdb_bitmask_t rtflags_bits[] = { 477c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_FLG_ISMAIN), FLG_RT_ISMAIN, FLG_RT_ISMAIN}, 487c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_FLG_IMGALLOC), FLG_RT_IMGALLOC, FLG_RT_IMGALLOC}, 497c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_FLG_RELOCED), FLG_RT_RELOCED, FLG_RT_RELOCED}, 507c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_FLG_SETGROUP), FLG_RT_SETGROUP, FLG_RT_SETGROUP}, 5108278a5eSRod Evans { MSG_ORIG(MSG_FLG_CAP), FLG_RT_CAP, FLG_RT_CAP}, 527c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_FLG_OBJECT), FLG_RT_OBJECT, FLG_RT_OBJECT}, 53dde769a2SRod Evans { MSG_ORIG(MSG_FLG_NEWLOAD), FLG_RT_NEWLOAD, FLG_RT_NEWLOAD}, 547c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_FLG_NODUMP), FLG_RT_NODUMP, FLG_RT_NODUMP}, 557c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_FLG_DELETE), FLG_RT_DELETE, FLG_RT_DELETE}, 567c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_FLG_ANALYZED), FLG_RT_ANALYZED, FLG_RT_ANALYZED}, 577c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_FLG_INITDONE), FLG_RT_INITDONE, FLG_RT_INITDONE}, 587c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_FLG_TRANS), FLG_RT_TRANS, FLG_RT_TRANS}, 597c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_FLG_FIXED), FLG_RT_FIXED, FLG_RT_FIXED}, 607c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_FLG_PRELOAD), FLG_RT_PRELOAD, FLG_RT_PRELOAD}, 617c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_FLG_ALTER), FLG_RT_ALTER, FLG_RT_ALTER}, 627c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_FLG_LOADFLTR), FLG_RT_LOADFLTR, FLG_RT_LOADFLTR}, 637c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_FLG_AUDIT), FLG_RT_AUDIT, FLG_RT_AUDIT}, 647c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_FLG_MODESET), FLG_RT_MODESET, FLG_RT_MODESET}, 657c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_FLG_ANALZING), FLG_RT_ANALZING, FLG_RT_ANALZING}, 667c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_FLG_INITFRST), FLG_RT_INITFRST, FLG_RT_INITFRST}, 677c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_FLG_NOOPEN), FLG_RT_NOOPEN, FLG_RT_NOOPEN}, 687c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_FLG_FINICLCT), FLG_RT_FINICLCT, FLG_RT_FINICLCT}, 697c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_FLG_INITCALL), FLG_RT_INITCALL, FLG_RT_INITCALL}, 709a411307Srie { MSG_ORIG(MSG_FLG_OBJINTPO), FLG_RT_OBJINTPO, FLG_RT_OBJINTPO}, 719a411307Srie { MSG_ORIG(MSG_FLG_SYMINTPO), FLG_RT_SYMINTPO, FLG_RT_SYMINTPO}, 727c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_FLG_MOVE), FLG_RT_MOVE, FLG_RT_MOVE}, 732017c965SRod Evans { MSG_ORIG(MSG_FLG_RELOCING), FLG_RT_RELOCING, FLG_RT_RELOCING}, 747c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_FLG_REGSYMS), FLG_RT_REGSYMS, FLG_RT_REGSYMS}, 757c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_FLG_INITCLCT), FLG_RT_INITCLCT, FLG_RT_INITCLCT}, 762017c965SRod Evans { MSG_ORIG(MSG_FLG_PUBHDL), FLG_RT_PUBHDL, FLG_RT_PUBHDL}, 772017c965SRod Evans { MSG_ORIG(MSG_FLG_PRIHDL), FLG_RT_PRIHDL, FLG_RT_PRIHDL}, 787c478bd9Sstevel@tonic-gate { NULL, 0, 0} 797c478bd9Sstevel@tonic-gate }; 807c478bd9Sstevel@tonic-gate 817c478bd9Sstevel@tonic-gate static const mdb_bitmask_t rtflags1_bits[] = { 827c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_FL1_COPYTOOK), FL1_RT_COPYTOOK, FL1_RT_COPYTOOK}, 8308278a5eSRod Evans { MSG_ORIG(MSG_FL1_ALTCHECK), FL1_RT_ALTCHECK, FL1_RT_ALTCHECK}, 8408278a5eSRod Evans { MSG_ORIG(MSG_FL1_ALTCAP), FL1_RT_ALTCAP, FL1_RT_ALTCAP}, 857c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_FL1_CONFSET), FL1_RT_CONFSET, FL1_RT_CONFSET }, 867c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_FL1_NODEFLIB), FL1_RT_NODEFLIB, FL1_RT_NODEFLIB }, 877c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_FL1_ENDFILTE), FL1_RT_ENDFILTE, FL1_RT_ENDFILTE }, 887c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_FL1_DISPREL), FL1_RT_DISPREL, FL1_RT_DISPREL }, 8956deab07SRod Evans { MSG_ORIG(MSG_FL1_DTFLAGS), FL1_RT_DTFLAGS, FL1_RT_DTFLAGS}, 907c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_FL1_LDDSTUB), FL1_RT_LDDSTUB, FL1_RT_LDDSTUB}, 917c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_FL1_NOINIFIN), FL1_RT_NOINIFIN, FL1_RT_NOINIFIN }, 927c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_FL1_USED), FL1_RT_USED, FL1_RT_USED }, 937c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_FL1_SYMBOLIC), FL1_RT_SYMBOLIC, FL1_RT_SYMBOLIC }, 947c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_FL1_OBJSFLTR), FL1_RT_OBJSFLTR, FL1_RT_OBJSFLTR }, 957c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_FL1_OBJAFLTR), FL1_RT_OBJAFLTR, FL1_RT_OBJAFLTR }, 967c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_FL1_SYMSFLTR), FL1_RT_SYMSFLTR, FL1_RT_SYMSFLTR }, 977c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_FL1_SYMAFLTR), FL1_RT_SYMAFLTR, FL1_RT_SYMAFLTR }, 989a411307Srie { MSG_ORIG(MSG_FL1_TLSADD), FL1_RT_TLSADD, FL1_RT_TLSADD }, 999a411307Srie { MSG_ORIG(MSG_FL1_TLSSTAT), FL1_RT_TLSSTAT, FL1_RT_TLSSTAT }, 1009a411307Srie { MSG_ORIG(MSG_FL1_DIRECT), FL1_RT_DIRECT, FL1_RT_DIRECT}, 1017247f888Srie { MSG_ORIG(MSG_FL1_GLOBAUD), FL1_RT_GLOBAUD, FL1_RT_GLOBAUD}, 102*b533f56bSRobert Mustacchi { MSG_ORIG(MSG_FL1_DEPAUD), FL1_RT_DEPAUD, FL1_RT_DEPAUD}, 10356deab07SRod Evans { NULL, 0, 0} 10456deab07SRod Evans }; 1057c478bd9Sstevel@tonic-gate 10656deab07SRod Evans static const mdb_bitmask_t rtaflags_bits[] = { 1077c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_LTFL_AUD_PREINIT), LML_TFLG_AUD_PREINIT, 1087c478bd9Sstevel@tonic-gate LML_TFLG_AUD_PREINIT }, 1097c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_LTFL_AUD_OBJSEARCH), LML_TFLG_AUD_OBJSEARCH, 1107c478bd9Sstevel@tonic-gate LML_TFLG_AUD_OBJSEARCH }, 1117c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_LTFL_AUD_OBJOPEN), LML_TFLG_AUD_OBJOPEN, 1127c478bd9Sstevel@tonic-gate LML_TFLG_AUD_OBJOPEN }, 1137c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_LTFL_AUD_OBJFILTER), LML_TFLG_AUD_OBJFILTER, 1147c478bd9Sstevel@tonic-gate LML_TFLG_AUD_OBJFILTER }, 1157c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_LTFL_AUD_OBJCLOSE), LML_TFLG_AUD_OBJCLOSE, 1167c478bd9Sstevel@tonic-gate LML_TFLG_AUD_OBJCLOSE }, 1177c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_LTFL_AUD_SYMBIND), LML_TFLG_AUD_SYMBIND, 1187c478bd9Sstevel@tonic-gate LML_TFLG_AUD_SYMBIND }, 1197c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_LTFL_AUD_PLTENTER), LML_TFLG_AUD_PLTENTER, 1207c478bd9Sstevel@tonic-gate LML_TFLG_AUD_PLTENTER }, 1217c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_LTFL_AUD_PLTEXIT), LML_TFLG_AUD_PLTEXIT, 1227c478bd9Sstevel@tonic-gate LML_TFLG_AUD_PLTEXIT }, 1237c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_LTFL_AUD_ACTIVITY), LML_TFLG_AUD_ACTIVITY, 1247c478bd9Sstevel@tonic-gate LML_TFLG_AUD_ACTIVITY }, 1257c478bd9Sstevel@tonic-gate { NULL, 0, 0} 1267c478bd9Sstevel@tonic-gate }; 1277c478bd9Sstevel@tonic-gate 1287c478bd9Sstevel@tonic-gate static const mdb_bitmask_t rtmode_bits[] = { 1297c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_MODE_LAZY), RTLD_LAZY, RTLD_LAZY }, 1307c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_MODE_NOW), RTLD_NOW, RTLD_NOW }, 1317c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_MODE_NOLOAD), RTLD_NOLOAD, RTLD_NOLOAD }, 1327c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_MODE_GLOBAL), RTLD_GLOBAL, RTLD_GLOBAL }, 1337c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_MODE_PARENT), RTLD_PARENT, RTLD_PARENT }, 1347c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_MODE_GROUP), RTLD_GROUP, RTLD_GROUP }, 1357c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_MODE_WORLD), RTLD_WORLD, RTLD_WORLD }, 1367c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_MODE_NODELETE), RTLD_NODELETE, RTLD_NODELETE }, 1377c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_MODE_FIRST), RTLD_FIRST, RTLD_FIRST }, 1387c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_MODE_CONFGEN), RTLD_CONFGEN, RTLD_CONFGEN }, 1397c478bd9Sstevel@tonic-gate { NULL, 0, 0} 1407c478bd9Sstevel@tonic-gate }; 1417c478bd9Sstevel@tonic-gate 1427c478bd9Sstevel@tonic-gate static const mdb_bitmask_t bndflags_bits[] = { 1437c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_BFL_NEEDED), BND_NEEDED, BND_NEEDED }, 1447c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_BFL_REFER), BND_REFER, BND_REFER }, 145dffec89cSrie { MSG_ORIG(MSG_BFL_FILTER), BND_FILTER, BND_FILTER }, 1467c478bd9Sstevel@tonic-gate { NULL, 0, 0} 1477c478bd9Sstevel@tonic-gate }; 1487c478bd9Sstevel@tonic-gate 1497c478bd9Sstevel@tonic-gate static const mdb_bitmask_t grhflags_bits[] = { 1502017c965SRod Evans { MSG_ORIG(MSG_GPH_PUBLIC), GPH_PUBLIC, GPH_PUBLIC }, 1512017c965SRod Evans { MSG_ORIG(MSG_GPH_PRIVATE), GPH_PRIVATE, GPH_PRIVATE }, 1527c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_GPH_ZERO), GPH_ZERO, GPH_ZERO }, 1537c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_GPH_LDSO), GPH_LDSO, GPH_LDSO }, 1547c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_GPH_FIRST), GPH_FIRST, GPH_FIRST }, 1557c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_GPH_FILTEE), GPH_FILTEE, GPH_FILTEE }, 1567c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_GPH_INITIAL), GPH_INITIAL, GPH_INITIAL }, 1577c478bd9Sstevel@tonic-gate { NULL, 0, 0} 1587c478bd9Sstevel@tonic-gate }; 1597c478bd9Sstevel@tonic-gate 1607c478bd9Sstevel@tonic-gate static const mdb_bitmask_t grdflags_bits[] = { 161efb9e8b8Srie { MSG_ORIG(MSG_GPD_DLSYM), GPD_DLSYM, GPD_DLSYM }, 162efb9e8b8Srie { MSG_ORIG(MSG_GPD_RELOC), GPD_RELOC, GPD_RELOC }, 1637c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_GPD_ADDEPS), GPD_ADDEPS, GPD_ADDEPS }, 1647c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_GPD_PARENT), GPD_PARENT, GPD_PARENT }, 1657c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_GPD_FILTER), GPD_FILTER, GPD_FILTER }, 1667c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_GPD_REMOVE), GPD_REMOVE, GPD_REMOVE }, 1677c478bd9Sstevel@tonic-gate { NULL, 0, 0} 1687c478bd9Sstevel@tonic-gate }; 1697c478bd9Sstevel@tonic-gate 1707c478bd9Sstevel@tonic-gate static const mdb_bitmask_t lmc_bits[] = { 1717c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_LMC_ANALYZING), LMC_FLG_ANALYZING, LMC_FLG_ANALYZING}, 1727c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_LMC_RELOCATING), LMC_FLG_RELOCATING, LMC_FLG_RELOCATING}, 1737c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_LMC_REANALYZE), LMC_FLG_REANALYZE, LMC_FLG_REANALYZE}, 1747c478bd9Sstevel@tonic-gate { NULL, 0, 0} 1757c478bd9Sstevel@tonic-gate }; 1767c478bd9Sstevel@tonic-gate 1777c478bd9Sstevel@tonic-gate /* 1787c478bd9Sstevel@tonic-gate * Obtain a string - typically a link-map name. 1797c478bd9Sstevel@tonic-gate */ 1807c478bd9Sstevel@tonic-gate static char * 1817c478bd9Sstevel@tonic-gate String(uintptr_t addr, const char *name) 1827c478bd9Sstevel@tonic-gate { 1837c478bd9Sstevel@tonic-gate static char str[MAXPATHLEN]; 1847c478bd9Sstevel@tonic-gate 1857c478bd9Sstevel@tonic-gate if (addr) { 1867c478bd9Sstevel@tonic-gate if (mdb_readstr(str, MAXPATHLEN, addr) == -1) { 1877c478bd9Sstevel@tonic-gate mdb_warn(MSG_ORIG(MSG_ERR_READ), name, addr); 1887c478bd9Sstevel@tonic-gate return (0); 1897c478bd9Sstevel@tonic-gate } 1907c478bd9Sstevel@tonic-gate return (str); 1917c478bd9Sstevel@tonic-gate } 1927c478bd9Sstevel@tonic-gate return ((char *)MSG_ORIG(MSG_STR_EMPTY)); 1937c478bd9Sstevel@tonic-gate } 1947c478bd9Sstevel@tonic-gate 1957c478bd9Sstevel@tonic-gate /* 1967c478bd9Sstevel@tonic-gate * Obtain a link-map name. 1977c478bd9Sstevel@tonic-gate */ 1987c478bd9Sstevel@tonic-gate static char * 1997c478bd9Sstevel@tonic-gate Rtmap_Name(uintptr_t addr) 2007c478bd9Sstevel@tonic-gate { 2017c478bd9Sstevel@tonic-gate Rt_map rtmap; 2027c478bd9Sstevel@tonic-gate 2037c478bd9Sstevel@tonic-gate if (addr) { 2047c478bd9Sstevel@tonic-gate if (mdb_vread(&rtmap, sizeof (Rt_map), addr) == -1) { 2057c478bd9Sstevel@tonic-gate mdb_warn(MSG_ORIG(MSG_ERR_READ), 2067c478bd9Sstevel@tonic-gate MSG_ORIG(MSG_RTMAP_STR), addr); 2077c478bd9Sstevel@tonic-gate return (0); 2087c478bd9Sstevel@tonic-gate } 2097c478bd9Sstevel@tonic-gate return (String((uintptr_t)NAME(&rtmap), 2107c478bd9Sstevel@tonic-gate MSG_ORIG(MSG_STR_NAME))); 2117c478bd9Sstevel@tonic-gate } 2127c478bd9Sstevel@tonic-gate return ((char *)MSG_ORIG(MSG_STR_EMPTY)); 2137c478bd9Sstevel@tonic-gate } 2147c478bd9Sstevel@tonic-gate 2157c478bd9Sstevel@tonic-gate void 2167c478bd9Sstevel@tonic-gate dcmd_Bind_help(void) 2177c478bd9Sstevel@tonic-gate { 2187c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_BND_HELP)); 2197c478bd9Sstevel@tonic-gate } 2207c478bd9Sstevel@tonic-gate 2217c478bd9Sstevel@tonic-gate static int 2227c478bd9Sstevel@tonic-gate /* ARGSUSED2 */ 2237c478bd9Sstevel@tonic-gate dcmd_Bind(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) 2247c478bd9Sstevel@tonic-gate { 2257c478bd9Sstevel@tonic-gate Bnd_desc bnd; 2267c478bd9Sstevel@tonic-gate char *str; 2277c478bd9Sstevel@tonic-gate 2287c478bd9Sstevel@tonic-gate /* 2297c478bd9Sstevel@tonic-gate * Insure we have a valid address. 2307c478bd9Sstevel@tonic-gate */ 2317c478bd9Sstevel@tonic-gate if ((flags & DCMD_ADDRSPEC) == 0) { 2327c478bd9Sstevel@tonic-gate mdb_warn(MSG_ORIG(MSG_ERR_NAS), MSG_ORIG(MSG_BND_STR)); 2337c478bd9Sstevel@tonic-gate return (DCMD_USAGE); 2347c478bd9Sstevel@tonic-gate } 2357c478bd9Sstevel@tonic-gate 2367c478bd9Sstevel@tonic-gate /* 2377c478bd9Sstevel@tonic-gate * Obtain the binding descriptor. 2387c478bd9Sstevel@tonic-gate */ 2397c478bd9Sstevel@tonic-gate if (mdb_vread(&bnd, sizeof (Bnd_desc), addr) == -1) { 2407c478bd9Sstevel@tonic-gate mdb_warn(MSG_ORIG(MSG_ERR_READ), MSG_ORIG(MSG_BND_STR), addr); 2417c478bd9Sstevel@tonic-gate return (DCMD_ERR); 2427c478bd9Sstevel@tonic-gate } 2437c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_BND_TITLE), addr); 2447c478bd9Sstevel@tonic-gate 2457c478bd9Sstevel@tonic-gate /* 2467c478bd9Sstevel@tonic-gate * Establish the identity of the caller. 2477c478bd9Sstevel@tonic-gate */ 2487c478bd9Sstevel@tonic-gate if ((str = Rtmap_Name((uintptr_t)bnd.b_caller)) == 0) 2497c478bd9Sstevel@tonic-gate return (DCMD_ERR); 2507c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_BND_LINE1), bnd.b_caller, str); 2517c478bd9Sstevel@tonic-gate 2527c478bd9Sstevel@tonic-gate /* 2537c478bd9Sstevel@tonic-gate * Establish the identity of the dependency. 2547c478bd9Sstevel@tonic-gate */ 2557c478bd9Sstevel@tonic-gate if ((str = Rtmap_Name((uintptr_t)bnd.b_depend)) == 0) 2567c478bd9Sstevel@tonic-gate return (DCMD_ERR); 2577c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_BND_LINE2), bnd.b_depend, str); 2587c478bd9Sstevel@tonic-gate 2597c478bd9Sstevel@tonic-gate /* 2607c478bd9Sstevel@tonic-gate * Display any flags. 2617c478bd9Sstevel@tonic-gate */ 2627c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_BND_LINE3), bnd.b_flags, bnd.b_flags, 2637c478bd9Sstevel@tonic-gate bndflags_bits); 2647c478bd9Sstevel@tonic-gate 2657c478bd9Sstevel@tonic-gate return (DCMD_OK); 2667c478bd9Sstevel@tonic-gate } 2677c478bd9Sstevel@tonic-gate 2687c478bd9Sstevel@tonic-gate static void 2697c478bd9Sstevel@tonic-gate dcmd_Depends_help(void) 2707c478bd9Sstevel@tonic-gate { 2717c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_DEPENDS_HELP)); 2727c478bd9Sstevel@tonic-gate } 2737c478bd9Sstevel@tonic-gate 2747c478bd9Sstevel@tonic-gate static int 2757c478bd9Sstevel@tonic-gate Depends(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv, 2767c478bd9Sstevel@tonic-gate uint_t flg, const char *msg) 2777c478bd9Sstevel@tonic-gate { 278cce0e03bSab196087 APlist apl; 27957ef7aa9SRod Evans uintptr_t datap, nitems; 2807c478bd9Sstevel@tonic-gate Bnd_desc *bdp; 2817c478bd9Sstevel@tonic-gate 2827c478bd9Sstevel@tonic-gate /* 283cce0e03bSab196087 * Obtain the APlist and determine its number of elements and those 2847c478bd9Sstevel@tonic-gate * that are in use. 2857c478bd9Sstevel@tonic-gate */ 286cce0e03bSab196087 if (mdb_vread(&apl, sizeof (APlist), addr) == -1) { 287cce0e03bSab196087 mdb_warn(MSG_ORIG(MSG_ERR_READ), MSG_ORIG(MSG_STR_APLIST), 288cce0e03bSab196087 addr); 2897c478bd9Sstevel@tonic-gate return (DCMD_ERR); 2907c478bd9Sstevel@tonic-gate } 2917c478bd9Sstevel@tonic-gate 292cce0e03bSab196087 mdb_printf(msg, addr, (size_t)apl.apl_nitems, 293cce0e03bSab196087 (size_t)apl.apl_arritems); 2947c478bd9Sstevel@tonic-gate 295cce0e03bSab196087 if (((flg & RTLD_FLG_VERBOSE) == 0) || (apl.apl_nitems == 0)) 2967c478bd9Sstevel@tonic-gate return (DCMD_OK); 2977c478bd9Sstevel@tonic-gate 2987c478bd9Sstevel@tonic-gate /* 299cce0e03bSab196087 * Under verbose mode print the name of each dependency. An APlist can 3007c478bd9Sstevel@tonic-gate * have a variable number of data items, so read each individual entry. 3017c478bd9Sstevel@tonic-gate */ 30257ef7aa9SRod Evans datap = APLIST_OFF_DATA + (uintptr_t)addr; 30357ef7aa9SRod Evans if (mdb_vread(&bdp, sizeof (Bnd_desc *), datap) == -1) { 3047c478bd9Sstevel@tonic-gate mdb_warn(MSG_ORIG(MSG_ERR_READ), 30557ef7aa9SRod Evans MSG_ORIG(MSG_BNDDESC_STR), datap); 3067c478bd9Sstevel@tonic-gate return (DCMD_ERR); 3077c478bd9Sstevel@tonic-gate } 3087c478bd9Sstevel@tonic-gate 30980148899SSurya Prakki (void) mdb_inc_indent(4); 3107c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_STR_DASHES)); 3117c478bd9Sstevel@tonic-gate 3127c478bd9Sstevel@tonic-gate if (dcmd_Bind((uintptr_t)bdp, flags, argc, argv) == DCMD_ERR) { 31380148899SSurya Prakki (void) mdb_dec_indent(4); 3147c478bd9Sstevel@tonic-gate return (DCMD_ERR); 3157c478bd9Sstevel@tonic-gate } 3167c478bd9Sstevel@tonic-gate 31757ef7aa9SRod Evans for (nitems = 1; nitems < apl.apl_nitems; nitems++) { 31857ef7aa9SRod Evans datap += sizeof (void *); 31957ef7aa9SRod Evans if (mdb_vread(&bdp, sizeof (Bnd_desc *), datap) == -1) { 3207c478bd9Sstevel@tonic-gate mdb_warn(MSG_ORIG(MSG_ERR_READ), 32157ef7aa9SRod Evans MSG_ORIG(MSG_BNDDESC_STR), datap); 3227c478bd9Sstevel@tonic-gate return (DCMD_ERR); 3237c478bd9Sstevel@tonic-gate } 3247c478bd9Sstevel@tonic-gate 3257c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_STR_DASHES)); 3267c478bd9Sstevel@tonic-gate if (dcmd_Bind((uintptr_t)bdp, flags, argc, argv) == DCMD_ERR) { 32780148899SSurya Prakki (void) mdb_dec_indent(4); 3287c478bd9Sstevel@tonic-gate return (DCMD_ERR); 3297c478bd9Sstevel@tonic-gate } 3307c478bd9Sstevel@tonic-gate } 33180148899SSurya Prakki (void) mdb_dec_indent(4); 3327c478bd9Sstevel@tonic-gate return (DCMD_OK); 3337c478bd9Sstevel@tonic-gate } 3347c478bd9Sstevel@tonic-gate 3357c478bd9Sstevel@tonic-gate static int 3367c478bd9Sstevel@tonic-gate dcmd_Depends(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) 3377c478bd9Sstevel@tonic-gate { 3387c478bd9Sstevel@tonic-gate Rt_map rtmap; 3397c478bd9Sstevel@tonic-gate char *str; 3407c478bd9Sstevel@tonic-gate uint_t flg = 0; 3417c478bd9Sstevel@tonic-gate 3427c478bd9Sstevel@tonic-gate /* 3437c478bd9Sstevel@tonic-gate * Insure we have a valid address, and provide for a -v option. 3447c478bd9Sstevel@tonic-gate */ 3457c478bd9Sstevel@tonic-gate if ((flags & DCMD_ADDRSPEC) == 0) { 3467c478bd9Sstevel@tonic-gate mdb_warn(MSG_ORIG(MSG_ERR_NAS), MSG_ORIG(MSG_DEPENDS_STR)); 3477c478bd9Sstevel@tonic-gate return (DCMD_USAGE); 3487c478bd9Sstevel@tonic-gate } 3497c478bd9Sstevel@tonic-gate if (mdb_getopts(argc, argv, 'v', MDB_OPT_SETBITS, RTLD_FLG_VERBOSE, 3507c478bd9Sstevel@tonic-gate &flg, NULL) != argc) 3517c478bd9Sstevel@tonic-gate return (DCMD_USAGE); 3527c478bd9Sstevel@tonic-gate 3537c478bd9Sstevel@tonic-gate /* 3547c478bd9Sstevel@tonic-gate * Read the Rt_map contents. 3557c478bd9Sstevel@tonic-gate */ 3567c478bd9Sstevel@tonic-gate if (mdb_vread(&rtmap, sizeof (Rt_map), addr) == -1) { 3577c478bd9Sstevel@tonic-gate mdb_warn(MSG_ORIG(MSG_ERR_READ), MSG_ORIG(MSG_RTMAP_STR), addr); 3587c478bd9Sstevel@tonic-gate return (DCMD_ERR); 3597c478bd9Sstevel@tonic-gate } 3607c478bd9Sstevel@tonic-gate if ((str = String((uintptr_t)NAME(&rtmap), 3617c478bd9Sstevel@tonic-gate MSG_ORIG(MSG_STR_NAME))) == 0) 3627c478bd9Sstevel@tonic-gate return (DCMD_ERR); 3637c478bd9Sstevel@tonic-gate 3647c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_DEPENDS_LINE1), str); 3657c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_STR_DASHES)); 3667c478bd9Sstevel@tonic-gate 367cce0e03bSab196087 if (DEPENDS(&rtmap) == NULL) 3687c478bd9Sstevel@tonic-gate return (DCMD_OK); 3697c478bd9Sstevel@tonic-gate 3707c478bd9Sstevel@tonic-gate return (Depends((uintptr_t)DEPENDS(&rtmap), flags, argc, argv, flg, 3717c478bd9Sstevel@tonic-gate MSG_ORIG(MSG_DEPENDS_LINE2))); 3727c478bd9Sstevel@tonic-gate } 3737c478bd9Sstevel@tonic-gate 3747c478bd9Sstevel@tonic-gate static void 3757c478bd9Sstevel@tonic-gate dcmd_Callers_help(void) 3767c478bd9Sstevel@tonic-gate { 3777c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_CALLERS_HELP)); 3787c478bd9Sstevel@tonic-gate } 3797c478bd9Sstevel@tonic-gate 3807c478bd9Sstevel@tonic-gate static int 3817c478bd9Sstevel@tonic-gate dcmd_Callers(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) 3827c478bd9Sstevel@tonic-gate { 3837c478bd9Sstevel@tonic-gate Rt_map rtmap; 3847c478bd9Sstevel@tonic-gate char *str; 3857c478bd9Sstevel@tonic-gate uint_t flg = 0; 3867c478bd9Sstevel@tonic-gate 3877c478bd9Sstevel@tonic-gate /* 3887c478bd9Sstevel@tonic-gate * Insure we have a valid address, and provide for a -v option. 3897c478bd9Sstevel@tonic-gate */ 3907c478bd9Sstevel@tonic-gate if ((flags & DCMD_ADDRSPEC) == 0) { 3917c478bd9Sstevel@tonic-gate mdb_warn(MSG_ORIG(MSG_ERR_NAS), MSG_ORIG(MSG_DEPENDS_STR)); 3927c478bd9Sstevel@tonic-gate return (DCMD_USAGE); 3937c478bd9Sstevel@tonic-gate } 3947c478bd9Sstevel@tonic-gate if (mdb_getopts(argc, argv, 'v', MDB_OPT_SETBITS, RTLD_FLG_VERBOSE, 3957c478bd9Sstevel@tonic-gate &flg, NULL) != argc) 3967c478bd9Sstevel@tonic-gate return (DCMD_USAGE); 3977c478bd9Sstevel@tonic-gate 3987c478bd9Sstevel@tonic-gate /* 3997c478bd9Sstevel@tonic-gate * Read the Rt_map contents. 4007c478bd9Sstevel@tonic-gate */ 4017c478bd9Sstevel@tonic-gate if (mdb_vread(&rtmap, sizeof (Rt_map), addr) == -1) { 4027c478bd9Sstevel@tonic-gate mdb_warn(MSG_ORIG(MSG_ERR_READ), MSG_ORIG(MSG_RTMAP_STR), addr); 4037c478bd9Sstevel@tonic-gate return (DCMD_ERR); 4047c478bd9Sstevel@tonic-gate } 4057c478bd9Sstevel@tonic-gate if ((str = String((uintptr_t)NAME(&rtmap), 4067c478bd9Sstevel@tonic-gate MSG_ORIG(MSG_STR_NAME))) == 0) 4077c478bd9Sstevel@tonic-gate return (DCMD_ERR); 4087c478bd9Sstevel@tonic-gate 4097c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_CALLERS_LINE1), str); 4107c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_STR_DASHES)); 4117c478bd9Sstevel@tonic-gate 412cce0e03bSab196087 if (CALLERS(&rtmap) == NULL) 4137c478bd9Sstevel@tonic-gate return (DCMD_OK); 4147c478bd9Sstevel@tonic-gate 4157c478bd9Sstevel@tonic-gate return (Depends((uintptr_t)CALLERS(&rtmap), flags, argc, argv, flg, 4167c478bd9Sstevel@tonic-gate MSG_ORIG(MSG_CALLERS_LINE2))); 4177c478bd9Sstevel@tonic-gate } 4187c478bd9Sstevel@tonic-gate 4197c478bd9Sstevel@tonic-gate void 4207c478bd9Sstevel@tonic-gate dcmd_rtmap_help(void) 4217c478bd9Sstevel@tonic-gate { 4227c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_RTMAP_HELP)); 4237c478bd9Sstevel@tonic-gate } 4247c478bd9Sstevel@tonic-gate 4257c478bd9Sstevel@tonic-gate static int 4267c478bd9Sstevel@tonic-gate /* ARGSUSED2 */ 4277c478bd9Sstevel@tonic-gate dcmd_rtmap(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) 4287c478bd9Sstevel@tonic-gate { 4297c478bd9Sstevel@tonic-gate Rt_map rtmap; 4307c478bd9Sstevel@tonic-gate char *str; 4317c478bd9Sstevel@tonic-gate 4327c478bd9Sstevel@tonic-gate if ((flags & DCMD_ADDRSPEC) == 0) { 4337c478bd9Sstevel@tonic-gate mdb_warn(MSG_ORIG(MSG_ERR_NAS), MSG_ORIG(MSG_RTMAP_STR)); 4347c478bd9Sstevel@tonic-gate return (DCMD_USAGE); 4357c478bd9Sstevel@tonic-gate } 4367c478bd9Sstevel@tonic-gate 4377c478bd9Sstevel@tonic-gate if (mdb_vread(&rtmap, sizeof (Rt_map), addr) == -1) { 4387c478bd9Sstevel@tonic-gate mdb_warn(MSG_ORIG(MSG_ERR_READ), MSG_ORIG(MSG_RTMAP_STR), addr); 4397c478bd9Sstevel@tonic-gate return (DCMD_ERR); 4407c478bd9Sstevel@tonic-gate } 4417c478bd9Sstevel@tonic-gate 4427c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_RTMAP_TITLE), addr); 4437c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_STR_DASHES)); 4447c478bd9Sstevel@tonic-gate 4457c478bd9Sstevel@tonic-gate /* 4467c478bd9Sstevel@tonic-gate * Determine the objects name. NAME() is the name by which the object 4477c478bd9Sstevel@tonic-gate * has been opened, typically from adding a search path to a file name. 4487c478bd9Sstevel@tonic-gate * PATHNAME() is the fully resolve name, which is displayed by the proc 4497c478bd9Sstevel@tonic-gate * tools and debuggers. If the two names differ, print the PATHNAME(). 4507c478bd9Sstevel@tonic-gate */ 4517c478bd9Sstevel@tonic-gate if ((str = String((uintptr_t)NAME(&rtmap), 4527c478bd9Sstevel@tonic-gate MSG_ORIG(MSG_STR_NAME))) == 0) 4537c478bd9Sstevel@tonic-gate return (DCMD_ERR); 4547c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_RTMAP_LINE1), str); 4557c478bd9Sstevel@tonic-gate if (NAME(&rtmap) != PATHNAME(&rtmap)) { 4567c478bd9Sstevel@tonic-gate if ((str = String((uintptr_t)PATHNAME(&rtmap), 4577c478bd9Sstevel@tonic-gate MSG_ORIG(MSG_STR_PATHNAME))) == 0) 4587c478bd9Sstevel@tonic-gate return (DCMD_ERR); 4597c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_RTMAP_LINE2), str); 4607c478bd9Sstevel@tonic-gate } 4617c478bd9Sstevel@tonic-gate 4627c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_RTMAP_LINE3), ADDR(&rtmap), DYN(&rtmap)); 4637c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_RTMAP_LINE4), NEXT(&rtmap), PREV(&rtmap)); 4647c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_RTMAP_LINE5), rtmap.rt_fct, TLSMODID(&rtmap)); 4657c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_RTMAP_LINE6), INIT(&rtmap), FINI(&rtmap)); 4667c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_RTMAP_LINE7), GROUPS(&rtmap), HANDLES(&rtmap)); 4677c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_RTMAP_LINE8), DEPENDS(&rtmap), CALLERS(&rtmap)); 4687c478bd9Sstevel@tonic-gate 4697c478bd9Sstevel@tonic-gate if ((str = String((uintptr_t)REFNAME(&rtmap), 4707c478bd9Sstevel@tonic-gate MSG_ORIG(MSG_STR_REFNAME))) == 0) 4717c478bd9Sstevel@tonic-gate return (DCMD_ERR); 4727c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_RTMAP_LINE9), DYNINFO(&rtmap), str); 4737c478bd9Sstevel@tonic-gate 4747c478bd9Sstevel@tonic-gate if ((str = String((uintptr_t)RPATH(&rtmap), 4757c478bd9Sstevel@tonic-gate MSG_ORIG(MSG_STR_RPATH))) == 0) 4767c478bd9Sstevel@tonic-gate return (DCMD_ERR); 4777c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_RTMAP_LINE10), RLIST(&rtmap), str); 4787c478bd9Sstevel@tonic-gate 4797c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_RTMAP_LINE11), LIST(&rtmap), LIST(&rtmap)); 4807c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_RTMAP_LINE12), FLAGS(&rtmap)); 4817c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_RTMAP_LINE20), FLAGS(&rtmap), rtflags_bits); 4827c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_RTMAP_LINE13), FLAGS1(&rtmap)); 4837c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_RTMAP_LINE20), FLAGS1(&rtmap), rtflags1_bits); 48456deab07SRod Evans if (AFLAGS(&rtmap)) { 48556deab07SRod Evans mdb_printf(MSG_ORIG(MSG_RTMAP_LINE14), AFLAGS(&rtmap)); 48656deab07SRod Evans mdb_printf(MSG_ORIG(MSG_RTMAP_LINE20), AFLAGS(&rtmap), 48756deab07SRod Evans rtaflags_bits); 48856deab07SRod Evans } 48956deab07SRod Evans mdb_printf(MSG_ORIG(MSG_RTMAP_LINE15), MODE(&rtmap)); 4907c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_RTMAP_LINE20), MODE(&rtmap), rtmode_bits); 4917c478bd9Sstevel@tonic-gate 4927c478bd9Sstevel@tonic-gate return (DCMD_OK); 4937c478bd9Sstevel@tonic-gate } 4947c478bd9Sstevel@tonic-gate 4957c478bd9Sstevel@tonic-gate static int 4967c478bd9Sstevel@tonic-gate rtmap_format(uintptr_t addr, const void *data, void *private) 4977c478bd9Sstevel@tonic-gate { 4987c478bd9Sstevel@tonic-gate const Rt_map *lmp = (const Rt_map *)data; 4997c478bd9Sstevel@tonic-gate W_desc *wdp = (W_desc *)private; 5007c478bd9Sstevel@tonic-gate char *str; 5017c478bd9Sstevel@tonic-gate 5027c478bd9Sstevel@tonic-gate if (wdp && (wdp->w_flags & RTLD_FLG_VERBOSE)) { 5037c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_STR_DASHES)); 50480148899SSurya Prakki (void) mdb_call_dcmd( 50580148899SSurya Prakki MSG_ORIG(MSG_RTMAP_STR), addr, DCMD_ADDRSPEC, NULL, NULL); 5067c478bd9Sstevel@tonic-gate return (0); 5077c478bd9Sstevel@tonic-gate } 5087c478bd9Sstevel@tonic-gate 5097c478bd9Sstevel@tonic-gate if ((str = String((uintptr_t)NAME(lmp), 5107c478bd9Sstevel@tonic-gate MSG_ORIG(MSG_STR_NAME))) == 0) 5117c478bd9Sstevel@tonic-gate return (DCMD_ERR); 5127c478bd9Sstevel@tonic-gate 5137c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_FMT_RT), CNTL(lmp), addr, ADDR(lmp), str); 5147c478bd9Sstevel@tonic-gate return (0); 5157c478bd9Sstevel@tonic-gate } 5167c478bd9Sstevel@tonic-gate 5177c478bd9Sstevel@tonic-gate void 5187c478bd9Sstevel@tonic-gate dcmd_Rtmaps_help(void) 5197c478bd9Sstevel@tonic-gate { 5207c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_RTMAPS_HELP)); 5217c478bd9Sstevel@tonic-gate } 5227c478bd9Sstevel@tonic-gate 5237c478bd9Sstevel@tonic-gate static int 5247c478bd9Sstevel@tonic-gate dcmd_Rtmaps(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) 5257c478bd9Sstevel@tonic-gate { 5267c478bd9Sstevel@tonic-gate uint_t flg = 0; 5277c478bd9Sstevel@tonic-gate GElf_Sym gsym; 52857ef7aa9SRod Evans APlist *aplp, apl; 52957ef7aa9SRod Evans uintptr_t datap, nitems; 5307c478bd9Sstevel@tonic-gate const char *str; 5317c478bd9Sstevel@tonic-gate W_desc wdesc; 5327c478bd9Sstevel@tonic-gate 5337c478bd9Sstevel@tonic-gate /* 5347c478bd9Sstevel@tonic-gate * '-v' - Verbose output of rtmap 5357c478bd9Sstevel@tonic-gate */ 5367c478bd9Sstevel@tonic-gate if (mdb_getopts(argc, argv, 'v', MDB_OPT_SETBITS, RTLD_FLG_VERBOSE, 5377c478bd9Sstevel@tonic-gate &flg, NULL) != argc) 5387c478bd9Sstevel@tonic-gate return (DCMD_USAGE); 5397c478bd9Sstevel@tonic-gate 5407c478bd9Sstevel@tonic-gate /* 5417c478bd9Sstevel@tonic-gate * If an address was provided use it. 5427c478bd9Sstevel@tonic-gate */ 5437c478bd9Sstevel@tonic-gate if (flags & DCMD_ADDRSPEC) { 5447c478bd9Sstevel@tonic-gate if (((flags & DCMD_LOOPFIRST) || !(flags & DCMD_LOOP)) && 5457c478bd9Sstevel@tonic-gate !(flg & RTLD_FLG_VERBOSE)) { 5467c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_RTMAPS_TITLE0)); 5477c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_STR_DASHES)); 5487c478bd9Sstevel@tonic-gate } 5497c478bd9Sstevel@tonic-gate 5507c478bd9Sstevel@tonic-gate wdesc.w_flags = flg; 5517c478bd9Sstevel@tonic-gate if (mdb_pwalk(MSG_ORIG(MSG_RTMAPS_STR), rtmap_format, 5527c478bd9Sstevel@tonic-gate (void *)&wdesc, addr) == -1) 5537c478bd9Sstevel@tonic-gate return (DCMD_ERR); 5547c478bd9Sstevel@tonic-gate return (DCMD_OK); 5557c478bd9Sstevel@tonic-gate } 5567c478bd9Sstevel@tonic-gate 5577c478bd9Sstevel@tonic-gate /* 5587c478bd9Sstevel@tonic-gate * Otherwise traverse the dynlm_list and display each link-map. 5597c478bd9Sstevel@tonic-gate */ 5607c478bd9Sstevel@tonic-gate if (mdb_lookup_by_obj(MSG_ORIG(MSG_STR_LDSO1), 5617c478bd9Sstevel@tonic-gate MSG_ORIG(MSG_STR_DYNLMLIST), &gsym) == -1) { 5627c478bd9Sstevel@tonic-gate mdb_warn(MSG_ORIG(MSG_ERR_SYMFAILED), MSG_ORIG(MSG_STR_LDSO1), 5637c478bd9Sstevel@tonic-gate MSG_ORIG(MSG_STR_DYNLMLIST)); 5647c478bd9Sstevel@tonic-gate return (DCMD_ERR); 5657c478bd9Sstevel@tonic-gate } 56657ef7aa9SRod Evans if (mdb_vread(&aplp, sizeof (APlist *), 56757ef7aa9SRod Evans (uintptr_t)gsym.st_value) == -1) { 56857ef7aa9SRod Evans mdb_warn(MSG_ORIG(MSG_ERR_READ), MSG_ORIG(MSG_STR_APLIST), 5697c478bd9Sstevel@tonic-gate gsym.st_value); 5707c478bd9Sstevel@tonic-gate return (DCMD_ERR); 5717c478bd9Sstevel@tonic-gate } 5727c478bd9Sstevel@tonic-gate 57357ef7aa9SRod Evans if (aplp == NULL) { 57457ef7aa9SRod Evans mdb_printf(MSG_ORIG(MSG_LMLIST_TITLE0), 57557ef7aa9SRod Evans MSG_ORIG(MSG_STR_DYNLMLIST)); 57657ef7aa9SRod Evans return (DCMD_OK); 57757ef7aa9SRod Evans } 57857ef7aa9SRod Evans 57957ef7aa9SRod Evans if (mdb_vread(&apl, sizeof (APlist), (uintptr_t)aplp) == -1) { 58057ef7aa9SRod Evans mdb_warn(MSG_ORIG(MSG_ERR_READ), MSG_ORIG(MSG_STR_APLIST), 58157ef7aa9SRod Evans aplp); 58257ef7aa9SRod Evans } 5837c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_LMLIST_TITLE1), MSG_ORIG(MSG_STR_DYNLMLIST), 58457ef7aa9SRod Evans aplp, (size_t)apl.apl_nitems, (size_t)apl.apl_arritems); 5857c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_STR_DASHES)); 5867c478bd9Sstevel@tonic-gate 5877c478bd9Sstevel@tonic-gate flags |= (DCMD_LOOP | DCMD_LOOPFIRST); 58857ef7aa9SRod Evans for (datap = (uintptr_t)aplp + APLIST_OFF_DATA, nitems = 0; 58957ef7aa9SRod Evans nitems < apl.apl_nitems; nitems++, datap += sizeof (void *)) { 59057ef7aa9SRod Evans Lm_list *lml, lm; 5917c478bd9Sstevel@tonic-gate 59257ef7aa9SRod Evans if (mdb_vread(&lml, sizeof (Lm_list *), datap) == -1) { 5937c478bd9Sstevel@tonic-gate mdb_warn(MSG_ORIG(MSG_ERR_READ), 59457ef7aa9SRod Evans MSG_ORIG(MSG_LMLIST_STR), datap); 5957c478bd9Sstevel@tonic-gate return (DCMD_ERR); 5967c478bd9Sstevel@tonic-gate } 59757ef7aa9SRod Evans if (mdb_vread(&lm, sizeof (Lm_list), (uintptr_t)lml) == -1) { 5987c478bd9Sstevel@tonic-gate mdb_warn(MSG_ORIG(MSG_ERR_READ), 59957ef7aa9SRod Evans MSG_ORIG(MSG_LMLIST_STR), lml); 6007c478bd9Sstevel@tonic-gate return (DCMD_ERR); 6017c478bd9Sstevel@tonic-gate } 6027c478bd9Sstevel@tonic-gate 60380148899SSurya Prakki (void) mdb_inc_indent(2); 60457ef7aa9SRod Evans if (lm.lm_flags & LML_FLG_BASELM) 6057c478bd9Sstevel@tonic-gate str = MSG_ORIG(MSG_LMLIST_BASE); 60657ef7aa9SRod Evans else if (lm.lm_flags & LML_FLG_RTLDLM) 6077c478bd9Sstevel@tonic-gate str = MSG_ORIG(MSG_LMLIST_LDSO); 6087c478bd9Sstevel@tonic-gate else 6097c478bd9Sstevel@tonic-gate str = MSG_ORIG(MSG_LMLIST_NEWLM); 6107c478bd9Sstevel@tonic-gate 6117c478bd9Sstevel@tonic-gate if ((flags & DCMD_LOOP) && ((flags & DCMD_LOOPFIRST) == 0)) 6127c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_STR_DASHES)); 6137c478bd9Sstevel@tonic-gate 61457ef7aa9SRod Evans mdb_printf(MSG_ORIG(MSG_LMLIST_TITLE2), datap, str); 6157c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_STR_DASHES)); 6167c478bd9Sstevel@tonic-gate 61780148899SSurya Prakki (void) mdb_inc_indent(2); 6187c478bd9Sstevel@tonic-gate 6197c478bd9Sstevel@tonic-gate if (((flags & DCMD_LOOPFIRST) || !(flags & DCMD_LOOP)) && 6207c478bd9Sstevel@tonic-gate !(flg & RTLD_FLG_VERBOSE)) { 6217c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_RTMAPS_TITLE0)); 6227c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_STR_DASHES)); 6237c478bd9Sstevel@tonic-gate } 6247c478bd9Sstevel@tonic-gate 6257c478bd9Sstevel@tonic-gate wdesc.w_flags = flg; 6267c478bd9Sstevel@tonic-gate if (mdb_pwalk(MSG_ORIG(MSG_RTMAPS_STR), rtmap_format, 62757ef7aa9SRod Evans (void *)&wdesc, (uintptr_t)lm.lm_head) == -1) { 62880148899SSurya Prakki (void) mdb_dec_indent(4); 6297c478bd9Sstevel@tonic-gate return (DCMD_ERR); 6307c478bd9Sstevel@tonic-gate } 63180148899SSurya Prakki (void) mdb_dec_indent(4); 6327c478bd9Sstevel@tonic-gate flags &= ~DCMD_LOOPFIRST; 6337c478bd9Sstevel@tonic-gate } 6347c478bd9Sstevel@tonic-gate return (DCMD_OK); 6357c478bd9Sstevel@tonic-gate } 6367c478bd9Sstevel@tonic-gate 6377c478bd9Sstevel@tonic-gate void 6387c478bd9Sstevel@tonic-gate dcmd_Setenv_help(void) 6397c478bd9Sstevel@tonic-gate { 6407c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_SETENV_HELP)); 6417c478bd9Sstevel@tonic-gate } 6427c478bd9Sstevel@tonic-gate 6437c478bd9Sstevel@tonic-gate /* 6447c478bd9Sstevel@tonic-gate * As of s10, mdb provides its own setenv command. This command allows the 6457c478bd9Sstevel@tonic-gate * environment of the process being controlled to be changed at any time. 6467c478bd9Sstevel@tonic-gate * Prior to this, ld.so.1 provided it's own, more primitive implementation. 6477c478bd9Sstevel@tonic-gate * This allowed for changing mdb's environment only, which if it was changed 6487c478bd9Sstevel@tonic-gate * before the application ws executed, would be copied to the applications 6497c478bd9Sstevel@tonic-gate * environment. Thus, we could start mdb, set an LD_ variable within its 6507c478bd9Sstevel@tonic-gate * environment (which it's own ld.so.1 had already finished processing), and 6517c478bd9Sstevel@tonic-gate * have this setting be inherited by the application. 6527c478bd9Sstevel@tonic-gate */ 6537c478bd9Sstevel@tonic-gate static int 6547c478bd9Sstevel@tonic-gate /* ARGSUSED */ 6557c478bd9Sstevel@tonic-gate dcmd_Setenv(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) 6567c478bd9Sstevel@tonic-gate { 6577c478bd9Sstevel@tonic-gate char *str; 6587c478bd9Sstevel@tonic-gate 6597c478bd9Sstevel@tonic-gate if (mdb_call_dcmd(MSG_ORIG(MSG_STR_SETENV), addr, flags, argc, 6607c478bd9Sstevel@tonic-gate argv) == 0) 6617c478bd9Sstevel@tonic-gate return (DCMD_OK); 6627c478bd9Sstevel@tonic-gate 6637c478bd9Sstevel@tonic-gate if (((flags & DCMD_ADDRSPEC) != 0) || (argc == 0) || (argc > 1) || 6647c478bd9Sstevel@tonic-gate (argv->a_type != MDB_TYPE_STRING)) 6657c478bd9Sstevel@tonic-gate return (DCMD_USAGE); 6667c478bd9Sstevel@tonic-gate 6677c478bd9Sstevel@tonic-gate str = mdb_alloc((strlen(argv->a_un.a_str) + 1), UM_NOSLEEP); 6687c478bd9Sstevel@tonic-gate if (str == NULL) 6697c478bd9Sstevel@tonic-gate return (DCMD_ERR); 6707c478bd9Sstevel@tonic-gate 6717c478bd9Sstevel@tonic-gate (void) strcpy(str, argv->a_un.a_str); 6727c478bd9Sstevel@tonic-gate (void) putenv(str); 6737c478bd9Sstevel@tonic-gate return (DCMD_OK); 6747c478bd9Sstevel@tonic-gate } 6757c478bd9Sstevel@tonic-gate 6767c478bd9Sstevel@tonic-gate /* 6777c478bd9Sstevel@tonic-gate * Walk Rt_map lists 6787c478bd9Sstevel@tonic-gate */ 6797c478bd9Sstevel@tonic-gate static int 6807c478bd9Sstevel@tonic-gate walk_rtmap_init(mdb_walk_state_t *wsp) 6817c478bd9Sstevel@tonic-gate { 6827c478bd9Sstevel@tonic-gate if (wsp->walk_addr == NULL) { 6837c478bd9Sstevel@tonic-gate mdb_warn(MSG_ORIG(MSG_ERR_NAS), MSG_ORIG(MSG_RTMAP_STR)); 6847c478bd9Sstevel@tonic-gate return (WALK_ERR); 6857c478bd9Sstevel@tonic-gate } 6867c478bd9Sstevel@tonic-gate return (WALK_NEXT); 6877c478bd9Sstevel@tonic-gate } 6887c478bd9Sstevel@tonic-gate 6897c478bd9Sstevel@tonic-gate static int 6907c478bd9Sstevel@tonic-gate walk_rtmap_step(mdb_walk_state_t *wsp) 6917c478bd9Sstevel@tonic-gate { 6927c478bd9Sstevel@tonic-gate int status; 6937c478bd9Sstevel@tonic-gate Rt_map lmp; 6947c478bd9Sstevel@tonic-gate 6957c478bd9Sstevel@tonic-gate if (wsp->walk_addr == NULL) 6967c478bd9Sstevel@tonic-gate return (WALK_DONE); 6977c478bd9Sstevel@tonic-gate if (mdb_vread(&lmp, sizeof (Rt_map), wsp->walk_addr) == -1) { 6987c478bd9Sstevel@tonic-gate mdb_warn(MSG_ORIG(MSG_ERR_READ), 6997c478bd9Sstevel@tonic-gate MSG_ORIG(MSG_RTMAP_STR), wsp->walk_addr); 7007c478bd9Sstevel@tonic-gate return (WALK_DONE); 7017c478bd9Sstevel@tonic-gate } 7027c478bd9Sstevel@tonic-gate 7037c478bd9Sstevel@tonic-gate status = wsp->walk_callback(wsp->walk_addr, &lmp, wsp->walk_cbdata); 7047c478bd9Sstevel@tonic-gate wsp->walk_addr = (uintptr_t)(NEXT(&lmp)); 7057c478bd9Sstevel@tonic-gate return (status); 7067c478bd9Sstevel@tonic-gate } 7077c478bd9Sstevel@tonic-gate 7087c478bd9Sstevel@tonic-gate static const mdb_bitmask_t lml_flags_bit[] = { 7097c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_LFL_BASELM), LML_FLG_BASELM, LML_FLG_BASELM }, 7107c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_LFL_RTLDLM), LML_FLG_RTLDLM, LML_FLG_RTLDLM }, 7117c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_LFL_PLTREL), LML_FLG_PLTREL, LML_FLG_PLTREL }, 7127c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_LFL_HOLDLOCK), LML_FLG_HOLDLOCK, LML_FLG_HOLDLOCK }, 7137c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_LFL_ENVIRON), LML_FLG_ENVIRON, LML_FLG_ENVIRON }, 7147c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_LFL_INTRPOSE), LML_FLG_INTRPOSE, LML_FLG_INTRPOSE }, 7157c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_LFL_LOCAUDIT), LML_FLG_LOCAUDIT, LML_FLG_LOCAUDIT }, 7167c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_LFL_LOADAVAIL), LML_FLG_LOADAVAIL, LML_FLG_LOADAVAIL }, 7177c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_LFL_IGNRELERR), LML_FLG_IGNRELERR, LML_FLG_IGNRELERR }, 7187c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_LFL_STARTREL), LML_FLG_STARTREL, LML_FLG_STARTREL }, 719dffec89cSrie { MSG_ORIG(MSG_LFL_ATEXIT), LML_FLG_ATEXIT, LML_FLG_ATEXIT }, 720dffec89cSrie { MSG_ORIG(MSG_LFL_OBJADDED), LML_FLG_OBJADDED, LML_FLG_OBJADDED }, 721dffec89cSrie { MSG_ORIG(MSG_LFL_OBJDELETED), LML_FLG_OBJDELETED, 722dffec89cSrie LML_FLG_OBJDELETED }, 723dffec89cSrie { MSG_ORIG(MSG_LFL_OBJREEVAL), LML_FLG_OBJREEVAL, LML_FLG_OBJREEVAL }, 72456deab07SRod Evans { MSG_ORIG(MSG_LFL_INTRPOSETSORT), LML_FLG_INTRPOSETSORT, 72556deab07SRod Evans LML_FLG_INTRPOSETSORT }, 72656deab07SRod Evans { MSG_ORIG(MSG_LFL_AUDITNOTIFY), LML_FLG_AUDITNOTIFY, 72756deab07SRod Evans LML_FLG_AUDITNOTIFY }, 72856deab07SRod Evans { MSG_ORIG(MSG_LFL_GROUPSEXIST), LML_FLG_GROUPSEXIST, 72956deab07SRod Evans LML_FLG_GROUPSEXIST }, 7307c478bd9Sstevel@tonic-gate 7317c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_LFL_TRC_LDDSTUB), LML_FLG_TRC_LDDSTUB, 7327c478bd9Sstevel@tonic-gate LML_FLG_TRC_LDDSTUB }, 7337c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_LFL_TRC_ENABLE), LML_FLG_TRC_ENABLE, 7347c478bd9Sstevel@tonic-gate LML_FLG_TRC_ENABLE }, 7357c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_LFL_TRC_WARN), LML_FLG_TRC_WARN, LML_FLG_TRC_WARN }, 7367c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_LFL_TRC_VERBOSE), LML_FLG_TRC_VERBOSE, 7377c478bd9Sstevel@tonic-gate LML_FLG_TRC_VERBOSE }, 7387c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_LFL_TRC_SEARCH), LML_FLG_TRC_SEARCH, 7397c478bd9Sstevel@tonic-gate LML_FLG_TRC_SEARCH }, 7407c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_LFL_TRC_UNREF), LML_FLG_TRC_UNREF, LML_FLG_TRC_UNREF }, 7417c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_LFL_TRC_UNUSED), LML_FLG_TRC_UNUSED, 7427c478bd9Sstevel@tonic-gate LML_FLG_TRC_UNUSED }, 7437c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_LFL_TRC_INIT), LML_FLG_TRC_INIT, LML_FLG_TRC_INIT }, 74456deab07SRod Evans { MSG_ORIG(MSG_LFL_TRC_NOUNRESWEAK), LML_FLG_TRC_NOUNRESWEAK, 74556deab07SRod Evans LML_FLG_TRC_NOUNRESWEAK }, 74656deab07SRod Evans { MSG_ORIG(MSG_LFL_TRC_NOPAREXT), LML_FLG_TRC_NOPAREXT, 74756deab07SRod Evans LML_FLG_TRC_NOPAREXT }, 7487c478bd9Sstevel@tonic-gate { NULL, 0, 0} 7497c478bd9Sstevel@tonic-gate }; 7507c478bd9Sstevel@tonic-gate 7517c478bd9Sstevel@tonic-gate static const mdb_bitmask_t lml_tflags_bit[] = { 7527c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_LTFL_NOLAZYLD), LML_TFLG_NOLAZYLD, LML_TFLG_NOLAZYLD }, 7537c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_LTFL_NODIRECT), LML_TFLG_NODIRECT, LML_TFLG_NODIRECT }, 7542020b2b6SRod Evans { MSG_ORIG(MSG_LTFL_NOAUDIT), LML_TFLG_NOAUDIT, LML_TFLG_NOAUDIT }, 7557c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_LTFL_LOADFLTR), LML_TFLG_LOADFLTR, LML_TFLG_LOADFLTR }, 7567c478bd9Sstevel@tonic-gate 7577c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_LTFL_AUD_PREINIT), LML_TFLG_AUD_PREINIT, 7587c478bd9Sstevel@tonic-gate LML_TFLG_AUD_PREINIT }, 7597c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_LTFL_AUD_OBJSEARCH), LML_TFLG_AUD_OBJSEARCH, 7607c478bd9Sstevel@tonic-gate LML_TFLG_AUD_OBJSEARCH }, 7617c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_LTFL_AUD_OBJOPEN), LML_TFLG_AUD_OBJOPEN, 7627c478bd9Sstevel@tonic-gate LML_TFLG_AUD_OBJOPEN }, 7637c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_LTFL_AUD_OBJFILTER), LML_TFLG_AUD_OBJFILTER, 7647c478bd9Sstevel@tonic-gate LML_TFLG_AUD_OBJFILTER }, 7657c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_LTFL_AUD_OBJCLOSE), LML_TFLG_AUD_OBJCLOSE, 7667c478bd9Sstevel@tonic-gate LML_TFLG_AUD_OBJCLOSE }, 7677c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_LTFL_AUD_SYMBIND), LML_TFLG_AUD_SYMBIND, 7687c478bd9Sstevel@tonic-gate LML_TFLG_AUD_SYMBIND }, 7697c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_LTFL_AUD_PLTENTER), LML_TFLG_AUD_PLTENTER, 7707c478bd9Sstevel@tonic-gate LML_TFLG_AUD_PLTENTER }, 7717c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_LTFL_AUD_PLTEXIT), LML_TFLG_AUD_PLTEXIT, 7727c478bd9Sstevel@tonic-gate LML_TFLG_AUD_PLTEXIT }, 7737c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_LTFL_AUD_ACTIVITY), LML_TFLG_AUD_ACTIVITY, 7747c478bd9Sstevel@tonic-gate LML_TFLG_AUD_ACTIVITY }, 7757c478bd9Sstevel@tonic-gate { NULL, 0, 0} 7767c478bd9Sstevel@tonic-gate }; 7777c478bd9Sstevel@tonic-gate 7787c478bd9Sstevel@tonic-gate void 7797c478bd9Sstevel@tonic-gate dcmd_Lm_list_help(void) 7807c478bd9Sstevel@tonic-gate { 7817c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_LMLIST_HELP)); 7827c478bd9Sstevel@tonic-gate } 7837c478bd9Sstevel@tonic-gate 7847c478bd9Sstevel@tonic-gate static int 7857c478bd9Sstevel@tonic-gate /* ARGSUSED1 */ 7867c478bd9Sstevel@tonic-gate _dcmd_Lm_list(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) 7877c478bd9Sstevel@tonic-gate { 7887c478bd9Sstevel@tonic-gate Lm_list lml; 7897c478bd9Sstevel@tonic-gate const char *str; 7907c478bd9Sstevel@tonic-gate uint_t flg = 0; 7917c478bd9Sstevel@tonic-gate 7927c478bd9Sstevel@tonic-gate if (mdb_getopts(argc, argv, 'v', MDB_OPT_SETBITS, RTLD_FLG_VERBOSE, 7937c478bd9Sstevel@tonic-gate &flg, NULL) != argc) 7947c478bd9Sstevel@tonic-gate return (DCMD_USAGE); 7957c478bd9Sstevel@tonic-gate 7967c478bd9Sstevel@tonic-gate if (mdb_vread(&lml, sizeof (lml), addr) == -1) { 7977c478bd9Sstevel@tonic-gate mdb_warn(MSG_ORIG(MSG_ERR_READ), MSG_ORIG(MSG_LMLIST_STR), 7987c478bd9Sstevel@tonic-gate addr); 7997c478bd9Sstevel@tonic-gate return (DCMD_ERR); 8007c478bd9Sstevel@tonic-gate } 8017c478bd9Sstevel@tonic-gate 8027c478bd9Sstevel@tonic-gate if (lml.lm_flags & LML_FLG_BASELM) 8037c478bd9Sstevel@tonic-gate str = MSG_ORIG(MSG_LMLIST_BASE); 8047c478bd9Sstevel@tonic-gate else if (lml.lm_flags & LML_FLG_RTLDLM) 8057c478bd9Sstevel@tonic-gate str = MSG_ORIG(MSG_LMLIST_LDSO); 8067c478bd9Sstevel@tonic-gate else 8077c478bd9Sstevel@tonic-gate str = MSG_ORIG(MSG_LMLIST_NEWLM); 8087c478bd9Sstevel@tonic-gate 8097c478bd9Sstevel@tonic-gate if ((flags & DCMD_LOOP) && ((flags & DCMD_LOOPFIRST) == 0)) 8107c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_STR_DASHES)); 8117c478bd9Sstevel@tonic-gate 8127c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_LMLIST_TITLE2), addr, str); 8137c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_STR_DASHES)); 8147c478bd9Sstevel@tonic-gate 8157c478bd9Sstevel@tonic-gate if (lml.lm_lists) { 8167c478bd9Sstevel@tonic-gate Alist al; 8177c478bd9Sstevel@tonic-gate Lm_cntl lmc; 81857ef7aa9SRod Evans uintptr_t datap; 8197c478bd9Sstevel@tonic-gate 8207c478bd9Sstevel@tonic-gate addr = (uintptr_t)lml.lm_lists; 8217c478bd9Sstevel@tonic-gate if (mdb_vread(&al, sizeof (Alist), addr) == -1) { 8227c478bd9Sstevel@tonic-gate mdb_warn(MSG_ORIG(MSG_ERR_READ), 8237c478bd9Sstevel@tonic-gate MSG_ORIG(MSG_STR_ALIST), addr); 8247c478bd9Sstevel@tonic-gate return (DCMD_ERR); 8257c478bd9Sstevel@tonic-gate } 8267c478bd9Sstevel@tonic-gate 8277c478bd9Sstevel@tonic-gate /* 8287c478bd9Sstevel@tonic-gate * Determine whether the Alist has been populated. Note, the 8297c478bd9Sstevel@tonic-gate * implementation first reserves an alist entry, and initializes 8307c478bd9Sstevel@tonic-gate * this element when the first link-map is processed. Thus, 831cce0e03bSab196087 * there's a window when nitems is updated, but before the next 8327c478bd9Sstevel@tonic-gate * element has been initialized. 8337c478bd9Sstevel@tonic-gate */ 834cce0e03bSab196087 if (al.al_nitems && (flg & RTLD_FLG_VERBOSE)) { 83557ef7aa9SRod Evans datap = ALIST_OFF_DATA + (uintptr_t)addr; 8367c478bd9Sstevel@tonic-gate 8377c478bd9Sstevel@tonic-gate if (mdb_vread(&lmc, sizeof (Lm_cntl), 83857ef7aa9SRod Evans datap) == -1) { 8397c478bd9Sstevel@tonic-gate mdb_warn(MSG_ORIG(MSG_ERR_READ), 84057ef7aa9SRod Evans MSG_ORIG(MSG_LMLIST_STR), datap); 8417c478bd9Sstevel@tonic-gate return (DCMD_ERR); 8427c478bd9Sstevel@tonic-gate } 8437c478bd9Sstevel@tonic-gate } 8447c478bd9Sstevel@tonic-gate 845cce0e03bSab196087 mdb_printf(MSG_ORIG(MSG_LMLIST_LINE0), addr, 846cce0e03bSab196087 (size_t)al.al_nitems, (size_t)al.al_arritems); 84780148899SSurya Prakki (void) mdb_inc_indent(2); 8487c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_STR_DASHES)); 8497c478bd9Sstevel@tonic-gate 850cce0e03bSab196087 if (al.al_nitems && (flg & RTLD_FLG_VERBOSE)) { 85157ef7aa9SRod Evans uintptr_t nitems; 8527c478bd9Sstevel@tonic-gate 85380148899SSurya Prakki (void) mdb_inc_indent(2); 85457ef7aa9SRod Evans mdb_printf(MSG_ORIG(MSG_LMC_LINE1), datap); 8557c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_LMC_LINE2), lmc.lc_head, 8567c478bd9Sstevel@tonic-gate lmc.lc_tail); 8577c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_LMC_LINE3), lmc.lc_flags, 8587c478bd9Sstevel@tonic-gate lmc.lc_now); 8597c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_LMC_LINE4), lmc.lc_flags, 8607c478bd9Sstevel@tonic-gate lmc_bits); 8617c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_STR_DASHES)); 8627c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_RTMAPS_TITLE0)); 8637c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_STR_DASHES)); 8647c478bd9Sstevel@tonic-gate 8657c478bd9Sstevel@tonic-gate if (lmc.lc_head) { 8667c478bd9Sstevel@tonic-gate if (mdb_pwalk(MSG_ORIG(MSG_RTMAPS_STR), 8677c478bd9Sstevel@tonic-gate rtmap_format, (void *)0, 8687c478bd9Sstevel@tonic-gate (uintptr_t)lmc.lc_head) == -1) { 86980148899SSurya Prakki (void) mdb_dec_indent(4); 8707c478bd9Sstevel@tonic-gate return (DCMD_ERR); 8717c478bd9Sstevel@tonic-gate } 8727c478bd9Sstevel@tonic-gate } else 8737c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_FMT_RT), 0, 0, 0, 8747c478bd9Sstevel@tonic-gate MSG_ORIG(MSG_STR_EMPTY)); 8757c478bd9Sstevel@tonic-gate 8767c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_STR_DASHES)); 8777c478bd9Sstevel@tonic-gate 87857ef7aa9SRod Evans for (nitems = 1; nitems < al.al_nitems; nitems++) { 87957ef7aa9SRod Evans datap += al.al_size; 8807c478bd9Sstevel@tonic-gate if (mdb_vread(&lmc, sizeof (Lm_cntl), 88157ef7aa9SRod Evans datap) == -1) { 8827c478bd9Sstevel@tonic-gate mdb_warn(MSG_ORIG(MSG_ERR_READ), 88357ef7aa9SRod Evans MSG_ORIG(MSG_LMLIST_STR), datap); 88480148899SSurya Prakki (void) mdb_dec_indent(4); 8857c478bd9Sstevel@tonic-gate return (DCMD_ERR); 8867c478bd9Sstevel@tonic-gate } 8877c478bd9Sstevel@tonic-gate 8887c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_STR_DASHES)); 88957ef7aa9SRod Evans mdb_printf(MSG_ORIG(MSG_LMC_LINE1), datap); 8907c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_LMC_LINE2), 8917c478bd9Sstevel@tonic-gate lmc.lc_head, lmc.lc_tail); 8927c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_LMC_LINE3), 8937c478bd9Sstevel@tonic-gate lmc.lc_flags, lmc.lc_now); 8947c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_LMC_LINE4), 8957c478bd9Sstevel@tonic-gate lmc.lc_flags, lmc_bits); 8967c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_STR_DASHES)); 8977c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_RTMAPS_TITLE0)); 8987c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_STR_DASHES)); 8997c478bd9Sstevel@tonic-gate 9007c478bd9Sstevel@tonic-gate if (lmc.lc_head) { 9017c478bd9Sstevel@tonic-gate if (mdb_pwalk(MSG_ORIG(MSG_RTMAPS_STR), 9027c478bd9Sstevel@tonic-gate rtmap_format, (void *)0, 9037c478bd9Sstevel@tonic-gate (uintptr_t)lmc.lc_head) == -1) { 90480148899SSurya Prakki (void) mdb_dec_indent(4); 9057c478bd9Sstevel@tonic-gate return (DCMD_ERR); 9067c478bd9Sstevel@tonic-gate } 9077c478bd9Sstevel@tonic-gate } else 9087c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_FMT_RT), 0, 0, 9097c478bd9Sstevel@tonic-gate 0, MSG_ORIG(MSG_STR_EMPTY)); 9107c478bd9Sstevel@tonic-gate 9117c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_STR_DASHES)); 9127c478bd9Sstevel@tonic-gate } 91380148899SSurya Prakki (void) mdb_dec_indent(2); 9147c478bd9Sstevel@tonic-gate } 91580148899SSurya Prakki (void) mdb_dec_indent(2); 9167c478bd9Sstevel@tonic-gate } 9177c478bd9Sstevel@tonic-gate 9187c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_LMLIST_LINE1), lml.lm_head, lml.lm_tail); 91910a4fa49Srie mdb_printf(MSG_ORIG(MSG_LMLIST_LINE2), lml.lm_alp, lml.lm_rti); 9207c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_LMLIST_LINE3), lml.lm_handle, lml.lm_obj, 9217c478bd9Sstevel@tonic-gate lml.lm_init, lml.lm_lazy); 9227c478bd9Sstevel@tonic-gate 9237c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_LMLIST_LINE4), lml.lm_flags); 9247c478bd9Sstevel@tonic-gate if (lml.lm_flags) 9257c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_LMLIST_LINE6), lml.lm_flags, 9267c478bd9Sstevel@tonic-gate lml_flags_bit); 9277c478bd9Sstevel@tonic-gate 9287c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_LMLIST_LINE5), lml.lm_tflags); 9297c478bd9Sstevel@tonic-gate if (lml.lm_tflags) 9307c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_LMLIST_LINE6), lml.lm_tflags, 9317c478bd9Sstevel@tonic-gate lml_tflags_bit); 9327c478bd9Sstevel@tonic-gate 9337c478bd9Sstevel@tonic-gate return (DCMD_OK); 9347c478bd9Sstevel@tonic-gate } 9357c478bd9Sstevel@tonic-gate 9367c478bd9Sstevel@tonic-gate static int 9377c478bd9Sstevel@tonic-gate /* ARGSUSED2 */ 9387c478bd9Sstevel@tonic-gate dcmd_Lm_list(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) 9397c478bd9Sstevel@tonic-gate { 9407c478bd9Sstevel@tonic-gate GElf_Sym gsym; 94157ef7aa9SRod Evans APlist *aplp, apl; 94257ef7aa9SRod Evans uintptr_t datap, nitems; 9437c478bd9Sstevel@tonic-gate 9447c478bd9Sstevel@tonic-gate /* 9457c478bd9Sstevel@tonic-gate * If an address was provided us it. 9467c478bd9Sstevel@tonic-gate */ 9477c478bd9Sstevel@tonic-gate if (flags & DCMD_ADDRSPEC) 9487c478bd9Sstevel@tonic-gate return (_dcmd_Lm_list(addr, flags, argc, argv)); 9497c478bd9Sstevel@tonic-gate 9507c478bd9Sstevel@tonic-gate /* 9517c478bd9Sstevel@tonic-gate * Otherwise traverse the dynlm_list and display each link-map list. 9527c478bd9Sstevel@tonic-gate */ 9537c478bd9Sstevel@tonic-gate if (mdb_lookup_by_obj(MSG_ORIG(MSG_STR_LDSO1), 9547c478bd9Sstevel@tonic-gate MSG_ORIG(MSG_STR_DYNLMLIST), &gsym) == -1) { 9557c478bd9Sstevel@tonic-gate mdb_warn(MSG_ORIG(MSG_ERR_SYMFAILED), MSG_ORIG(MSG_STR_LDSO1), 9567c478bd9Sstevel@tonic-gate MSG_ORIG(MSG_STR_DYNLMLIST)); 9577c478bd9Sstevel@tonic-gate return (DCMD_ERR); 9587c478bd9Sstevel@tonic-gate } 95957ef7aa9SRod Evans if (mdb_vread(&aplp, sizeof (APlist *), 96057ef7aa9SRod Evans (uintptr_t)gsym.st_value) == -1) { 96157ef7aa9SRod Evans mdb_warn(MSG_ORIG(MSG_ERR_READ), MSG_ORIG(MSG_STR_APLIST), 9627c478bd9Sstevel@tonic-gate gsym.st_value); 9637c478bd9Sstevel@tonic-gate return (DCMD_ERR); 9647c478bd9Sstevel@tonic-gate } 96557ef7aa9SRod Evans if (aplp == NULL) { 96657ef7aa9SRod Evans mdb_printf(MSG_ORIG(MSG_LMLIST_TITLE0), 96757ef7aa9SRod Evans MSG_ORIG(MSG_STR_DYNLMLIST)); 96857ef7aa9SRod Evans return (DCMD_OK); 96957ef7aa9SRod Evans } 97057ef7aa9SRod Evans 97157ef7aa9SRod Evans if (mdb_vread(&apl, sizeof (APlist), (uintptr_t)aplp) == -1) { 97257ef7aa9SRod Evans mdb_warn(MSG_ORIG(MSG_ERR_READ), MSG_ORIG(MSG_STR_APLIST), 97357ef7aa9SRod Evans aplp); 97457ef7aa9SRod Evans return (DCMD_ERR); 97557ef7aa9SRod Evans } 9767c478bd9Sstevel@tonic-gate 9777c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_LMLIST_TITLE1), MSG_ORIG(MSG_STR_DYNLMLIST), 97857ef7aa9SRod Evans aplp, (size_t)apl.apl_nitems, (size_t)apl.apl_arritems); 9797c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_STR_DASHES)); 9807c478bd9Sstevel@tonic-gate 9817c478bd9Sstevel@tonic-gate flags |= (DCMD_LOOP | DCMD_LOOPFIRST); 98257ef7aa9SRod Evans for (datap = (uintptr_t)aplp + APLIST_OFF_DATA, nitems = 0; 98357ef7aa9SRod Evans nitems < apl.apl_nitems; nitems++, datap += sizeof (void *)) { 98457ef7aa9SRod Evans Lm_list *lml; 98557ef7aa9SRod Evans 98657ef7aa9SRod Evans if (mdb_vread(&lml, sizeof (Lm_list *), datap) == -1) { 9877c478bd9Sstevel@tonic-gate mdb_warn(MSG_ORIG(MSG_ERR_READ), 98857ef7aa9SRod Evans MSG_ORIG(MSG_LMLIST_STR), datap); 9897c478bd9Sstevel@tonic-gate return (DCMD_ERR); 9907c478bd9Sstevel@tonic-gate } 9917c478bd9Sstevel@tonic-gate 99280148899SSurya Prakki (void) mdb_inc_indent(2); 99357ef7aa9SRod Evans if (_dcmd_Lm_list((uintptr_t)lml, flags, argc, 99457ef7aa9SRod Evans argv) == DCMD_ERR) { 99580148899SSurya Prakki (void) mdb_dec_indent(2); 9967c478bd9Sstevel@tonic-gate return (DCMD_ERR); 9977c478bd9Sstevel@tonic-gate } 99880148899SSurya Prakki (void) mdb_dec_indent(2); 9997c478bd9Sstevel@tonic-gate flags &= ~DCMD_LOOPFIRST; 10007c478bd9Sstevel@tonic-gate } 10017c478bd9Sstevel@tonic-gate return (DCMD_OK); 10027c478bd9Sstevel@tonic-gate } 10037c478bd9Sstevel@tonic-gate 10047c478bd9Sstevel@tonic-gate void 10057c478bd9Sstevel@tonic-gate dcmd_GrpDesc_help(void) 10067c478bd9Sstevel@tonic-gate { 10077c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_GRPDESC_HELP)); 10087c478bd9Sstevel@tonic-gate } 10097c478bd9Sstevel@tonic-gate 10107c478bd9Sstevel@tonic-gate static int 10117c478bd9Sstevel@tonic-gate /* ARGSUSED2 */ 10127c478bd9Sstevel@tonic-gate dcmd_GrpDesc(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) 10137c478bd9Sstevel@tonic-gate { 10147c478bd9Sstevel@tonic-gate Grp_desc gd; 10157c478bd9Sstevel@tonic-gate char *str; 10167c478bd9Sstevel@tonic-gate 10177c478bd9Sstevel@tonic-gate /* 10187c478bd9Sstevel@tonic-gate * Insure we have a valid address. 10197c478bd9Sstevel@tonic-gate */ 10207c478bd9Sstevel@tonic-gate if ((flags & DCMD_ADDRSPEC) == 0) { 10217c478bd9Sstevel@tonic-gate mdb_warn(MSG_ORIG(MSG_ERR_NAS), MSG_ORIG(MSG_GRPDESC_STR)); 10227c478bd9Sstevel@tonic-gate return (DCMD_USAGE); 10237c478bd9Sstevel@tonic-gate } 10247c478bd9Sstevel@tonic-gate 10257c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_GRPDESC_LINE1), addr); 10267c478bd9Sstevel@tonic-gate if (mdb_vread(&gd, sizeof (Grp_desc), addr) == -1) { 10277c478bd9Sstevel@tonic-gate mdb_warn(MSG_ORIG(MSG_ERR_READ), MSG_ORIG(MSG_GRPDESC_STR), 10287c478bd9Sstevel@tonic-gate addr); 10297c478bd9Sstevel@tonic-gate return (DCMD_ERR); 10307c478bd9Sstevel@tonic-gate } 10317c478bd9Sstevel@tonic-gate 10327c478bd9Sstevel@tonic-gate if ((str = Rtmap_Name((uintptr_t)gd.gd_depend)) == 0) 10337c478bd9Sstevel@tonic-gate return (DCMD_ERR); 10347c478bd9Sstevel@tonic-gate 10357c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_GRPDESC_LINE2), gd.gd_depend, str); 10367c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_GRPDESC_LINE3), gd.gd_flags, gd.gd_flags, 10377c478bd9Sstevel@tonic-gate grdflags_bits); 10387c478bd9Sstevel@tonic-gate 10397c478bd9Sstevel@tonic-gate return (DCMD_OK); 10407c478bd9Sstevel@tonic-gate } 10417c478bd9Sstevel@tonic-gate 10427c478bd9Sstevel@tonic-gate void 10437c478bd9Sstevel@tonic-gate dcmd_GrpHdl_help(void) 10447c478bd9Sstevel@tonic-gate { 10457c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_GRPHDL_HELP)); 10467c478bd9Sstevel@tonic-gate } 10477c478bd9Sstevel@tonic-gate 10487c478bd9Sstevel@tonic-gate static int 10497c478bd9Sstevel@tonic-gate /* ARGSUSED2 */ 10507c478bd9Sstevel@tonic-gate dcmd_GrpHdl(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) 10517c478bd9Sstevel@tonic-gate { 10527c478bd9Sstevel@tonic-gate Grp_hdl gh; 10537c478bd9Sstevel@tonic-gate Alist al; 105457ef7aa9SRod Evans uintptr_t datap, listidx; 10557c478bd9Sstevel@tonic-gate char *str; 10567c478bd9Sstevel@tonic-gate uint_t flg = 0; 10577c478bd9Sstevel@tonic-gate 10587c478bd9Sstevel@tonic-gate /* 10597c478bd9Sstevel@tonic-gate * Insure we have a valid address, and provide for a -v option. 10607c478bd9Sstevel@tonic-gate */ 10617c478bd9Sstevel@tonic-gate if ((flags & DCMD_ADDRSPEC) == 0) { 10627c478bd9Sstevel@tonic-gate mdb_warn(MSG_ORIG(MSG_ERR_NAS), MSG_ORIG(MSG_GRPHDL_STR)); 10637c478bd9Sstevel@tonic-gate return (DCMD_USAGE); 10647c478bd9Sstevel@tonic-gate } 10657c478bd9Sstevel@tonic-gate if (mdb_getopts(argc, argv, 'v', MDB_OPT_SETBITS, RTLD_FLG_VERBOSE, 10667c478bd9Sstevel@tonic-gate &flg, NULL) != argc) 10677c478bd9Sstevel@tonic-gate return (DCMD_USAGE); 10687c478bd9Sstevel@tonic-gate 10697c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_GRPHDL_LINE1), addr); 10707c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_STR_DASHES)); 10717c478bd9Sstevel@tonic-gate 10727c478bd9Sstevel@tonic-gate if (mdb_vread(&gh, sizeof (Grp_hdl), addr) == -1) { 10737c478bd9Sstevel@tonic-gate mdb_warn(MSG_ORIG(MSG_ERR_READ), MSG_ORIG(MSG_GRPHDL_STR), 10747c478bd9Sstevel@tonic-gate addr); 10757c478bd9Sstevel@tonic-gate return (DCMD_ERR); 10767c478bd9Sstevel@tonic-gate } 10777c478bd9Sstevel@tonic-gate 10787c478bd9Sstevel@tonic-gate /* 10797c478bd9Sstevel@tonic-gate * Determine the handles owner. Note that an orphaned handle may no 10807c478bd9Sstevel@tonic-gate * longer contain its originating owner. 10817c478bd9Sstevel@tonic-gate */ 10825aefb655Srie if (gh.gh_ownlmp) { 10835aefb655Srie if ((str = Rtmap_Name((uintptr_t)gh.gh_ownlmp)) == 0) 10847c478bd9Sstevel@tonic-gate return (DCMD_ERR); 10857c478bd9Sstevel@tonic-gate } else 10867c478bd9Sstevel@tonic-gate str = (char *)MSG_ORIG(MSG_STR_ORPHANED); 10877c478bd9Sstevel@tonic-gate 10887c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_GRPHDL_LINE2), str); 10897c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_GRPHDL_LINE3), gh.gh_flags, gh.gh_flags, 10907c478bd9Sstevel@tonic-gate grhflags_bits); 10917c478bd9Sstevel@tonic-gate 10927c478bd9Sstevel@tonic-gate if (gh.gh_depends == 0) { 10937c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_GRPHDL_LINE4), gh.gh_refcnt); 10947c478bd9Sstevel@tonic-gate return (DCMD_OK); 10957c478bd9Sstevel@tonic-gate } 10967c478bd9Sstevel@tonic-gate 10977c478bd9Sstevel@tonic-gate addr = (uintptr_t)gh.gh_depends; 10987c478bd9Sstevel@tonic-gate if (mdb_vread(&al, sizeof (Alist), addr) == -1) { 10997c478bd9Sstevel@tonic-gate mdb_warn(MSG_ORIG(MSG_ERR_READ), MSG_ORIG(MSG_STR_ALIST), addr); 11007c478bd9Sstevel@tonic-gate return (DCMD_ERR); 11017c478bd9Sstevel@tonic-gate } 11027c478bd9Sstevel@tonic-gate 1103cce0e03bSab196087 mdb_printf(MSG_ORIG(MSG_GRPHDL_LINE5), gh.gh_refcnt, addr, 1104cce0e03bSab196087 (size_t)al.al_nitems, (size_t)al.al_arritems); 11057c478bd9Sstevel@tonic-gate 1106cce0e03bSab196087 if (((flg & RTLD_FLG_VERBOSE) == 0) || (al.al_nitems == 0)) 11077c478bd9Sstevel@tonic-gate return (DCMD_OK); 11087c478bd9Sstevel@tonic-gate 110980148899SSurya Prakki (void) mdb_inc_indent(4); 11107c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_STR_DASHES)); 11117c478bd9Sstevel@tonic-gate 11127c478bd9Sstevel@tonic-gate /* 11137c478bd9Sstevel@tonic-gate * Under verbose mode print the name of each dependency. An Alist can 11147c478bd9Sstevel@tonic-gate * have a variable number of data items, so read each individual entry. 11157c478bd9Sstevel@tonic-gate */ 111657ef7aa9SRod Evans datap = ALIST_OFF_DATA + (uintptr_t)addr; 111757ef7aa9SRod Evans if (dcmd_GrpDesc(datap, flags, argc, argv) == DCMD_ERR) { 111880148899SSurya Prakki (void) mdb_dec_indent(4); 11197c478bd9Sstevel@tonic-gate return (DCMD_ERR); 11207c478bd9Sstevel@tonic-gate } 11217c478bd9Sstevel@tonic-gate 1122cce0e03bSab196087 for (listidx = 1; listidx < al.al_nitems; listidx++) { 112357ef7aa9SRod Evans datap += al.al_size; 11247c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_STR_DASHES)); 112557ef7aa9SRod Evans if (dcmd_GrpDesc(datap, flags, argc, argv) == DCMD_ERR) { 112680148899SSurya Prakki (void) mdb_dec_indent(4); 11277c478bd9Sstevel@tonic-gate return (DCMD_ERR); 11287c478bd9Sstevel@tonic-gate } 11297c478bd9Sstevel@tonic-gate } 11307c478bd9Sstevel@tonic-gate 113180148899SSurya Prakki (void) mdb_dec_indent(4); 11327c478bd9Sstevel@tonic-gate return (DCMD_OK); 11337c478bd9Sstevel@tonic-gate } 11347c478bd9Sstevel@tonic-gate 11357c478bd9Sstevel@tonic-gate static void 11367c478bd9Sstevel@tonic-gate dcmd_Handles_help(void) 11377c478bd9Sstevel@tonic-gate { 11387c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_HANDLES_HELP)); 11397c478bd9Sstevel@tonic-gate } 11407c478bd9Sstevel@tonic-gate 11417c478bd9Sstevel@tonic-gate static int 11427c478bd9Sstevel@tonic-gate dcmd_Handles(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) 11437c478bd9Sstevel@tonic-gate { 11447c478bd9Sstevel@tonic-gate Rt_map rtmap; 11457c478bd9Sstevel@tonic-gate char *str; 11467c478bd9Sstevel@tonic-gate uint_t flg = 0; 1147cce0e03bSab196087 APlist apl; 114857ef7aa9SRod Evans uintptr_t datap, nitems; 11497c478bd9Sstevel@tonic-gate Grp_hdl *ghp; 11507c478bd9Sstevel@tonic-gate 11517c478bd9Sstevel@tonic-gate /* 11527c478bd9Sstevel@tonic-gate * Insure we have a valid address, and provide for a -v option. 11537c478bd9Sstevel@tonic-gate */ 11547c478bd9Sstevel@tonic-gate if ((flags & DCMD_ADDRSPEC) == 0) { 11557c478bd9Sstevel@tonic-gate mdb_warn(MSG_ORIG(MSG_ERR_NAS), MSG_ORIG(MSG_HANDLES_STR)); 11567c478bd9Sstevel@tonic-gate return (DCMD_USAGE); 11577c478bd9Sstevel@tonic-gate } 11587c478bd9Sstevel@tonic-gate if (mdb_getopts(argc, argv, 'v', MDB_OPT_SETBITS, RTLD_FLG_VERBOSE, 11597c478bd9Sstevel@tonic-gate &flg, NULL) != argc) 11607c478bd9Sstevel@tonic-gate return (DCMD_USAGE); 11617c478bd9Sstevel@tonic-gate 11627c478bd9Sstevel@tonic-gate /* 11637c478bd9Sstevel@tonic-gate * Read the Rt_map contents. 11647c478bd9Sstevel@tonic-gate */ 11657c478bd9Sstevel@tonic-gate if (mdb_vread(&rtmap, sizeof (Rt_map), addr) == -1) { 11667c478bd9Sstevel@tonic-gate mdb_warn(MSG_ORIG(MSG_ERR_READ), MSG_ORIG(MSG_RTMAP_STR), addr); 11677c478bd9Sstevel@tonic-gate return (DCMD_ERR); 11687c478bd9Sstevel@tonic-gate } 11697c478bd9Sstevel@tonic-gate if ((str = String((uintptr_t)NAME(&rtmap), 11707c478bd9Sstevel@tonic-gate MSG_ORIG(MSG_STR_NAME))) == 0) 11717c478bd9Sstevel@tonic-gate return (DCMD_ERR); 11727c478bd9Sstevel@tonic-gate 11737c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_HANDLES_LINE1), str); 11747c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_STR_DASHES)); 11757c478bd9Sstevel@tonic-gate 11767c478bd9Sstevel@tonic-gate if (HANDLES(&rtmap) == 0) 11777c478bd9Sstevel@tonic-gate return (DCMD_OK); 11787c478bd9Sstevel@tonic-gate 11797c478bd9Sstevel@tonic-gate addr = (uintptr_t)HANDLES(&rtmap); 1180cce0e03bSab196087 if (mdb_vread(&apl, sizeof (APlist), addr) == -1) { 1181cce0e03bSab196087 mdb_warn(MSG_ORIG(MSG_ERR_READ), MSG_ORIG(MSG_STR_APLIST), 1182cce0e03bSab196087 addr); 11837c478bd9Sstevel@tonic-gate return (DCMD_ERR); 11847c478bd9Sstevel@tonic-gate } 11857c478bd9Sstevel@tonic-gate 1186cce0e03bSab196087 mdb_printf(MSG_ORIG(MSG_HANDLES_LINE2), addr, (size_t)apl.apl_nitems, 1187cce0e03bSab196087 (size_t)apl.apl_arritems); 11887c478bd9Sstevel@tonic-gate 1189cce0e03bSab196087 if (((flg & RTLD_FLG_VERBOSE) == 0) || (apl.apl_nitems == 0)) 11907c478bd9Sstevel@tonic-gate return (DCMD_OK); 11917c478bd9Sstevel@tonic-gate 11927c478bd9Sstevel@tonic-gate /* 1193cce0e03bSab196087 * Under verbose mode print the name of each dependency. An APlist can 11947c478bd9Sstevel@tonic-gate * have a variable number of data items, so read each individual entry. 11957c478bd9Sstevel@tonic-gate */ 119657ef7aa9SRod Evans datap = addr + APLIST_OFF_DATA; 119757ef7aa9SRod Evans if (mdb_vread(&ghp, sizeof (Grp_hdl *), datap) == -1) { 11987c478bd9Sstevel@tonic-gate mdb_warn(MSG_ORIG(MSG_ERR_READ), 119957ef7aa9SRod Evans MSG_ORIG(MSG_GRPHDL_STR), datap); 12007c478bd9Sstevel@tonic-gate return (DCMD_ERR); 12017c478bd9Sstevel@tonic-gate } 12027c478bd9Sstevel@tonic-gate 120380148899SSurya Prakki (void) mdb_inc_indent(4); 12047c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_STR_DASHES)); 12057c478bd9Sstevel@tonic-gate 12067c478bd9Sstevel@tonic-gate if (dcmd_GrpHdl((uintptr_t)ghp, flags, argc, argv) == DCMD_ERR) { 120780148899SSurya Prakki (void) mdb_dec_indent(4); 12087c478bd9Sstevel@tonic-gate return (DCMD_ERR); 12097c478bd9Sstevel@tonic-gate } 12107c478bd9Sstevel@tonic-gate 121157ef7aa9SRod Evans nitems = 1; 121257ef7aa9SRod Evans for (nitems = 1; nitems < apl.apl_nitems; nitems++) { 121357ef7aa9SRod Evans datap += sizeof (void *); 121457ef7aa9SRod Evans if (mdb_vread(&ghp, sizeof (Grp_hdl *), datap) == -1) { 12157c478bd9Sstevel@tonic-gate mdb_warn(MSG_ORIG(MSG_ERR_READ), 121657ef7aa9SRod Evans MSG_ORIG(MSG_GRPHDL_STR), datap); 12177c478bd9Sstevel@tonic-gate return (DCMD_ERR); 12187c478bd9Sstevel@tonic-gate } 12197c478bd9Sstevel@tonic-gate 12207c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_STR_DASHES)); 12217c478bd9Sstevel@tonic-gate if (dcmd_GrpHdl((uintptr_t)ghp, flags, argc, 12227c478bd9Sstevel@tonic-gate argv) == DCMD_ERR) { 122380148899SSurya Prakki (void) mdb_dec_indent(4); 12247c478bd9Sstevel@tonic-gate return (DCMD_ERR); 12257c478bd9Sstevel@tonic-gate } 12267c478bd9Sstevel@tonic-gate } 122780148899SSurya Prakki (void) mdb_dec_indent(4); 12287c478bd9Sstevel@tonic-gate return (DCMD_OK); 12297c478bd9Sstevel@tonic-gate } 12307c478bd9Sstevel@tonic-gate 12317c478bd9Sstevel@tonic-gate static void 12327c478bd9Sstevel@tonic-gate dcmd_Groups_help(void) 12337c478bd9Sstevel@tonic-gate { 12347c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_GROUPS_HELP)); 12357c478bd9Sstevel@tonic-gate } 12367c478bd9Sstevel@tonic-gate 12377c478bd9Sstevel@tonic-gate 12387c478bd9Sstevel@tonic-gate static int 12397c478bd9Sstevel@tonic-gate dcmd_Groups(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) 12407c478bd9Sstevel@tonic-gate { 12417c478bd9Sstevel@tonic-gate Rt_map rtmap; 12427c478bd9Sstevel@tonic-gate char *str; 1243cce0e03bSab196087 APlist apl; 12447c478bd9Sstevel@tonic-gate uint_t flg = 0; 124557ef7aa9SRod Evans uintptr_t datap, nitems; 12467c478bd9Sstevel@tonic-gate Grp_hdl *ghp; 12477c478bd9Sstevel@tonic-gate 12487c478bd9Sstevel@tonic-gate /* 12497c478bd9Sstevel@tonic-gate * Insure we have a valid address, and provide for a -v option. 12507c478bd9Sstevel@tonic-gate */ 12517c478bd9Sstevel@tonic-gate if ((flags & DCMD_ADDRSPEC) == 0) { 12527c478bd9Sstevel@tonic-gate mdb_warn(MSG_ORIG(MSG_ERR_NAS), MSG_ORIG(MSG_GROUPS_STR)); 12537c478bd9Sstevel@tonic-gate return (DCMD_USAGE); 12547c478bd9Sstevel@tonic-gate } 12557c478bd9Sstevel@tonic-gate if (mdb_getopts(argc, argv, 'v', MDB_OPT_SETBITS, RTLD_FLG_VERBOSE, 12567c478bd9Sstevel@tonic-gate &flg, NULL) != argc) 12577c478bd9Sstevel@tonic-gate return (DCMD_USAGE); 12587c478bd9Sstevel@tonic-gate 12597c478bd9Sstevel@tonic-gate /* 12607c478bd9Sstevel@tonic-gate * Read the Rt_map contents. 12617c478bd9Sstevel@tonic-gate */ 12627c478bd9Sstevel@tonic-gate if (mdb_vread(&rtmap, sizeof (Rt_map), addr) == -1) { 12637c478bd9Sstevel@tonic-gate mdb_warn(MSG_ORIG(MSG_ERR_READ), MSG_ORIG(MSG_RTMAP_STR), addr); 12647c478bd9Sstevel@tonic-gate return (DCMD_ERR); 12657c478bd9Sstevel@tonic-gate } 12667c478bd9Sstevel@tonic-gate if ((str = String((uintptr_t)NAME(&rtmap), 12677c478bd9Sstevel@tonic-gate MSG_ORIG(MSG_STR_NAME))) == 0) 12687c478bd9Sstevel@tonic-gate return (DCMD_ERR); 12697c478bd9Sstevel@tonic-gate 12707c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_GROUPS_LINE1), str); 12717c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_STR_DASHES)); 12727c478bd9Sstevel@tonic-gate 12737c478bd9Sstevel@tonic-gate if (GROUPS(&rtmap) == 0) 12747c478bd9Sstevel@tonic-gate return (DCMD_OK); 12757c478bd9Sstevel@tonic-gate 12767c478bd9Sstevel@tonic-gate addr = (uintptr_t)GROUPS(&rtmap); 1277cce0e03bSab196087 if (mdb_vread(&apl, sizeof (APlist), addr) == -1) { 1278cce0e03bSab196087 mdb_warn(MSG_ORIG(MSG_ERR_READ), MSG_ORIG(MSG_STR_APLIST), 1279cce0e03bSab196087 addr); 12807c478bd9Sstevel@tonic-gate return (DCMD_ERR); 12817c478bd9Sstevel@tonic-gate } 12827c478bd9Sstevel@tonic-gate 1283cce0e03bSab196087 mdb_printf(MSG_ORIG(MSG_GROUPS_LINE2), addr, (size_t)apl.apl_nitems, 1284cce0e03bSab196087 (size_t)apl.apl_arritems); 12857c478bd9Sstevel@tonic-gate 1286cce0e03bSab196087 if (((flg & RTLD_FLG_VERBOSE) == 0) || (apl.apl_nitems == 0)) 12877c478bd9Sstevel@tonic-gate return (DCMD_OK); 12887c478bd9Sstevel@tonic-gate 12897c478bd9Sstevel@tonic-gate /* 1290cce0e03bSab196087 * Under verbose mode print the name of each dependency. An APlist can 12917c478bd9Sstevel@tonic-gate * have a variable number of data items, so read each individual entry. 12927c478bd9Sstevel@tonic-gate */ 129357ef7aa9SRod Evans datap = addr + APLIST_OFF_DATA; 129457ef7aa9SRod Evans if (mdb_vread(&ghp, sizeof (Grp_hdl *), datap) == -1) { 12957c478bd9Sstevel@tonic-gate mdb_warn(MSG_ORIG(MSG_ERR_READ), 129657ef7aa9SRod Evans MSG_ORIG(MSG_GRPHDL_STR), datap); 12977c478bd9Sstevel@tonic-gate return (DCMD_ERR); 12987c478bd9Sstevel@tonic-gate } 12997c478bd9Sstevel@tonic-gate 130080148899SSurya Prakki (void) mdb_inc_indent(4); 13017c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_STR_DASHES)); 13027c478bd9Sstevel@tonic-gate 13037c478bd9Sstevel@tonic-gate if (dcmd_GrpHdl((uintptr_t)ghp, flags, argc, argv) == DCMD_ERR) { 130480148899SSurya Prakki (void) mdb_dec_indent(4); 13057c478bd9Sstevel@tonic-gate return (DCMD_ERR); 13067c478bd9Sstevel@tonic-gate } 13077c478bd9Sstevel@tonic-gate 130857ef7aa9SRod Evans for (nitems = 1; nitems < apl.apl_nitems; nitems++) { 130957ef7aa9SRod Evans datap += sizeof (void *); 131057ef7aa9SRod Evans if (mdb_vread(&ghp, sizeof (Grp_hdl *), datap) == -1) { 13117c478bd9Sstevel@tonic-gate mdb_warn(MSG_ORIG(MSG_ERR_READ), 131257ef7aa9SRod Evans MSG_ORIG(MSG_GRPHDL_STR), datap); 13137c478bd9Sstevel@tonic-gate return (DCMD_ERR); 13147c478bd9Sstevel@tonic-gate } 13157c478bd9Sstevel@tonic-gate 13167c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_STR_DASHES)); 13177c478bd9Sstevel@tonic-gate if (dcmd_GrpHdl((uintptr_t)ghp, flags, argc, 13187c478bd9Sstevel@tonic-gate argv) == DCMD_ERR) { 131980148899SSurya Prakki (void) mdb_dec_indent(4); 13207c478bd9Sstevel@tonic-gate return (DCMD_ERR); 13217c478bd9Sstevel@tonic-gate } 13227c478bd9Sstevel@tonic-gate } 132380148899SSurya Prakki (void) mdb_dec_indent(4); 13247c478bd9Sstevel@tonic-gate return (DCMD_OK); 13257c478bd9Sstevel@tonic-gate } 13267c478bd9Sstevel@tonic-gate static void 13277c478bd9Sstevel@tonic-gate dcmd_ElfDyn_help(void) 13287c478bd9Sstevel@tonic-gate { 13297c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_ELFDYN_HELP)); 13307c478bd9Sstevel@tonic-gate } 13317c478bd9Sstevel@tonic-gate 13327c478bd9Sstevel@tonic-gate static int 13337c478bd9Sstevel@tonic-gate /* ARGSUSED2 */ 13347c478bd9Sstevel@tonic-gate dcmd_ElfDyn(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) 13357c478bd9Sstevel@tonic-gate { 13367c478bd9Sstevel@tonic-gate Dyn dyn; 13377c478bd9Sstevel@tonic-gate const char *dynstr; 1338de777a60Sab196087 Conv_inv_buf_t inv_buf; 13397c478bd9Sstevel@tonic-gate 13407c478bd9Sstevel@tonic-gate if ((flags & DCMD_ADDRSPEC) == 0) 13417c478bd9Sstevel@tonic-gate return (DCMD_USAGE); 13427c478bd9Sstevel@tonic-gate if (mdb_vread(&dyn, sizeof (dyn), addr) == -1) { 13437c478bd9Sstevel@tonic-gate mdb_warn(MSG_ORIG(MSG_ERR_READ), MSG_ORIG(MSG_ELFDYN_STR), 13447c478bd9Sstevel@tonic-gate addr); 13457c478bd9Sstevel@tonic-gate return (DCMD_ERR); 13467c478bd9Sstevel@tonic-gate } 13477c478bd9Sstevel@tonic-gate 13487c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_ELFDYN_TITLE), addr); 13494f680cc6SAli Bahrami dynstr = conv_dyn_tag(dyn.d_tag, ELFOSABI_SOLARIS, M_MACH, 0, &inv_buf); 13507c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_ELFDYN_LINE1), addr, dynstr, dyn.d_un.d_ptr); 13517c478bd9Sstevel@tonic-gate 13527c478bd9Sstevel@tonic-gate mdb_set_dot(addr + sizeof (Dyn)); 13537c478bd9Sstevel@tonic-gate 13547c478bd9Sstevel@tonic-gate return (DCMD_OK); 13557c478bd9Sstevel@tonic-gate } 13567c478bd9Sstevel@tonic-gate 13577c478bd9Sstevel@tonic-gate static void 13587c478bd9Sstevel@tonic-gate dcmd_ElfEhdr_help(void) 13597c478bd9Sstevel@tonic-gate { 13607c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_EHDR_HELP)); 13617c478bd9Sstevel@tonic-gate } 13627c478bd9Sstevel@tonic-gate 13637c478bd9Sstevel@tonic-gate static int 13647c478bd9Sstevel@tonic-gate /* ARGSUSED2 */ 13657c478bd9Sstevel@tonic-gate dcmd_ElfEhdr(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) 13667c478bd9Sstevel@tonic-gate { 13677c478bd9Sstevel@tonic-gate Ehdr ehdr; 13687c478bd9Sstevel@tonic-gate Byte *byte; 13697c478bd9Sstevel@tonic-gate const char *flgs; 1370de777a60Sab196087 Conv_inv_buf_t inv_buf1, inv_buf2; 1371de777a60Sab196087 Conv_ehdr_flags_buf_t ehdr_flags_buf; 1372de777a60Sab196087 13737c478bd9Sstevel@tonic-gate 13747c478bd9Sstevel@tonic-gate if ((flags & DCMD_ADDRSPEC) == 0) 13757c478bd9Sstevel@tonic-gate return (DCMD_USAGE); 13767c478bd9Sstevel@tonic-gate 13777c478bd9Sstevel@tonic-gate if (mdb_vread(&ehdr, sizeof (ehdr), addr) == -1) { 13787c478bd9Sstevel@tonic-gate mdb_warn(MSG_ORIG(MSG_ERR_READ), MSG_ORIG(MSG_EHDR_STR), 13797c478bd9Sstevel@tonic-gate addr); 13807c478bd9Sstevel@tonic-gate return (DCMD_ERR); 13817c478bd9Sstevel@tonic-gate } 13827c478bd9Sstevel@tonic-gate 13837c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_EHDR_TITLE), addr); 13847c478bd9Sstevel@tonic-gate byte = &ehdr.e_ident[0]; 13857c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_EHDR_LINE1), byte[EI_MAG0], 13867c478bd9Sstevel@tonic-gate (byte[EI_MAG1] ? byte[EI_MAG1] : '0'), 13877c478bd9Sstevel@tonic-gate (byte[EI_MAG2] ? byte[EI_MAG2] : '0'), 13887c478bd9Sstevel@tonic-gate (byte[EI_MAG3] ? byte[EI_MAG3] : '0')); 13897c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_EHDR_LINE2), 1390de777a60Sab196087 conv_ehdr_class(ehdr.e_ident[EI_CLASS], 0, &inv_buf1), 1391de777a60Sab196087 conv_ehdr_data(ehdr.e_ident[EI_DATA], 0, &inv_buf2)); 13927c478bd9Sstevel@tonic-gate 13937c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_EHDR_LINE3), 1394de777a60Sab196087 conv_ehdr_mach(ehdr.e_machine, 0, &inv_buf1), 1395de777a60Sab196087 conv_ehdr_vers(ehdr.e_version, 0, &inv_buf2)); 1396de777a60Sab196087 mdb_printf(MSG_ORIG(MSG_EHDR_LINE4), 13974f680cc6SAli Bahrami conv_ehdr_type(ehdr.e_ident[EI_OSABI], ehdr.e_type, 0, &inv_buf1)); 13987c478bd9Sstevel@tonic-gate 13997c478bd9Sstevel@tonic-gate /* 1400c13de8f6Sab196087 * Line up the flags differently depending on whether we 1401c13de8f6Sab196087 * received a numeric (e.g. "0x200") or text representation 1402c13de8f6Sab196087 * (e.g. "[ EF_SPARC_SUN_US1 ]"). 14037c478bd9Sstevel@tonic-gate */ 1404d29b2c44Sab196087 flgs = conv_ehdr_flags(ehdr.e_machine, ehdr.e_flags, 1405d29b2c44Sab196087 0, &ehdr_flags_buf); 14067c478bd9Sstevel@tonic-gate if (flgs[0] == '[') 14077c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_EHDR_LINE5), flgs); 14087c478bd9Sstevel@tonic-gate else 14097c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_EHDR_LINE6), flgs); 14107c478bd9Sstevel@tonic-gate 14117c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_EHDR_LINE7), ehdr.e_entry, ehdr.e_ehsize, 14127c478bd9Sstevel@tonic-gate ehdr.e_shstrndx); 14137c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_EHDR_LINE8), ehdr.e_shoff, ehdr.e_shentsize, 14147c478bd9Sstevel@tonic-gate ehdr.e_shnum); 14157c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_EHDR_LINE9), ehdr.e_phoff, ehdr.e_phentsize, 14167c478bd9Sstevel@tonic-gate ehdr.e_phnum); 14177c478bd9Sstevel@tonic-gate 14187c478bd9Sstevel@tonic-gate mdb_set_dot(addr + sizeof (Ehdr)); 14197c478bd9Sstevel@tonic-gate 14207c478bd9Sstevel@tonic-gate return (DCMD_OK); 14217c478bd9Sstevel@tonic-gate } 14227c478bd9Sstevel@tonic-gate 14237c478bd9Sstevel@tonic-gate static void 14247c478bd9Sstevel@tonic-gate dcmd_ElfPhdr_help(void) 14257c478bd9Sstevel@tonic-gate { 14267c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_EPHDR_HELP)); 14277c478bd9Sstevel@tonic-gate } 14287c478bd9Sstevel@tonic-gate 14297c478bd9Sstevel@tonic-gate static int 14307c478bd9Sstevel@tonic-gate /* ARGSUSED2 */ 14317c478bd9Sstevel@tonic-gate dcmd_ElfPhdr(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) 14327c478bd9Sstevel@tonic-gate { 14337c478bd9Sstevel@tonic-gate Phdr phdr; 1434de777a60Sab196087 Conv_inv_buf_t inv_buf; 1435de777a60Sab196087 Conv_phdr_flags_buf_t phdr_flags_buf; 14367c478bd9Sstevel@tonic-gate 14377c478bd9Sstevel@tonic-gate if ((flags & DCMD_ADDRSPEC) == 0) 14387c478bd9Sstevel@tonic-gate return (DCMD_USAGE); 14397c478bd9Sstevel@tonic-gate 14407c478bd9Sstevel@tonic-gate if (mdb_vread(&phdr, sizeof (phdr), addr) == -1) { 14417c478bd9Sstevel@tonic-gate mdb_warn(MSG_ORIG(MSG_ERR_READ), MSG_ORIG(MSG_EPHDR_STR), 14427c478bd9Sstevel@tonic-gate addr); 14437c478bd9Sstevel@tonic-gate return (DCMD_ERR); 14447c478bd9Sstevel@tonic-gate } 14457c478bd9Sstevel@tonic-gate 14467c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_EPHDR_TITLE), addr); 14477c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_EPHDR_LINE1), phdr.p_vaddr, 14484f680cc6SAli Bahrami conv_phdr_flags(ELFOSABI_SOLARIS, phdr.p_flags, 0, 14494f680cc6SAli Bahrami &phdr_flags_buf)); 14507c478bd9Sstevel@tonic-gate mdb_printf(MSG_ORIG(MSG_EPHDR_LINE2), phdr.p_paddr, 14514f680cc6SAli Bahrami conv_phdr_type(ELFOSABI_SOLARIS, M_MACH, phdr.p_type, 0, &inv_buf)); 14525aefb655Srie mdb_printf(MSG_ORIG(MSG_EPHDR_LINE3), phdr.p_filesz, phdr.p_memsz); 14535aefb655Srie mdb_printf(MSG_ORIG(MSG_EPHDR_LINE4), phdr.p_offset, phdr.p_align); 14547c478bd9Sstevel@tonic-gate 14557c478bd9Sstevel@tonic-gate mdb_set_dot(addr + sizeof (Phdr)); 14567c478bd9Sstevel@tonic-gate 14577c478bd9Sstevel@tonic-gate return (DCMD_OK); 14587c478bd9Sstevel@tonic-gate } 14597c478bd9Sstevel@tonic-gate 14607c478bd9Sstevel@tonic-gate 14617c478bd9Sstevel@tonic-gate static const mdb_dcmd_t dcmds[] = { 14627c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_BND_STR), MSG_ORIG(MSG_USG_ADDREQ_V), 14637c478bd9Sstevel@tonic-gate MSG_ORIG(MSG_BND_DCD), 14647c478bd9Sstevel@tonic-gate dcmd_Bind, dcmd_Bind_help}, 14657c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_DEPENDS_STR), MSG_ORIG(MSG_USG_ADDREQ_V), 14667c478bd9Sstevel@tonic-gate MSG_ORIG(MSG_DEPENDS_DCD), 14677c478bd9Sstevel@tonic-gate dcmd_Depends, dcmd_Depends_help}, 14687c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_CALLERS_STR), MSG_ORIG(MSG_USG_ADDREQ_V), 14697c478bd9Sstevel@tonic-gate MSG_ORIG(MSG_CALLERS_DCD), 14707c478bd9Sstevel@tonic-gate dcmd_Callers, dcmd_Callers_help}, 14717c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_GRPHDL_STR), MSG_ORIG(MSG_USG_ADDREQ_V), 14727c478bd9Sstevel@tonic-gate MSG_ORIG(MSG_GRPHDL_DCD), 14737c478bd9Sstevel@tonic-gate dcmd_GrpHdl, dcmd_GrpHdl_help}, 14747c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_GRPDESC_STR), MSG_ORIG(MSG_USG_ADDREQ_V), 14757c478bd9Sstevel@tonic-gate MSG_ORIG(MSG_GRPDESC_DCD), 14767c478bd9Sstevel@tonic-gate dcmd_GrpDesc, dcmd_GrpDesc_help}, 14777c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_HANDLES_STR), MSG_ORIG(MSG_USG_ADDREQ_V), 14787c478bd9Sstevel@tonic-gate MSG_ORIG(MSG_HANDLES_DCD), 14797c478bd9Sstevel@tonic-gate dcmd_Handles, dcmd_Handles_help}, 14807c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_GROUPS_STR), MSG_ORIG(MSG_USG_ADDREQ_V), 14817c478bd9Sstevel@tonic-gate MSG_ORIG(MSG_GROUPS_DCD), 14827c478bd9Sstevel@tonic-gate dcmd_Groups, dcmd_Groups_help}, 14837c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_ELFDYN_STR), MSG_ORIG(MSG_USG_ADDREQ), 14847c478bd9Sstevel@tonic-gate MSG_ORIG(MSG_ELFDYN_DCD), 14857c478bd9Sstevel@tonic-gate dcmd_ElfDyn, dcmd_ElfDyn_help}, 14867c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_EHDR_STR), MSG_ORIG(MSG_USG_ADDREQ), 14877c478bd9Sstevel@tonic-gate MSG_ORIG(MSG_EHDR_DCD), 14887c478bd9Sstevel@tonic-gate dcmd_ElfEhdr, dcmd_ElfEhdr_help}, 14897c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_EPHDR_STR), MSG_ORIG(MSG_USG_ADDREQ), 14907c478bd9Sstevel@tonic-gate MSG_ORIG(MSG_EPHDR_DCD), 14917c478bd9Sstevel@tonic-gate dcmd_ElfPhdr, dcmd_ElfPhdr_help}, 14927c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_LMLIST_STR), MSG_ORIG(MSG_USG_ADDREQ_V), 14937c478bd9Sstevel@tonic-gate MSG_ORIG(MSG_LMLIST_DCD), 14947c478bd9Sstevel@tonic-gate dcmd_Lm_list, dcmd_Lm_list_help}, 14957c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_RTMAPS_STR), MSG_ORIG(MSG_USG_ADDOPT_V), 14967c478bd9Sstevel@tonic-gate MSG_ORIG(MSG_RTMAPS_DCD), 14977c478bd9Sstevel@tonic-gate dcmd_Rtmaps, dcmd_Rtmaps_help}, 14987c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_RTMAP_STR), MSG_ORIG(MSG_USG_ADDREQ), 14997c478bd9Sstevel@tonic-gate MSG_ORIG(MSG_RTMAP_DCD), 15007c478bd9Sstevel@tonic-gate dcmd_rtmap, dcmd_rtmap_help}, 15017c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_SETENV_STR), MSG_ORIG(MSG_USG_SETENV), 15027c478bd9Sstevel@tonic-gate MSG_ORIG(MSG_SETENV_DCD), 15037c478bd9Sstevel@tonic-gate dcmd_Setenv, dcmd_Setenv_help}, 15047c478bd9Sstevel@tonic-gate { NULL } 15057c478bd9Sstevel@tonic-gate }; 15067c478bd9Sstevel@tonic-gate 15077c478bd9Sstevel@tonic-gate static const mdb_walker_t walkers[] = { 15087c478bd9Sstevel@tonic-gate { MSG_ORIG(MSG_RTMAPS_STR), MSG_ORIG(MSG_WWD_RTMAP), 15097c478bd9Sstevel@tonic-gate walk_rtmap_init, walk_rtmap_step, NULL, NULL }, 15107c478bd9Sstevel@tonic-gate { NULL } 15117c478bd9Sstevel@tonic-gate }; 15127c478bd9Sstevel@tonic-gate 15137c478bd9Sstevel@tonic-gate static const mdb_modinfo_t modinfo = { 15147c478bd9Sstevel@tonic-gate MDB_API_VERSION, dcmds, walkers 15157c478bd9Sstevel@tonic-gate }; 15167c478bd9Sstevel@tonic-gate 15177c478bd9Sstevel@tonic-gate const mdb_modinfo_t * 15187c478bd9Sstevel@tonic-gate _mdb_init(void) 15197c478bd9Sstevel@tonic-gate { 15207c478bd9Sstevel@tonic-gate return (&modinfo); 15217c478bd9Sstevel@tonic-gate } 1522