symbols.c revision 1976:f0691a145b7e
1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21
22/*
23 * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
24 * Use is subject to license terms.
25 */
26#pragma ident	"%Z%%M%	%I%	%E% SMI"
27
28/*
29 * String conversion routines for symbol attributes.
30 */
31#include	<stdio.h>
32#include	<sys/machelf.h>
33#include	<sys/elf_SPARC.h>
34#include	<sys/elf_amd64.h>
35#include	"_conv.h"
36#include	"symbols_msg.h"
37
38const char *
39conv_sym_other(uchar_t other)
40{
41	static char		string[CONV_INV_STRSIZE];
42	static const char	visibility[4] = {
43		'D',	/* STV_DEFAULT */
44		'I',	/* STV_INTERNAL */
45		'H',	/* STV_HIDDEN */
46		'P'	/* STV_PROTECTED */
47	};
48	uint_t		vis = ELF_ST_VISIBILITY(other);
49	uint_t		ndx = 0;
50
51	string[ndx++] = visibility[vis];
52
53	/*
54	 * If unkown bits are present in stother - throw out a '?'
55	 */
56	if (other & ~MSK_SYM_VISIBILITY)
57		string[ndx++] = '?';
58	string[ndx++] = '\0';
59
60	return (string);
61}
62
63const char *
64conv_sym_info_type(Half mach, uchar_t type, int fmt_flags)
65{
66	static char		string[CONV_INV_STRSIZE];
67	static const Msg	types[] = {
68		MSG_STT_NOTYPE,		MSG_STT_OBJECT,		MSG_STT_FUNC,
69		MSG_STT_SECTION,	MSG_STT_FILE,		MSG_STT_COMMON,
70		MSG_STT_TLS
71	};
72
73	if (type < STT_NUM) {
74		return (MSG_ORIG(types[type]));
75	} else if (((mach == EM_SPARC) || (mach == EM_SPARC32PLUS) ||
76	    (mach == EM_SPARCV9)) && (type == STT_SPARC_REGISTER)) {
77		return (MSG_ORIG(MSG_STT_REGISTER));
78	} else {
79		return (conv_invalid_val(string, CONV_INV_STRSIZE,
80			type, fmt_flags));
81	}
82}
83
84const char *
85conv_sym_info_bind(uchar_t bind, int fmt_flags)
86{
87	static char		string[CONV_INV_STRSIZE];
88	static const Msg	binds[] = {
89		MSG_STB_LOCAL,		MSG_STB_GLOBAL,		MSG_STB_WEAK
90	};
91
92	if (bind >= STB_NUM)
93		return (conv_invalid_val(string, CONV_INV_STRSIZE,
94			bind, fmt_flags));
95	else
96		return (MSG_ORIG(binds[bind]));
97}
98
99const char *
100conv_sym_shndx(Half shndx)
101{
102	static	char	string[CONV_INV_STRSIZE];
103
104	switch (shndx) {
105	case SHN_UNDEF:
106		return (MSG_ORIG(MSG_SHN_UNDEF));
107	case SHN_SUNW_IGNORE:
108		return (MSG_ORIG(MSG_SHN_SUNW_IGNORE));
109	case SHN_ABS:
110		return (MSG_ORIG(MSG_SHN_ABS));
111	case SHN_COMMON:
112		return (MSG_ORIG(MSG_SHN_COMMON));
113	case SHN_AMD64_LCOMMON:
114		return (MSG_ORIG(MSG_SHN_AMD64_LCOMMON));
115	case SHN_AFTER:
116		return (MSG_ORIG(MSG_SHN_AFTER));
117	case SHN_BEFORE:
118		return (MSG_ORIG(MSG_SHN_BEFORE));
119	case SHN_XINDEX:
120		return (MSG_ORIG(MSG_SHN_XINDEX));
121	default:
122		return (conv_invalid_val(string, CONV_INV_STRSIZE, shndx,
123		    CONV_FMT_DECIMAL));
124	}
125}
126
127const char *
128conv_sym_value(Half mach, uchar_t type, Addr value)
129{
130	static char	string[CONV_INV_STRSIZE];
131
132	if (((mach == EM_SPARC) || (mach == EM_SPARC32PLUS) ||
133	    (mach == EM_SPARCV9)) && (type == STT_SPARC_REGISTER))
134		return (conv_sym_SPARC_value(value, 0));
135
136	(void) sprintf(string, MSG_ORIG(MSG_SYM_FMT_VAL), EC_ADDR(value));
137	return (string);
138}
139