Print this page
OS-3478 lx brand: mdb(1) can't load C++ demangler

Split Close
Expand all
Collapse all
          --- old/usr/src/cmd/mdb/common/mdb/mdb_demangle.c
          +++ new/usr/src/cmd/mdb/common/mdb/mdb_demangle.c
↓ open down ↓ 16 lines elided ↑ open up ↑
  17   17   * fields enclosed by brackets "[]" replaced with your own identifying
  18   18   * information: Portions Copyright [yyyy] [name of copyright owner]
  19   19   *
  20   20   * CDDL HEADER END
  21   21   */
  22   22  /*
  23   23   * Copyright 2001-2002 Sun Microsystems, Inc.  All rights reserved.
  24   24   * Use is subject to license terms.
  25   25   */
  26   26  
  27      -#pragma ident   "%Z%%M% %I%     %E% SMI"
       27 +/*
       28 + * Copyright (c) 2014, Joyent, Inc.  All rights reserved.
       29 + */
  28   30  
  29   31  #include <mdb/mdb_modapi.h>
  30   32  #include <mdb/mdb_demangle.h>
  31   33  #include <mdb/mdb_err.h>
  32   34  #include <mdb/mdb.h>
  33   35  
  34   36  #include <demangle.h>
  35   37  #include <strings.h>
  36   38  #include <unistd.h>
  37   39  #include <dlfcn.h>
↓ open down ↓ 218 lines elided ↑ open up ↑
 256  258                  return (name); /* return original name if not mangled */
 257  259  
 258  260          return (mdb_dem_filter(dmp, name));
 259  261  }
 260  262  
 261  263  /*ARGSUSED*/
 262  264  int
 263  265  cmd_demangle(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
 264  266  {
 265  267          mdb_demangler_t *dmp = mdb.m_demangler;
 266      -        const char *path = LIB_DEMANGLE;
      268 +        const char *path;
      269 +        char buf[MAXPATHLEN];
 267  270  
 268  271          if (argc > 1 || (argc > 0 && argv->a_type != MDB_TYPE_STRING))
 269  272                  return (DCMD_USAGE);
 270  273  
 271  274          if (argc > 0) {
 272  275                  if (dmp != NULL)
 273  276                          mdb_dem_unload(mdb.m_demangler);
 274  277                  path = argv->a_un.a_str;
      278 +        } else {
      279 +                (void) snprintf(buf, MAXPATHLEN,
      280 +                    "%s/%s", mdb.m_root, LIB_DEMANGLE);
      281 +                path = buf;
 275  282          }
 276  283  
 277  284          if (dmp != NULL && argc == 0 && !(mdb.m_flags & MDB_FL_DEMANGLE)) {
 278  285                  mdb_printf("C++ symbol demangling enabled\n");
 279  286                  mdb.m_flags |= MDB_FL_DEMANGLE;
 280  287  
 281  288          } else if (dmp == NULL || argc > 0) {
 282  289                  if ((mdb.m_demangler = mdb_dem_load(path)) != NULL) {
 283  290                          mdb_printf("C++ symbol demangling enabled\n");
 284  291                          mdb.m_flags |= MDB_FL_DEMANGLE;
↓ open down ↓ 68 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX