changeset 3892:55e05ad4374a

6448268 dis: 6427698 introduced a bunch of meaningless spew when disassembling .o files
author dmick
date Fri, 23 Mar 2007 19:23:04 -0700
parents e9a0c746d558
children 4115db3e65ea
files usr/src/cmd/dis/dis_main.c usr/src/cmd/mdb/common/mdb/mdb_disasm.c usr/src/common/dis/i386/dis_tables.c usr/src/common/dis/i386/dis_tables.h usr/src/lib/libdisasm/common/libdisasm.h usr/src/lib/libdisasm/common/mapfile-vers usr/src/lib/libdisasm/i386/dis_i386.c
diffstat 7 files changed, 57 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/usr/src/cmd/dis/dis_main.c	Fri Mar 23 11:17:31 2007 -0700
+++ b/usr/src/cmd/dis/dis_main.c	Fri Mar 23 19:23:04 2007 -0700
@@ -20,7 +20,7 @@
  */
 
 /*
- * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -514,6 +514,15 @@
 			    ehdr.e_machine);
 		}
 
+		/*
+		 * If ET_REL (.o), printing immediate symbols is likely to
+		 * result in garbage, as symbol lookups on unrelocated
+		 * immediates find false and useless matches.
+		 */
+
+		if (ehdr.e_type == ET_REL)
+			g_flags |= DIS_NOIMMSYM;
+
 		if (!g_quiet && dis_tgt_member(current) != NULL)
 			(void) printf("\narchive member %s\n",
 			    dis_tgt_member(current));
--- a/usr/src/cmd/mdb/common/mdb/mdb_disasm.c	Fri Mar 23 11:17:31 2007 -0700
+++ b/usr/src/cmd/mdb/common/mdb/mdb_disasm.c	Fri Mar 23 19:23:04 2007 -0700
@@ -19,7 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -308,6 +308,19 @@
 
 	dis_set_data(dhp, &db);
 
+	if (strcmp(mdb_tgt_name(t), "proc") == 0) {
+		/* check for ELF ET_REL type; turn on NOIMMSYM if so */
+
+		GElf_Ehdr 	leh;
+
+		if (mdb_tgt_getxdata(t, "ehdr", &leh, sizeof (leh)) != -1 &&
+		    leh.e_type == ET_REL)  {
+			dis_flags_set(dhp, DIS_NOIMMSYM);
+		} else {
+			dis_flags_clear(dhp, DIS_NOIMMSYM);
+		}
+	}
+
 	/*
 	 * Attempt to disassemble the instruction.  If this fails because of an
 	 * unknown opcode, drive on anyway.  If it fails because we couldn't
--- a/usr/src/common/dis/i386/dis_tables.c	Fri Mar 23 11:17:31 2007 -0700
+++ b/usr/src/common/dis/i386/dis_tables.c	Fri Mar 23 19:23:04 2007 -0700
@@ -19,7 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -3263,8 +3263,8 @@
 
 	lookup = dis->d86_sym_lookup;
 	if (tgt != 0) {
-		/* Print symbol, if found, for tgt */
-		if (lookup(dis->d86_data, tgt, NULL, 0) == 0) {
+		if ((dis->d86_flags & DIS_F_NOIMMSYM) == 0 &&
+		    lookup(dis->d86_data, tgt, NULL, 0) == 0) {
 			(void) strlcat(buf, "\t<", buflen);
 			curlen = strlen(buf);
 			lookup(dis->d86_data, tgt, buf + curlen,
--- a/usr/src/common/dis/i386/dis_tables.h	Fri Mar 23 11:17:31 2007 -0700
+++ b/usr/src/common/dis/i386/dis_tables.h	Fri Mar 23 19:23:04 2007 -0700
@@ -19,7 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -96,6 +96,7 @@
 extern int dtrace_disx86(dis86_t *x, uint_t cpu_mode);
 
 #define	DIS_F_OCTAL	0x1	/* Print all numbers in octal */
+#define	DIS_F_NOIMMSYM	0x2	/* Don't print symbols for immediates (.o) */
 
 #ifdef DIS_TEXT
 extern void dtrace_disx86_str(dis86_t *x, uint_t cpu_mode, uint64_t pc,
--- a/usr/src/lib/libdisasm/common/libdisasm.h	Fri Mar 23 11:17:31 2007 -0700
+++ b/usr/src/lib/libdisasm/common/libdisasm.h	Fri Mar 23 19:23:04 2007 -0700
@@ -20,7 +20,7 @@
  */
 
 /*
- * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -51,6 +51,7 @@
 
 /* generic disassembler flags */
 #define	DIS_OCTAL		0x40
+#define	DIS_NOIMMSYM		0x80
 
 typedef int (*dis_lookup_f)(void *, uint64_t, char *, size_t, uint64_t *,
     size_t *);
@@ -62,6 +63,8 @@
 extern int dis_disassemble(dis_handle_t *, uint64_t, char *, size_t);
 extern uint64_t dis_previnstr(dis_handle_t *, uint64_t, int n);
 extern void dis_set_data(dis_handle_t *, void *);
+extern void dis_flags_set(dis_handle_t *, int f);
+extern void dis_flags_clear(dis_handle_t *, int f);
 extern int dis_max_instrlen(dis_handle_t *);
 
 /* libdisasm errors */
--- a/usr/src/lib/libdisasm/common/mapfile-vers	Fri Mar 23 11:17:31 2007 -0700
+++ b/usr/src/lib/libdisasm/common/mapfile-vers	Fri Mar 23 19:23:04 2007 -0700
@@ -19,7 +19,7 @@
 # CDDL HEADER END
 #
 #
-# Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
+# Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
 # Use is subject to license terms.
 #
 # ident	"%Z%%M%	%I%	%E% SMI"
@@ -34,6 +34,8 @@
 	dis_max_instrlen;
 	dis_previnstr;
 	dis_set_data;
+	dis_flags_set;
+	dis_flags_clear;
 	dis_strerror;
     local:
 	*;
--- a/usr/src/lib/libdisasm/i386/dis_i386.c	Fri Mar 23 11:17:31 2007 -0700
+++ b/usr/src/lib/libdisasm/i386/dis_i386.c	Fri Mar 23 19:23:04 2007 -0700
@@ -20,7 +20,7 @@
  */
 
 /*
- * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -99,7 +99,7 @@
 	 * Validate architecture flags
 	 */
 	if (flags & ~(DIS_X86_SIZE16 | DIS_X86_SIZE32 | DIS_X86_SIZE64 |
-	    DIS_OCTAL)) {
+	    DIS_OCTAL | DIS_NOIMMSYM)) {
 		(void) dis_seterrno(E_DIS_INVALFLAG);
 		return (NULL);
 	}
@@ -145,6 +145,12 @@
 {
 	dhp->dh_addr = addr;
 
+	/* DIS_NOIMMSYM might not be set until now, so update */
+	if (dhp->dh_flags & DIS_NOIMMSYM)
+		dhp->dh_dis.d86_flags |= DIS_F_NOIMMSYM;
+	else
+		dhp->dh_dis.d86_flags &= ~DIS_F_NOIMMSYM;
+
 	if (dtrace_disx86(&dhp->dh_dis, dhp->dh_mode) != 0)
 		return (-1);
 
@@ -167,6 +173,19 @@
 	dhp->dh_data = data;
 }
 
+void
+dis_flags_set(dis_handle_t *dhp, int f)
+{
+	dhp->dh_flags |= f;
+}
+
+void
+dis_flags_clear(dis_handle_t *dhp, int f)
+{
+	dhp->dh_flags &= ~f;
+}
+
+
 /* ARGSUSED */
 int
 dis_max_instrlen(dis_handle_t *dhp)