Mercurial > illumos > illumos-gate
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)