summaryrefslogtreecommitdiff
path: root/usr/src/cmd
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/cmd')
-rw-r--r--usr/src/cmd/dis/Makefile6
-rw-r--r--usr/src/cmd/dis/dis_util.c60
-rw-r--r--usr/src/cmd/fs.d/smbclnt/smbiod-svc/smbiod-svc.c4
-rw-r--r--usr/src/cmd/fs.d/smbclnt/smbutil/Makefile2
-rw-r--r--usr/src/cmd/fs.d/smbclnt/smbutil/common.h2
-rw-r--r--usr/src/cmd/fs.d/smbclnt/smbutil/discon.c110
-rw-r--r--usr/src/cmd/fs.d/smbclnt/smbutil/smbutil.c7
-rw-r--r--usr/src/cmd/fs.d/smbclnt/smbutil/view.c2
-rw-r--r--usr/src/cmd/mdb/Makefile.mdb2
-rw-r--r--usr/src/cmd/mdb/common/kmdb/kmdb_demangle.c6
-rw-r--r--usr/src/cmd/mdb/common/mdb/mdb_demangle.c135
-rw-r--r--usr/src/cmd/mdb/common/mdb/mdb_demangle.h11
-rw-r--r--usr/src/cmd/sgs/Makefile.com4
-rw-r--r--usr/src/cmd/sgs/dump/common/dump.c29
-rw-r--r--usr/src/cmd/sgs/gprof/common/printgprof.c99
-rw-r--r--usr/src/cmd/sgs/libconv/Makefile.com45
-rw-r--r--usr/src/cmd/sgs/libconv/common/demangle.c48
-rw-r--r--usr/src/cmd/sgs/libconv/common/demangle.msg6
-rw-r--r--usr/src/cmd/sgs/libconv/common/lintsup.c2
-rw-r--r--usr/src/cmd/sgs/liblddbg/common/util.c29
-rw-r--r--usr/src/cmd/sgs/nm/common/nm.c56
-rw-r--r--usr/src/cmd/sgs/prof/common/prof.c12
-rw-r--r--usr/src/cmd/sgs/prof/common/profv.c8
-rw-r--r--usr/src/cmd/sgs/rtld/sparc/Makefile2
-rw-r--r--usr/src/cmd/sgs/rtld/sparcv9/Makefile6
25 files changed, 401 insertions, 292 deletions
diff --git a/usr/src/cmd/dis/Makefile b/usr/src/cmd/dis/Makefile
index f17298c92b..c35932248f 100644
--- a/usr/src/cmd/dis/Makefile
+++ b/usr/src/cmd/dis/Makefile
@@ -22,14 +22,16 @@
# Copyright 2007 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
+# Copyright 2018 Jason King
+#
PROG= dis
OBJS= dis_target.o dis_main.o dis_util.o dis_list.o
SRCS= $(OBJS:%.o=%.c)
-include ../Makefile.cmd
+include ../Makefile.cmd
-LDLIBS += -ldisasm -luutil -lelf
+LDLIBS += -ldisasm -luutil -lelf -ldemangle-sys
CERRWARN += -_gcc=-Wno-uninitialized
.KEEP_STATE:
diff --git a/usr/src/cmd/dis/dis_util.c b/usr/src/cmd/dis/dis_util.c
index 816c41394c..f74e7cef67 100644
--- a/usr/src/cmd/dis/dis_util.c
+++ b/usr/src/cmd/dis/dis_util.c
@@ -22,15 +22,15 @@
/*
* Copyright 2006 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
+ *
+ * Copyright 2018 Jason King.
*/
-#pragma ident "%Z%%M% %I% %E% SMI"
-
#include <dlfcn.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
-#include <demangle.h>
+#include <demangle-sys.h>
#include "dis_util.h"
@@ -92,56 +92,20 @@ safe_malloc(size_t size)
/*
- * Generic interface to demangle C++ names. Calls cplus_demangle to do the
- * necessary translation. If the translation fails, the argument is returned
- * unchanged. The memory returned is only valid until the next call to
- * demangle().
- *
- * We dlopen() libdemangle.so rather than linking directly against it in case it
- * is not installed on the system.
+ * Since the -C flag explicitly says C++, for now at least, force language to
+ * C++
*/
const char *
dis_demangle(const char *name)
{
- static char *demangled_name;
- static int (*demangle_func)() = NULL;
- static int size = BUFSIZE;
- static int first_flag = 0;
- int ret;
+ static char *demangled_name = NULL;
/*
- * If this is the first call, allocate storage
- * for the buffer.
+ * Since demangled_name is static, it may be preserved across
+ * invocations. As such, make sure any memory that might be present
+ * from previous invocations is freed.
*/
- if (first_flag == 0) {
- void *demangle_hand;
-
- demangle_hand = dlopen("libdemangle.so.1", RTLD_LAZY);
- if (demangle_hand != NULL)
- demangle_func = (int (*)(int))dlsym(
- demangle_hand, "cplus_demangle");
-
- demangled_name = safe_malloc(size);
- first_flag = 1;
- }
-
- /*
- * If libdemangle is not present, pass through unchanged.
- */
- if (demangle_func == NULL)
- return (name);
-
- /*
- * The function returns -1 when the buffer size is not sufficient.
- */
- while ((ret = (*demangle_func)(name, demangled_name, size)) == -1) {
- free(demangled_name);
- size = size + BUFSIZE;
- demangled_name = safe_malloc(size);
- }
-
- if (ret != 0)
- return (name);
-
- return (demangled_name);
+ free(demangled_name);
+ demangled_name = sysdemangle(name, SYSDEM_LANG_CPP, NULL);
+ return ((demangled_name != NULL) ? demangled_name : name);
}
diff --git a/usr/src/cmd/fs.d/smbclnt/smbiod-svc/smbiod-svc.c b/usr/src/cmd/fs.d/smbclnt/smbiod-svc/smbiod-svc.c
index d99e04ba8d..23c0e4d1a0 100644
--- a/usr/src/cmd/fs.d/smbclnt/smbiod-svc/smbiod-svc.c
+++ b/usr/src/cmd/fs.d/smbclnt/smbiod-svc/smbiod-svc.c
@@ -560,14 +560,14 @@ child_gone(uid_t uid, pid_t pid, int status)
x = WEXITSTATUS(status);
if (x != 0) {
fprintf(stderr,
- "uid %d, pid %d exit %d",
+ "uid %d, pid %d exit %d\n",
uid, (int)pid, x);
}
}
if (WIFSIGNALED(status)) {
x = WTERMSIG(status);
fprintf(stderr,
- "uid %d, pid %d signal %d",
+ "uid %d, pid %d signal %d\n",
uid, (int)pid, x);
}
}
diff --git a/usr/src/cmd/fs.d/smbclnt/smbutil/Makefile b/usr/src/cmd/fs.d/smbclnt/smbutil/Makefile
index e20054c772..f15dcc8f67 100644
--- a/usr/src/cmd/fs.d/smbclnt/smbutil/Makefile
+++ b/usr/src/cmd/fs.d/smbclnt/smbutil/Makefile
@@ -32,7 +32,7 @@
PROG= smbutil
-OBJS= smbutil.o info.o login.o lookup.o print.o status.o view.o \
+OBJS= smbutil.o discon.o info.o login.o lookup.o print.o status.o view.o \
shares_rap.o shares_rpc.o srvsvc1_clnt.o srvsvc1_ndr.o
SRCS= $(OBJS:%.o=%.c)
diff --git a/usr/src/cmd/fs.d/smbclnt/smbutil/common.h b/usr/src/cmd/fs.d/smbclnt/smbutil/common.h
index aea093c0ea..74a8011f35 100644
--- a/usr/src/cmd/fs.d/smbclnt/smbutil/common.h
+++ b/usr/src/cmd/fs.d/smbclnt/smbutil/common.h
@@ -45,6 +45,7 @@ extern "C" {
#include <stdlib.h>
int cmd_crypt(int argc, char *argv[]);
+int cmd_discon(int argc, char *argv[]);
int cmd_help(int argc, char *argv[]);
int cmd_info(int argc, char *argv[]);
int cmd_login(int argc, char *argv[]);
@@ -56,6 +57,7 @@ int cmd_status(int argc, char *argv[]);
int cmd_view(int argc, char *argv[]);
void crypt_usage(void);
+void discon_usage(void);
void help_usage(void);
void info_usage(void);
void login_usage(void);
diff --git a/usr/src/cmd/fs.d/smbclnt/smbutil/discon.c b/usr/src/cmd/fs.d/smbclnt/smbutil/discon.c
new file mode 100644
index 0000000000..84b94a0332
--- /dev/null
+++ b/usr/src/cmd/fs.d/smbclnt/smbutil/discon.c
@@ -0,0 +1,110 @@
+/*
+ * This file and its contents are supplied under the terms of the
+ * Common Development and Distribution License ("CDDL"), version 1.0.
+ * You may only use this file in accordance with the terms of version
+ * 1.0 of the CDDL.
+ *
+ * A full copy of the text of the CDDL should have accompanied this
+ * source. A copy of the CDDL is also available via the Internet at
+ * http://www.illumos.org/license/CDDL.
+ */
+
+/*
+ * Copyright 2018 Nexenta Systems, Inc. All rights reserved.
+ */
+
+/*
+ * smbutil "discon" sub-command to disconnect a session
+ * (mostly for usr/src/test/smbclient-tests)
+ */
+
+#include <sys/types.h>
+#include <errno.h>
+#include <stdio.h>
+#include <err.h>
+#include <unistd.h>
+#include <strings.h>
+#include <stdlib.h>
+#include <sysexits.h>
+#include <libintl.h>
+
+#include <netsmb/smb.h>
+#include <netsmb/smb_lib.h>
+#include "common.h"
+
+void
+discon_usage(void)
+{
+ printf(gettext("usage: smbutil discon [connection options] "
+ "//[workgroup;][user@]server\n"));
+ exit(1);
+}
+
+int
+cmd_discon(int argc, char *argv[])
+{
+ struct smb_ctx *ctx;
+ int error, opt;
+
+ if (argc < 2)
+ discon_usage();
+
+ error = smb_ctx_alloc(&ctx);
+ if (error != 0)
+ return (error);
+
+ error = smb_ctx_scan_argv(ctx, argc, argv,
+ SMBL_SERVER, SMBL_SERVER, USE_WILDCARD);
+ if (error != 0)
+ goto out;
+
+ error = smb_ctx_readrc(ctx);
+ if (error != 0)
+ goto out;
+
+ while ((opt = getopt(argc, argv, STDPARAM_OPT)) != EOF) {
+ if (opt == '?')
+ discon_usage();
+ error = smb_ctx_opt(ctx, opt, optarg);
+ if (error != 0)
+ goto out;
+ }
+
+ /*
+ * Resolve the server address,
+ * setup derived defaults.
+ */
+ error = smb_ctx_resolve(ctx);
+ if (error != 0)
+ goto out;
+
+ /*
+ * Have server, user, etc. from above:
+ * smb_ctx_scan_argv, option settings.
+ *
+ * Lookup a session without creating.
+ * (First part of smb_ctx_get_ssn)
+ * If we find the session, kill it.
+ */
+ error = smb_ctx_findvc(ctx);
+ if (error == ENOENT) {
+ /* Already gone. We're done. */
+ if (smb_debug)
+ fprintf(stderr, "session not found\n");
+ error = 0;
+ goto out;
+ }
+ if (error == 0) {
+ /* Found session. Kill it. */
+ error = smb_ctx_kill(ctx);
+ }
+
+ if (error != 0) {
+ smb_error(gettext("//%s: discon failed"),
+ error, ctx->ct_fullserver);
+ }
+
+out:
+ smb_ctx_free(ctx);
+ return (error);
+}
diff --git a/usr/src/cmd/fs.d/smbclnt/smbutil/smbutil.c b/usr/src/cmd/fs.d/smbclnt/smbutil/smbutil.c
index 9b09b87d64..aa10f999ee 100644
--- a/usr/src/cmd/fs.d/smbclnt/smbutil/smbutil.c
+++ b/usr/src/cmd/fs.d/smbclnt/smbutil/smbutil.c
@@ -70,6 +70,7 @@ static struct commands {
int flags;
} commands[] = {
{"crypt", cmd_crypt, NULL, CMDFL_NO_KMOD},
+ {"discon", cmd_discon, discon_usage, 0},
{"help", cmd_help, help_usage, CMDFL_NO_KMOD},
{"info", cmd_info, info_usage, 0},
{"login", cmd_login, login_usage, 0},
@@ -184,7 +185,8 @@ main(int argc, char *argv[])
}
static void
-help(void) {
+help(void)
+{
printf("\n");
printf(gettext("usage: %s [-hv] subcommand [args]\n"), __progname);
printf(gettext("where subcommands are:\n"
@@ -204,7 +206,8 @@ help(void) {
}
void
-help_usage(void) {
+help_usage(void)
+{
printf(gettext("usage: smbutil help command\n"));
exit(1);
}
diff --git a/usr/src/cmd/fs.d/smbclnt/smbutil/view.c b/usr/src/cmd/fs.d/smbclnt/smbutil/view.c
index 8622fb14be..bf3397c166 100644
--- a/usr/src/cmd/fs.d/smbclnt/smbutil/view.c
+++ b/usr/src/cmd/fs.d/smbclnt/smbutil/view.c
@@ -146,7 +146,7 @@ again:
out:
smb_ctx_free(ctx);
- return (0);
+ return (error);
}
#ifdef I18N /* not defined, put here so xgettext(1) can find strings */
diff --git a/usr/src/cmd/mdb/Makefile.mdb b/usr/src/cmd/mdb/Makefile.mdb
index 852ce281ac..529f3a9a12 100644
--- a/usr/src/cmd/mdb/Makefile.mdb
+++ b/usr/src/cmd/mdb/Makefile.mdb
@@ -27,6 +27,7 @@
# Copyright 2011 Nexenta Systems, Inc. All rights reserved.
# Copyright (c) 2012 by Delphix. All rights reserved.
# Copyright (c) 2012 Joyent, Inc. All rights reserved.
+# Copyright 2018 Jason King
#
.KEEP_STATE:
@@ -99,6 +100,7 @@ CSTD= $(CSTD_GNU99)
C99LMODE= -Xc99=%all
LDLIBS += -lcurses -lkvm -lproc -lrtld_db -lctf -lumem -ldisasm -lscf
+LDLIBS += -ldemangle-sys
CERRWARN += -_gcc=-Wno-uninitialized
CERRWARN += -_gcc=-Wno-char-subscripts
diff --git a/usr/src/cmd/mdb/common/kmdb/kmdb_demangle.c b/usr/src/cmd/mdb/common/kmdb/kmdb_demangle.c
index efa73d023c..2027b2f186 100644
--- a/usr/src/cmd/mdb/common/kmdb/kmdb_demangle.c
+++ b/usr/src/cmd/mdb/common/kmdb/kmdb_demangle.c
@@ -22,17 +22,17 @@
/*
* Copyright 2004 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
+ *
+ * Copyright 2017 Jason King.
*/
-#pragma ident "%Z%%M% %I% %E% SMI"
-
#include <mdb/mdb_modapi.h>
#include <mdb/mdb_demangle.h>
#include <mdb/mdb_err.h>
/*ARGSUSED*/
mdb_demangler_t *
-mdb_dem_load(const char *path)
+mdb_dem_load(void)
{
(void) set_errno(ENOTSUP);
return (NULL);
diff --git a/usr/src/cmd/mdb/common/mdb/mdb_demangle.c b/usr/src/cmd/mdb/common/mdb/mdb_demangle.c
index 27c8a1d21d..ef986b0add 100644
--- a/usr/src/cmd/mdb/common/mdb/mdb_demangle.c
+++ b/usr/src/cmd/mdb/common/mdb/mdb_demangle.c
@@ -22,6 +22,8 @@
/*
* Copyright 2001-2002 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
+ *
+ * Copyright 2018 Jason King
*/
/*
@@ -33,46 +35,39 @@
#include <mdb/mdb_err.h>
#include <mdb/mdb.h>
-#include <demangle.h>
#include <strings.h>
#include <unistd.h>
#include <dlfcn.h>
#include <link.h>
-#ifdef _LP64
-static const char LIB_DEMANGLE[] = "/usr/lib/64/libdemangle.so.1";
-#else
-static const char LIB_DEMANGLE[] = "/usr/lib/libdemangle.so.1";
-#endif
-
-mdb_demangler_t *
-mdb_dem_load(const char *path)
+static void *
+mdb_dem_alloc(size_t len)
{
- mdb_demangler_t *dmp;
- void *hdl, *func;
+ return (mdb_alloc(len, UM_SLEEP));
+}
- if (access(path, F_OK) == -1)
- return (NULL);
+static void
+mdb_dem_free(void *p, size_t len)
+{
+ mdb_free(p, len);
+}
- if ((hdl = dlmopen(LM_ID_BASE, path, RTLD_LAZY | RTLD_LOCAL)) == NULL) {
- (void) set_errno(EMDB_RTLD);
- return (NULL);
- }
+static sysdem_ops_t mdb_dem_demops = {
+ .alloc = mdb_dem_alloc,
+ .free = mdb_dem_free
+};
- if ((func = dlsym(hdl, "cplus_demangle")) == NULL) {
- (void) dlclose(hdl);
- (void) set_errno(EMDB_NODEM);
- return (NULL);
- }
+mdb_demangler_t *
+mdb_dem_load(void)
+{
+ mdb_demangler_t *dmp;
dmp = mdb_alloc(sizeof (mdb_demangler_t), UM_SLEEP);
- (void) strncpy(dmp->dm_pathname, path, MAXPATHLEN);
- dmp->dm_pathname[MAXPATHLEN - 1] = '\0';
- dmp->dm_handle = hdl;
- dmp->dm_convert = (int (*)())func;
- dmp->dm_len = MDB_SYM_NAMLEN * 2;
- dmp->dm_buf = mdb_alloc(dmp->dm_len, UM_SLEEP);
+ dmp->dm_len = 0;
+ dmp->dm_buf = NULL;
dmp->dm_flags = MDB_DM_SCOPE;
+ /* stick with C++ for now to match old behavior */
+ dmp->dm_lang = SYSDEM_LANG_CPP;
return (dmp);
}
@@ -80,7 +75,6 @@ mdb_dem_load(const char *path)
void
mdb_dem_unload(mdb_demangler_t *dmp)
{
- (void) dlclose(dmp->dm_handle);
mdb_free(dmp->dm_buf, dmp->dm_len);
mdb_free(dmp, sizeof (mdb_demangler_t));
}
@@ -204,58 +198,65 @@ mdb_dem_filter(mdb_demangler_t *dmp, const char *name)
static int
mdb_dem_process(mdb_demangler_t *dmp, const char *name)
{
- char *buf = dmp->dm_buf;
- size_t len = dmp->dm_len;
+ char *res = NULL;
+ size_t reslen = 0;
char *prefix = strrchr(name, '`');
- size_t prefixlen;
+ size_t prefixlen = 0;
if (prefix) {
prefix++; /* the ` is part of the prefix */
prefixlen = prefix - name;
+ }
+
+ res = sysdemangle(name + prefixlen, dmp->dm_lang, &mdb_dem_demops);
+ if (res == NULL) {
+ if (errno != EINVAL)
+ mdb_warn("Error while demangling");
+ return (-1);
+ }
- if (prefixlen >= len)
- return (DEMANGLE_ESPACE);
+ reslen = (res != NULL) ? strlen(res) : 0;
+ reslen += prefixlen;
+ reslen += 1;
- (void) strncpy(buf, name, prefixlen);
+ if (reslen > dmp->dm_len) {
+ mdb_free(dmp->dm_buf, dmp->dm_len);
- /*
- * Fix up the arguments to dmp->dm_convert()
- */
- name += prefixlen;
- buf += prefixlen;
- len -= prefixlen;
+ dmp->dm_buf = mdb_zalloc(reslen, UM_SLEEP);
+ if (dmp->dm_buf == NULL) {
+ dmp->dm_len = 0;
+ mdb_warn("Unable to allocate memory for demangling");
+ return (-1);
+ }
+ dmp->dm_len = reslen;
+ }
+
+ if (prefixlen > 0)
+ (void) strlcpy(dmp->dm_buf, name, prefixlen + 1);
+ else
+ *dmp->dm_buf = '\0';
+
+ if (res != NULL) {
+ (void) strlcat(dmp->dm_buf, res, dmp->dm_len);
+ mdb_dem_free(res, strlen(res) + 1);
}
/*
* Save the position of the demangled string for mdb_dem_filter()
*/
- dmp->dm_dem = buf;
+ dmp->dm_dem = dmp->dm_buf + prefixlen;
- return (dmp->dm_convert(name, buf, len));
+ return (0);
}
+/* used by mdb_io.c:iob_addr2str */
const char *
mdb_dem_convert(mdb_demangler_t *dmp, const char *name)
{
- int err;
-
- while ((err = mdb_dem_process(dmp, name)) == DEMANGLE_ESPACE) {
- size_t len = dmp->dm_len * 2;
- char *buf = mdb_alloc(len, UM_NOSLEEP);
-
- if (buf == NULL) {
- mdb_warn("failed to allocate memory for demangling");
- return (name); /* just return original name */
- }
-
- mdb_free(dmp->dm_buf, dmp->dm_len);
- dmp->dm_buf = buf;
- dmp->dm_len = len;
- }
-
- if (err != 0 || strcmp(dmp->dm_buf, name) == 0)
- return (name); /* return original name if not mangled */
+ if (mdb_dem_process(dmp, name) != 0 ||
+ strcmp(dmp->dm_buf, name) == 0)
+ return (name);
return (mdb_dem_filter(dmp, name));
}
@@ -268,7 +269,7 @@ cmd_demangle(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
const char *path;
char buf[MAXPATHLEN];
- if (argc > 1 || (argc > 0 && argv->a_type != MDB_TYPE_STRING))
+ if (argc > 0)
return (DCMD_USAGE);
if (argc > 0) {
@@ -285,12 +286,12 @@ cmd_demangle(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
mdb_printf("C++ symbol demangling enabled\n");
mdb.m_flags |= MDB_FL_DEMANGLE;
- } else if (dmp == NULL || argc > 0) {
- if ((mdb.m_demangler = mdb_dem_load(path)) != NULL) {
+ } else if (dmp == NULL) {
+ if ((mdb.m_demangler = mdb_dem_load()) != NULL) {
mdb_printf("C++ symbol demangling enabled\n");
mdb.m_flags |= MDB_FL_DEMANGLE;
} else {
- mdb_warn("failed to load C++ demangler %s", path);
+ mdb_warn("no memory to load C++ demangler");
mdb.m_flags &= ~MDB_FL_DEMANGLE;
}
@@ -345,8 +346,8 @@ cmd_demstr(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
return (DCMD_USAGE);
if (mdb.m_demangler == NULL && (mdb.m_demangler =
- mdb_dem_load(LIB_DEMANGLE)) == NULL) {
- mdb_warn("failed to load C++ demangler %s", LIB_DEMANGLE);
+ mdb_dem_load()) == NULL) {
+ mdb_warn("failed to load demangler");
return (DCMD_ERR);
}
diff --git a/usr/src/cmd/mdb/common/mdb/mdb_demangle.h b/usr/src/cmd/mdb/common/mdb/mdb_demangle.h
index 7c9e99fd22..a92d64a349 100644
--- a/usr/src/cmd/mdb/common/mdb/mdb_demangle.h
+++ b/usr/src/cmd/mdb/common/mdb/mdb_demangle.h
@@ -22,13 +22,13 @@
/*
* Copyright 2001-2002 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
+ *
+ * Copyright 2018 Jason King.
*/
#ifndef _MDB_DEMANGLE_H
#define _MDB_DEMANGLE_H
-#pragma ident "%Z%%M% %I% %E% SMI"
-
#ifdef __cplusplus
extern "C" {
#endif
@@ -38,11 +38,10 @@ extern "C" {
#include <sys/types.h>
#include <sys/param.h>
#include <mdb/mdb_modapi.h>
+#include <demangle-sys.h>
typedef struct mdb_demangler {
- char dm_pathname[MAXPATHLEN]; /* pathname of demangling library */
- void *dm_handle; /* rtld handle to demangling library */
- int (*dm_convert)(const char *, char *, size_t); /* demangler */
+ sysdem_lang_t dm_lang; /* language to demangle */
char *dm_buf; /* demangling buffer */
size_t dm_len; /* size of dm_buf in bytes */
char *dm_dem; /* start of demangled string (in buf) */
@@ -55,7 +54,7 @@ typedef struct mdb_demangler {
#define MDB_DM_MANGLED 0x8 /* show mangled name */
#define MDB_DM_ALL 0xf /* mask of all valid flags */
-extern mdb_demangler_t *mdb_dem_load(const char *);
+extern mdb_demangler_t *mdb_dem_load(void);
extern void mdb_dem_unload(mdb_demangler_t *);
extern const char *mdb_dem_convert(mdb_demangler_t *, const char *);
diff --git a/usr/src/cmd/sgs/Makefile.com b/usr/src/cmd/sgs/Makefile.com
index 6964761a4e..9230fd96de 100644
--- a/usr/src/cmd/sgs/Makefile.com
+++ b/usr/src/cmd/sgs/Makefile.com
@@ -66,8 +66,8 @@ CPPFLAGS = -I. -I../common -I../../include -I../../include/$(MACH) \
$(CPPFLAGS.master) -I$(ELFCAP)
# PICS64 is unique to our environment
-$(PICS64) := sparc_CFLAGS += -xregs=no%appl -K pic
-$(PICS64) := sparcv9_CFLAGS += -xregs=no%appl -K pic
+$(PICS64) := sparc_CFLAGS += -xregs=no%appl $(C_PICFLAGS)
+$(PICS64) := sparcv9_CFLAGS += -xregs=no%appl $(C_PICFLAGS)
$(PICS64) := CPPFLAGS += -DPIC -D_REENTRANT
LDFLAGS += $(ZIGNORE)
diff --git a/usr/src/cmd/sgs/dump/common/dump.c b/usr/src/cmd/sgs/dump/common/dump.c
index 016f045dc1..10c10c5b19 100644
--- a/usr/src/cmd/sgs/dump/common/dump.c
+++ b/usr/src/cmd/sgs/dump/common/dump.c
@@ -24,6 +24,7 @@
* All Rights Reserved
*
* Copyright (c) 1989, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright 2018, Joyent, Inc.
*/
/* Get definitions for the relocation types supported. */
@@ -477,28 +478,32 @@ static char *
demangled_name(char *s)
{
static char *buf = NULL;
- const char *dn;
+ size_t buflen = 0;
+ char *dn;
size_t len;
- dn = conv_demangle_name(s);
+ dn = (char *)conv_demangle_name(s);
/*
* If not demangled, just return the symbol name
*/
- if (strcmp(s, dn) == 0)
+ if (dn == s)
return (s);
+ len = strlen(dn) + strlen(s) + 4;
+
+ if (buflen < len) {
+ free(buf);
+ if ((buf = malloc(len)) == NULL)
+ return (s);
+ buflen = len;
+ }
+
/*
* Demangled. Format it
*/
- if (buf != NULL)
- free(buf);
-
- len = strlen(dn) + strlen(s) + 4;
- if ((buf = malloc(len)) == NULL)
- return (s);
-
- (void) snprintf(buf, len, "%s\t[%s]", dn, s);
+ (void) snprintf(buf, buflen, "%s\t[%s]", dn, s);
+ free(dn);
return (buf);
}
@@ -526,7 +531,7 @@ print_symtab(Elf *elf_file, SCNTAB *p_symtab, Elf_Data *sym_data,
adj = 8;
while (range > 0) {
- char *sym_name = (char *)0;
+ char *sym_name = NULL;
int type, bind;
int specsec;
unsigned int shndx;
diff --git a/usr/src/cmd/sgs/gprof/common/printgprof.c b/usr/src/cmd/sgs/gprof/common/printgprof.c
index d02e9a3d9a..acabccaedd 100644
--- a/usr/src/cmd/sgs/gprof/common/printgprof.c
+++ b/usr/src/cmd/sgs/gprof/common/printgprof.c
@@ -22,10 +22,11 @@
/*
* Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
+ *
+ * Copyright 2018 Jason King
+ * Copyright 2018, Joyent, Inc.
*/
-#pragma ident "%Z%%M% %I% %E% SMI"
-
#include <ctype.h>
#include <string.h>
#include <sys/param.h>
@@ -34,7 +35,7 @@
#include "gprof.h"
void print_demangled_name(int, nltype *);
-void striped_name(char *, nltype **);
+static void stripped_name(char **, size_t *, nltype **);
extern long hz;
@@ -65,7 +66,7 @@ printprof(void)
nltype *np;
nltype **sortednlp;
int i, index;
- int print_count = number_funcs_toprint;
+ int print_count = number_funcs_toprint;
bool print_flag = TRUE;
mod_info_t *mi;
@@ -293,7 +294,7 @@ printgprof(nltype **timesortnlp)
{
int index;
nltype *parentp;
- int print_count = number_funcs_toprint;
+ int print_count = number_funcs_toprint;
bool count_flag = TRUE;
/*
@@ -500,10 +501,7 @@ printname(nltype *selfp)
c = demangled_name(selfp);
if (selfp->name != 0) {
- if (!Cflag)
- (void) printf("%s", selfp->name);
- else
- (void) printf("%s", c);
+ (void) printf("%s", c);
#ifdef DEBUG
if (debug & DFNDEBUG)
@@ -523,24 +521,26 @@ printname(nltype *selfp)
else
(void) printf(" (%d)", selfp->index);
}
+
+ if (c != selfp->name)
+ free((void *)c);
}
void
print_demangled_name(int n, nltype *selfp)
{
- char *c;
+ char *c = (char *)demangled_name(selfp);
int i;
- c = selfp->name;
-
- if (strcmp(c, demangled_name(selfp)) == 0)
+ if (c == selfp->name)
return;
- else {
- (void) printf("\n");
- for (i = 1; i < n; i++)
- (void) printf(" ");
- (void) printf("[%s]", selfp->name);
- }
+
+ (void) printf("\n");
+ for (i = 1; i < n; i++)
+ (void) printf(" ");
+ (void) printf("[%s]", selfp->name);
+
+ free(c);
}
void
@@ -862,8 +862,6 @@ printblurb(char *blurbname)
(void) fclose(blurbfile);
}
-char *s1, *s2;
-
static int
namecmp(const void *arg1, const void *arg2)
{
@@ -873,20 +871,50 @@ namecmp(const void *arg1, const void *arg2)
if (!Cflag)
return (strcmp((*npp1)->name, (*npp2)->name));
else {
- striped_name(s1, npp1);
- striped_name(s2, npp2);
+ static char *s1 = NULL, *s2 = NULL;
+ static size_t s1len = 0, s2len = 0;
+
+ stripped_name(&s1, &s1len, npp1);
+ stripped_name(&s2, &s2len, npp2);
return (strcmp(s1, s2));
}
}
-void
-striped_name(char *s, nltype **npp)
+#define NAME_CHUNK 512
+#define ROUNDLEN(x) (((x) + NAME_CHUNK - 1) / NAME_CHUNK * NAME_CHUNK)
+static void
+adjust_size(char **pp, size_t *lenp, const char *name)
{
- const char *d;
+ void *newp;
+ size_t nlen = strlen(name);
+ size_t buflen;
+
+ if (*lenp > nlen) {
+ (void) memset(*pp, '\0', *lenp);
+ return;
+ }
+
+ buflen = ROUNDLEN(nlen + 1);
+ if ((newp = realloc(*pp, buflen)) == NULL) {
+ (void) fprintf(stderr,
+ "gprof: out of memory comparing names\n");
+ exit(EXIT_FAILURE);
+ }
+ (void) memset(newp, '\0', buflen);
+
+ *lenp = buflen;
+ *pp = newp;
+}
+
+static void
+stripped_name(char **sp, size_t *slenp, nltype **npp)
+{
+ const char *name, *d;
char *c;
- c = (char *)s;
- d = demangled_name(*npp);
+ name = d = demangled_name(*npp);
+ adjust_size(sp, slenp, name);
+ c = *sp;
while ((*d != '(') && (*d != '\0')) {
if (*d != ':')
@@ -895,6 +923,9 @@ striped_name(char *s, nltype **npp)
d++;
}
*c = '\0';
+
+ if ((*npp)->name != name)
+ free((void *)name);
}
/*
@@ -972,11 +1003,6 @@ printindex()
}
}
- if (Cflag) {
- s1 = malloc(500 * sizeof (char));
- s2 = malloc(500 * sizeof (char));
- }
-
qsort(namesortnlp, nnames, sizeof (nltype *), namecmp);
for (index = 1, todo = nnames; index <= ncycle; index++)
@@ -1038,13 +1064,16 @@ printindex()
if (does_clash(namesortnlp, i, nnames)) {
(void) printf("%6.6s %d:%s\n",
peterbuffer, nlp->module->id, d);
- } else
+ } else {
(void) printf("%6.6s %s\n", peterbuffer,
d);
+ }
- if (d != nlp->name)
+ if (d != nlp->name) {
(void) printf("%6.6s [%s]", "",
nlp->name);
+ free((void *)d);
+ }
} else {
(void) printf("%6.6s ", peterbuffer);
(void) sprintf(peterbuffer, "<cycle %d>",
diff --git a/usr/src/cmd/sgs/libconv/Makefile.com b/usr/src/cmd/sgs/libconv/Makefile.com
index d95213e586..c6287c433c 100644
--- a/usr/src/cmd/sgs/libconv/Makefile.com
+++ b/usr/src/cmd/sgs/libconv/Makefile.com
@@ -21,12 +21,13 @@
#
# Copyright (c) 1994, 2010, Oracle and/or its affiliates. All rights reserved.
+# Copyright 2018, Joyent, Inc.
#
LIBRARY = libconv.a
COMOBJS32 = cap_machelf32.o dynamic_machelf32.o \
- globals_machelf32.o sections_machelf32.o \
+ globals_machelf32.o sections_machelf32.o \
symbols_machelf32.o symbols_sparc_machelf32.o
COMOBJS64 = cap_machelf64.o dynamic_machelf64.o \
@@ -36,19 +37,19 @@ COMOBJS64 = cap_machelf64.o dynamic_machelf64.o \
COMOBJS= arch.o audit.o \
c_literal.o \
cap.o config.o \
- corenote.o data.o \
- deftag.o demangle.o \
+ corenote.o data.o \
+ deftag.o demangle.o \
dl.o dwarf.o \
- dwarf_ehe.o dynamic.o \
+ dwarf_ehe.o dynamic.o \
elf.o entry.o \
globals.o group.o \
- lddstub.o map.o \
+ lddstub.o map.o \
phdr.o relocate.o \
- relocate_i386.o relocate_amd64.o \
+ relocate_i386.o relocate_amd64.o \
relocate_sparc.o sections.o \
- segments.o strproc.o \
- symbols.o syminfo.o \
- tokens.o time.o \
+ segments.o strproc.o \
+ symbols.o syminfo.o \
+ tokens.o time.o \
version.o
ELFCAP_OBJS= elfcap.o
@@ -61,15 +62,15 @@ BLTOBJS= arch_msg.o audit_msg.o \
corenote_msg.o data_msg.o \
deftag_msg.o demangle_msg.o \
dl_msg.o dwarf_msg.o \
- dwarf_ehe_msg.o dynamic_msg.o \
- elf_msg.o entry_msg.o \
+ dwarf_ehe_msg.o dynamic_msg.o \
+ elf_msg.o entry_msg.o \
globals_msg.o group_msg.o \
- map_msg.o lddstub_msg.o \
- phdr_msg.o relocate_amd64_msg.o \
+ map_msg.o lddstub_msg.o \
+ phdr_msg.o relocate_amd64_msg.o \
relocate_i386_msg.o relocate_sparc_msg.o \
- sections_msg.o segments_msg.o \
- symbols_msg.o symbols_sparc_msg.o \
- syminfo_msg.o time_msg.o \
+ sections_msg.o segments_msg.o \
+ symbols_msg.o symbols_sparc_msg.o \
+ syminfo_msg.o time_msg.o \
version_msg.o
@@ -84,8 +85,8 @@ OBJECTS = $(COMOBJS) $(COMOBJS32) $(COMOBJS64) $(ELFCAP_OBJS) \
NOCTFOBJS = $(OBJECTS)
CTFMERGE_LIB = :
-include $(SRC)/lib/Makefile.lib
-include $(SRC)/cmd/sgs/Makefile.com
+include $(SRC)/lib/Makefile.lib
+include $(SRC)/cmd/sgs/Makefile.com
CERRWARN += -_gcc=-Wno-type-limits
CERRWARN += -_gcc=-Wno-switch
@@ -113,6 +114,14 @@ LINTSRCS= $(COMOBJS:%.o=../common/%.c) \
LINTSRCS32 = $(COMOBJS32:%32.o=../common/%.c)
LINTSRCS64 = $(COMOBJS64:%64.o=../common/%.c)
+# Since libconv uses dlopen(3C) to load libdemangle-sys.so (much like it did
+# for the old Sun Studio libdemangle.so) in order to avoid messy bootstrapping
+# problems, but it also needs the definitions from demangle-sys.h for
+# SYSDEM_LANG_AUTO, lint will complain about sysdemangle() being defined but not
+# used unless it is explicitly included during the lint pass
+$(LINTOUT32) := LDLIBS += -ldemangle-sys
+$(LINTOUT64) := LDLIBS += -ldemangle-sys
+
SGSMSGTARG= $(BLTOBJS:%_msg.o=../common/%.msg)
LINTFLAGS += -u
diff --git a/usr/src/cmd/sgs/libconv/common/demangle.c b/usr/src/cmd/sgs/libconv/common/demangle.c
index 8b590d87e0..eb2961ea3a 100644
--- a/usr/src/cmd/sgs/libconv/common/demangle.c
+++ b/usr/src/cmd/sgs/libconv/common/demangle.c
@@ -21,10 +21,11 @@
/*
* Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright 2018, Joyent, Inc.
*/
#include <stdio.h>
-#include <demangle.h>
+#include <demangle-sys.h>
#include "_conv.h"
#include "demangle_msg.h"
@@ -59,13 +60,11 @@
const char *
conv_demangle_name(const char *name)
{
- static char _str[SYM_MAX], *str = _str;
- static size_t size = SYM_MAX;
- static int again = 1;
- static int (*fptr)() = 0;
- int error;
+ static char *(*fptr)() = 0;
+ static volatile int loading = 0;
+ char *d;
- if (str == 0)
+ if (loading)
return (name);
/*
@@ -78,38 +77,15 @@ conv_demangle_name(const char *name)
if (fptr == 0) {
void *hdl;
- str = 0;
+ loading = 1;
if (!(hdl = dlopen(MSG_ORIG(MSG_DEM_LIB), RTLD_LAZY)) ||
- !(fptr = (int (*)())dlsym(hdl, MSG_ORIG(MSG_DEM_SYM))))
+ !(fptr = (char *(*)())dlsym(hdl, MSG_ORIG(MSG_DEM_SYM))))
return (name);
- str = _str;
+ loading = 0;
}
- if ((error = (*fptr)(name, str, size)) == 0)
- return ((const char *)str);
-
- while ((error == DEMANGLE_ESPACE) && again) {
- char *_str;
- size_t _size = size;
-
- /*
- * If we haven't allocated our maximum try incrementing the
- * present buffer size. Use malloc() rather than realloc() so
- * that we at least have the old buffer on failure.
- */
- if (((_size += SYM_MAX) > (SYM_MAX * 4)) ||
- ((_str = malloc(_size)) == 0)) {
- again = 0;
- break;
- }
- if (size != SYM_MAX) {
- free(str);
- }
- str = _str;
- size = _size;
+ if ((d = fptr(name, SYSDEM_LANG_AUTO, NULL)) == NULL)
+ return (name);
- if ((error = (*fptr)(name, str, size)) == 0)
- return ((const char *)str);
- }
- return (name);
+ return (d);
}
diff --git a/usr/src/cmd/sgs/libconv/common/demangle.msg b/usr/src/cmd/sgs/libconv/common/demangle.msg
index c7cbeaf921..4a69427057 100644
--- a/usr/src/cmd/sgs/libconv/common/demangle.msg
+++ b/usr/src/cmd/sgs/libconv/common/demangle.msg
@@ -23,8 +23,8 @@
# Copyright 2006 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
-# ident "%Z%%M% %I% %E% SMI"
+# Copyright 2018 Jason King
#
-@ MSG_DEM_SYM "cplus_demangle"
-@ MSG_DEM_LIB "libdemangle.so.1"
+@ MSG_DEM_SYM "sysdemangle"
+@ MSG_DEM_LIB "libdemangle-sys.so.1"
diff --git a/usr/src/cmd/sgs/libconv/common/lintsup.c b/usr/src/cmd/sgs/libconv/common/lintsup.c
index 4c0d6e4fdd..6f1dfc4125 100644
--- a/usr/src/cmd/sgs/libconv/common/lintsup.c
+++ b/usr/src/cmd/sgs/libconv/common/lintsup.c
@@ -21,6 +21,7 @@
/*
* Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright 2018, Joyent, Inc.
*/
/* LINTLIBRARY */
/* PROTOLIB1 */
@@ -39,7 +40,6 @@
#include <sys/auxv.h>
#include <libelf.h>
#include <link.h>
-#include <demangle.h>
#include <elfcap.h>
#include <dwarf.h>
#include "sgs.h"
diff --git a/usr/src/cmd/sgs/liblddbg/common/util.c b/usr/src/cmd/sgs/liblddbg/common/util.c
index 575a9bd15f..09bcd437e9 100644
--- a/usr/src/cmd/sgs/liblddbg/common/util.c
+++ b/usr/src/cmd/sgs/liblddbg/common/util.c
@@ -22,6 +22,8 @@
/*
* Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
+ *
+ * Copyright 2018 Jason King
*/
#include "msg.h"
@@ -342,16 +344,35 @@ Dbg_util_nl(Lm_list *lml, int flag)
const char *
Dbg_demangle_name(const char *name)
{
+ static char *buf = NULL;
+
if (DBG_NOTCLASS(DBG_C_DEMANGLE))
return (name);
- return (conv_demangle_name(name));
+ free(buf);
+ buf = (char *)conv_demangle_name(name);
+ if (buf == name) {
+ buf = NULL;
+ return (name);
+ }
+
+ return (buf);
}
const char *
Elf_demangle_name(const char *name)
{
- if (DBG_ISDEMANGLE())
- return (conv_demangle_name(name));
- return (name);
+ static char *buf = NULL;
+
+ if (!DBG_ISDEMANGLE())
+ return (name);
+
+ free(buf);
+ buf = (char *)conv_demangle_name(name);
+ if (buf == name) {
+ buf = NULL;
+ return (name);
+ }
+
+ return (buf);
}
diff --git a/usr/src/cmd/sgs/nm/common/nm.c b/usr/src/cmd/sgs/nm/common/nm.c
index 258bd9fd67..fc3ded721e 100644
--- a/usr/src/cmd/sgs/nm/common/nm.c
+++ b/usr/src/cmd/sgs/nm/common/nm.c
@@ -25,6 +25,7 @@
* All Rights Reserved
*
* Copyright (c) 1989, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright 2018 Jason King
*/
#include <stdio.h>
@@ -260,7 +261,7 @@ main(int argc, char *argv[], char *envp[])
"%s: -u or -e set, -g ignored\n"),
prog_name);
break;
- case 'r': if (R_flag) {
+ case 'r': if (R_flag) {
R_flag = 0;
(void) fprintf(stderr, gettext(
"%s: -r set, -R ignored\n"),
@@ -666,7 +667,7 @@ static void print_with_otherflags(int, Elf *, unsigned int,
*/
static void
print_symtab(Elf *elf_file, unsigned int shstrndx,
- Elf_Scn *p_sd, GElf_Shdr *shdr, char *filename)
+ Elf_Scn *p_sd, GElf_Shdr *shdr, char *filename)
{
Elf_Data * sd;
@@ -781,7 +782,7 @@ is_bss_section(unsigned int shndx, Elf * elf_file, unsigned int shstrndx)
*/
static SYM *
readsyms(Elf_Data * data, GElf_Sxword num, Elf *elf,
- unsigned int link, unsigned int symscnndx)
+ unsigned int link, unsigned int symscnndx)
{
SYM *s, *buf;
GElf_Sym sym;
@@ -805,15 +806,15 @@ readsyms(Elf_Data * data, GElf_Sxword num, Elf *elf,
if (sym.st_name == 0)
buf->name = "";
else if (C_flag) {
- const char *dn;
+ const char *dn = NULL;
char *name = (char *)elf_strptr(elf, link, sym.st_name);
+
dn = conv_demangle_name(name);
- if (strcmp(dn, name) == 0) { /* Not demangled */
- if (exotic(name)) {
- name = FormatName(name, d_buf);
- }
- } else { /* name demangled */
+ if (dn != name) {
name = FormatName(name, dn);
+ free((void *)dn);
+ } else if (exotic(name)) {
+ name = FormatName(name, d_buf);
}
buf->name = name;
}
@@ -1014,10 +1015,7 @@ is_sym_print(SYM *sym_data)
* -u flag specified
*/
static void
-print_with_uflag(
- SYM *sym_data,
- char *filename
-)
+print_with_uflag(SYM *sym_data, char *filename)
{
if ((sym_data->shndx == SHN_UNDEF) && (strlen(sym_data->name))) {
if (!r_flag) {
@@ -1094,18 +1092,13 @@ print_brief_sym_type(Elf *elf_file, unsigned int shstrndx, SYM *sym_data)
* -p flag specified
*/
static void
-print_with_pflag(
- int ndigits,
- Elf *elf_file,
- unsigned int shstrndx,
- SYM *sym_data,
- char *filename
-)
+print_with_pflag(int ndigits, Elf *elf_file, unsigned int shstrndx,
+ SYM *sym_data, char *filename)
{
const char * const fmt[] = {
- "%.*llu ", /* FMT_T_DEC */
- "0x%.*llx ", /* FMT_T_HEX */
- "0%.*llo " /* FMT_T_OCT */
+ "%.*llu ", /* FMT_T_DEC */
+ "0x%.*llx ", /* FMT_T_HEX */
+ "0%.*llo " /* FMT_T_OCT */
};
if (is_sym_print(sym_data) != 1)
@@ -1148,12 +1141,8 @@ print_with_pflag(
* -P flag specified
*/
static void
-print_with_Pflag(
- int ndigits,
- Elf *elf_file,
- unsigned int shstrndx,
- SYM *sym_data
-)
+print_with_Pflag(int ndigits, Elf *elf_file, unsigned int shstrndx,
+ SYM *sym_data)
{
#define SYM_LEN 10
char sym_name[SYM_LEN+1];
@@ -1200,13 +1189,8 @@ print_with_Pflag(
* other flags specified
*/
static void
-print_with_otherflags(
- int ndigits,
- Elf *elf_file,
- unsigned int shstrndx,
- SYM *sym_data,
- char *filename
-)
+print_with_otherflags(int ndigits, Elf *elf_file, unsigned int shstrndx,
+ SYM *sym_data, char *filename)
{
const char * const fmt_value_size[] = {
"%*llu|%*lld|", /* FMT_T_DEC */
diff --git a/usr/src/cmd/sgs/prof/common/prof.c b/usr/src/cmd/sgs/prof/common/prof.c
index 38a0aa0a9f..4b6086040c 100644
--- a/usr/src/cmd/sgs/prof/common/prof.c
+++ b/usr/src/cmd/sgs/prof/common/prof.c
@@ -22,6 +22,7 @@
/*
* Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
+ * Copyright 2018 Jason King
*/
/* Copyright (c) 1988 AT&T */
@@ -32,7 +33,7 @@
*
* Usage:
*
- * prof [-ChsVz] [-a | c | n | t] [-o | x] [-g | l]
+ * prof [-ChsVz] [-a | c | n | t] [-o | x] [-g | l]
* [-m mdata] [prog]
*
* Where "prog" is the program that was profiled; "a.out" by default.
@@ -136,7 +137,7 @@ char *aformat = "%8o ";
int gflag = 0; /* replaces gmatch and gmask */
int Cflag = 0;
-PROF_FILE *ldptr; /* For program ("a.out") file. */
+PROF_FILE *ldptr; /* For program ("a.out") file. */
FILE *mon_iop; /* For profile (MON_OUT) file. */
char *sym_fn = "a.out"; /* Default program file name. */
@@ -197,7 +198,7 @@ struct snymEntry {
char *sym_addr; /* address which has a synonym */
int howMany; /* # of synonyms for this symbol */
int snymReported; /* 'was printed in a report line already' */
- /* flag, */
+ /* flag, */
/* > 0 report line printed for these syns. */
/* == 0 not printed yet. */
long tot_sl_count; /* total subr calls for these snyms */
@@ -1311,9 +1312,7 @@ demangled_name(char *s)
const char *name;
size_t len;
- name = conv_demangle_name(s);
-
- if (strcmp(name, s) == 0)
+ if ((name = conv_demangle_name(s)) == s)
return (s);
if (format_buf != NULL)
@@ -1324,6 +1323,7 @@ demangled_name(char *s)
if (format_buf == NULL)
return (s);
(void) snprintf(format_buf, len, FORMAT_BUF, name, s);
+ free((void *)name);
return (format_buf);
}
diff --git a/usr/src/cmd/sgs/prof/common/profv.c b/usr/src/cmd/sgs/prof/common/profv.c
index 4f9b72596e..887b36bba5 100644
--- a/usr/src/cmd/sgs/prof/common/profv.c
+++ b/usr/src/cmd/sgs/prof/common/profv.c
@@ -22,10 +22,10 @@
/*
* Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
+ *
+ * Copyright 2018, Joyent, Inc.
*/
-#pragma ident "%Z%%M% %I% %E% SMI"
-
/*
* All routines in this file are for processing new-style, *versioned*
* mon.out format. Together with rdelf.c, lookup.c and profv.h, these
@@ -74,7 +74,8 @@ setup_demangled_names(void)
nbe = namebuf + namebuf_sz;
for (i = 0; i < total_funcs; i++) {
- if ((p = conv_demangle_name(profsym[i].name)) == NULL)
+ p = conv_demangle_name(profsym[i].name);
+ if (p == profsym[i].name)
continue;
namelen = strlen(p);
@@ -97,6 +98,7 @@ setup_demangled_names(void)
nbp += namelen + 1;
cur_len += namelen + 1;
+ free((void *)p);
}
}
diff --git a/usr/src/cmd/sgs/rtld/sparc/Makefile b/usr/src/cmd/sgs/rtld/sparc/Makefile
index d2630c52db..d3af26fc0b 100644
--- a/usr/src/cmd/sgs/rtld/sparc/Makefile
+++ b/usr/src/cmd/sgs/rtld/sparc/Makefile
@@ -68,7 +68,7 @@ include $(SRC)/cmd/sgs/rtld/Makefile.com
CPPFLAGS += -I../../../../uts/sparc/krtld -DA_OUT
CFLAGS += -xregs=no%appl
-ASFLAGS += -K pic
+ASFLAGS += $(AS_PICFLAGS)
LINTFLAGS += -DA_OUT
ADBGENCFLAGS += -erroff=%all
ADBGENFLAGS += -milp32
diff --git a/usr/src/cmd/sgs/rtld/sparcv9/Makefile b/usr/src/cmd/sgs/rtld/sparcv9/Makefile
index 0093a7b86e..d9863462a7 100644
--- a/usr/src/cmd/sgs/rtld/sparcv9/Makefile
+++ b/usr/src/cmd/sgs/rtld/sparcv9/Makefile
@@ -40,11 +40,11 @@ P_MACHOBJS= sparc_elf.o _setup.o
CP_MACHOBJS= common_sparc.o
-S_MACHOBJS=
+S_MACHOBJS=
P_ASOBJS= boot.o boot_elf.o caller.o
-S_ASOBJS=
+S_ASOBJS=
CRTSRCS= ../../../../lib/crt/sparc
CRTI= pics/crti.o
@@ -68,7 +68,7 @@ include $(SRC)/lib/Makefile.lib.64
CPPFLAGS += -I../../../../uts/sparc/krtld
CFLAGS += -xregs=no%appl
-ASFLAGS += -s -K pic -D__sparcv9 -D_ELF64 $(sparcv9_XARCH)
+ASFLAGS += -s $(AS_PICFLAGS) -D__sparcv9 -D_ELF64 $(sparcv9_XARCH)
ADBGENFLAGS += -mlp64
ADBGENCFLAGS += -erroff=%all
ADBSUB= $(ADBSUB64)