xref: /onnv-gate/usr/src/cmd/sgs/libconv/common/symbols.c (revision 9273:9a0603d78ad3)
10Sstevel@tonic-gate /*
20Sstevel@tonic-gate  * CDDL HEADER START
30Sstevel@tonic-gate  *
40Sstevel@tonic-gate  * The contents of this file are subject to the terms of the
51618Srie  * Common Development and Distribution License (the "License").
61618Srie  * You may not use this file except in compliance with the License.
70Sstevel@tonic-gate  *
80Sstevel@tonic-gate  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
90Sstevel@tonic-gate  * or http://www.opensolaris.org/os/licensing.
100Sstevel@tonic-gate  * See the License for the specific language governing permissions
110Sstevel@tonic-gate  * and limitations under the License.
120Sstevel@tonic-gate  *
130Sstevel@tonic-gate  * When distributing Covered Code, include this CDDL HEADER in each
140Sstevel@tonic-gate  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
150Sstevel@tonic-gate  * If applicable, add the following below this CDDL HEADER, with the
160Sstevel@tonic-gate  * fields enclosed by brackets "[]" replaced with your own identifying
170Sstevel@tonic-gate  * information: Portions Copyright [yyyy] [name of copyright owner]
180Sstevel@tonic-gate  *
190Sstevel@tonic-gate  * CDDL HEADER END
200Sstevel@tonic-gate  */
211618Srie 
220Sstevel@tonic-gate /*
239085SAli.Bahrami@Sun.COM  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
240Sstevel@tonic-gate  * Use is subject to license terms.
250Sstevel@tonic-gate  */
260Sstevel@tonic-gate 
270Sstevel@tonic-gate /*
280Sstevel@tonic-gate  * String conversion routines for symbol attributes.
290Sstevel@tonic-gate  */
300Sstevel@tonic-gate #include	<stdio.h>
310Sstevel@tonic-gate #include	<sys/elf_SPARC.h>
32574Sseizo #include	<sys/elf_amd64.h>
331618Srie #include	"_conv.h"
341618Srie #include	"symbols_msg.h"
350Sstevel@tonic-gate 
360Sstevel@tonic-gate const char *
conv_sym_other(uchar_t other,Conv_inv_buf_t * inv_buf)374734Sab196087 conv_sym_other(uchar_t other, Conv_inv_buf_t *inv_buf)
380Sstevel@tonic-gate {
395220Srie 	static const char	visibility[7] = {
401618Srie 		'D',	/* STV_DEFAULT */
411618Srie 		'I',	/* STV_INTERNAL */
421618Srie 		'H',	/* STV_HIDDEN */
435220Srie 		'P',	/* STV_PROTECTED */
445220Srie 		'X',	/* STV_EXPORTED */
455220Srie 		'S',	/* STV_SINGLETON */
465220Srie 		'E'	/* STV_ELIMINATE */
471618Srie 	};
485220Srie 	uchar_t		vis = ELF_ST_VISIBILITY(other);
491618Srie 	uint_t		ndx = 0;
500Sstevel@tonic-gate 
514734Sab196087 	inv_buf->buf[ndx++] = visibility[vis];
521618Srie 
530Sstevel@tonic-gate 	/*
545088Sab196087 	 * If unknown bits are present in st_other - throw out a '?'
550Sstevel@tonic-gate 	 */
561618Srie 	if (other & ~MSK_SYM_VISIBILITY)
574734Sab196087 		inv_buf->buf[ndx++] = '?';
584734Sab196087 	inv_buf->buf[ndx++] = '\0';
590Sstevel@tonic-gate 
604734Sab196087 	return (inv_buf->buf);
610Sstevel@tonic-gate }
620Sstevel@tonic-gate 
63*9273SAli.Bahrami@Sun.COM static const conv_ds_t **
conv_sym_other_vis_strings(Conv_fmt_flags_t fmt_flags)64*9273SAli.Bahrami@Sun.COM conv_sym_other_vis_strings(Conv_fmt_flags_t fmt_flags)
65*9273SAli.Bahrami@Sun.COM {
66*9273SAli.Bahrami@Sun.COM 	static const Msg	vis_def[] = {
67*9273SAli.Bahrami@Sun.COM 		MSG_STV_DEFAULT_DEF,	MSG_STV_INTERNAL_DEF,
68*9273SAli.Bahrami@Sun.COM 		MSG_STV_HIDDEN_DEF,	MSG_STV_PROTECTED_DEF,
69*9273SAli.Bahrami@Sun.COM 		MSG_STV_EXPORTED_DEF,	MSG_STV_SINGLETON_DEF,
70*9273SAli.Bahrami@Sun.COM 		MSG_STV_ELIMINATE_DEF
71*9273SAli.Bahrami@Sun.COM 	};
72*9273SAli.Bahrami@Sun.COM 	static const Msg	vis_cf[] = {
73*9273SAli.Bahrami@Sun.COM 		MSG_STV_DEFAULT_CF,	MSG_STV_INTERNAL_CF,
74*9273SAli.Bahrami@Sun.COM 		MSG_STV_HIDDEN_CF,	MSG_STV_PROTECTED_CF,
75*9273SAli.Bahrami@Sun.COM 		MSG_STV_EXPORTED_CF,	MSG_STV_SINGLETON_CF,
76*9273SAli.Bahrami@Sun.COM 		MSG_STV_ELIMINATE_CF
77*9273SAli.Bahrami@Sun.COM 	};
78*9273SAli.Bahrami@Sun.COM 	static const Msg	vis_nf[] = {
79*9273SAli.Bahrami@Sun.COM 		MSG_STV_DEFAULT_NF,	MSG_STV_INTERNAL_NF,
80*9273SAli.Bahrami@Sun.COM 		MSG_STV_HIDDEN_NF,	MSG_STV_PROTECTED_NF,
81*9273SAli.Bahrami@Sun.COM 		MSG_STV_EXPORTED_NF,	MSG_STV_SINGLETON_NF,
82*9273SAli.Bahrami@Sun.COM 		MSG_STV_ELIMINATE_NF
83*9273SAli.Bahrami@Sun.COM 	};
84*9273SAli.Bahrami@Sun.COM 	static const conv_ds_msg_t ds_vis_def = {
85*9273SAli.Bahrami@Sun.COM 	    CONV_DS_MSG_INIT(STV_DEFAULT, vis_def) };
86*9273SAli.Bahrami@Sun.COM 	static const conv_ds_msg_t ds_vis_cf = {
87*9273SAli.Bahrami@Sun.COM 	    CONV_DS_MSG_INIT(STV_DEFAULT, vis_cf) };
88*9273SAli.Bahrami@Sun.COM 	static const conv_ds_msg_t ds_vis_nf = {
89*9273SAli.Bahrami@Sun.COM 	    CONV_DS_MSG_INIT(STV_DEFAULT, vis_nf) };
90*9273SAli.Bahrami@Sun.COM 
91*9273SAli.Bahrami@Sun.COM 	/* Build NULL terminated return arrays for each string style */
92*9273SAli.Bahrami@Sun.COM 	static const const conv_ds_t	*ds_def[] = {
93*9273SAli.Bahrami@Sun.COM 		CONV_DS_ADDR(ds_vis_def), NULL };
94*9273SAli.Bahrami@Sun.COM 	static const const conv_ds_t	*ds_cf[] = {
95*9273SAli.Bahrami@Sun.COM 		CONV_DS_ADDR(ds_vis_cf), NULL };
96*9273SAli.Bahrami@Sun.COM 	static const const conv_ds_t	*ds_nf[] = {
97*9273SAli.Bahrami@Sun.COM 		CONV_DS_ADDR(ds_vis_nf), NULL };
98*9273SAli.Bahrami@Sun.COM 
99*9273SAli.Bahrami@Sun.COM 	/* Select the strings to use */
100*9273SAli.Bahrami@Sun.COM 	switch (CONV_TYPE_FMT_ALT(fmt_flags)) {
101*9273SAli.Bahrami@Sun.COM 	case CONV_FMT_ALT_CF:
102*9273SAli.Bahrami@Sun.COM 		return (ds_cf);
103*9273SAli.Bahrami@Sun.COM 	case CONV_FMT_ALT_NF:
104*9273SAli.Bahrami@Sun.COM 		return (ds_nf);
105*9273SAli.Bahrami@Sun.COM 	}
106*9273SAli.Bahrami@Sun.COM 
107*9273SAli.Bahrami@Sun.COM 	return (ds_def);
108*9273SAli.Bahrami@Sun.COM }
109*9273SAli.Bahrami@Sun.COM 
1100Sstevel@tonic-gate const char *
conv_sym_other_vis(uchar_t value,Conv_fmt_flags_t fmt_flags,Conv_inv_buf_t * inv_buf)1115088Sab196087 conv_sym_other_vis(uchar_t value, Conv_fmt_flags_t fmt_flags,
1125088Sab196087     Conv_inv_buf_t *inv_buf)
1135088Sab196087 {
114*9273SAli.Bahrami@Sun.COM 	return (conv_map_ds(ELFOSABI_NONE, EM_NONE, value,
115*9273SAli.Bahrami@Sun.COM 	    conv_sym_other_vis_strings(fmt_flags), fmt_flags, inv_buf));
116*9273SAli.Bahrami@Sun.COM }
117*9273SAli.Bahrami@Sun.COM 
118*9273SAli.Bahrami@Sun.COM conv_iter_ret_t
conv_iter_sym_other_vis(Conv_fmt_flags_t fmt_flags,conv_iter_cb_t func,void * uvalue)119*9273SAli.Bahrami@Sun.COM conv_iter_sym_other_vis(Conv_fmt_flags_t fmt_flags, conv_iter_cb_t func,
120*9273SAli.Bahrami@Sun.COM     void *uvalue)
121*9273SAli.Bahrami@Sun.COM {
122*9273SAli.Bahrami@Sun.COM 	return (conv_iter_ds(ELFOSABI_NONE, EM_NONE,
123*9273SAli.Bahrami@Sun.COM 	    conv_sym_other_vis_strings(fmt_flags), func, uvalue));
124*9273SAli.Bahrami@Sun.COM }
125*9273SAli.Bahrami@Sun.COM 
126*9273SAli.Bahrami@Sun.COM static const conv_ds_t **
conv_sym_info_type_strings(Half mach,Conv_fmt_flags_t fmt_flags)127*9273SAli.Bahrami@Sun.COM conv_sym_info_type_strings(Half mach, Conv_fmt_flags_t fmt_flags)
128*9273SAli.Bahrami@Sun.COM {
129*9273SAli.Bahrami@Sun.COM 	/*
130*9273SAli.Bahrami@Sun.COM 	 * This routine can return an array with 1 generic array, and
131*9273SAli.Bahrami@Sun.COM 	 * a machine array, plus the NULL termination.
132*9273SAli.Bahrami@Sun.COM 	 */
133*9273SAli.Bahrami@Sun.COM #define	MAX_RET	3
1345088Sab196087 
135*9273SAli.Bahrami@Sun.COM 	static const Msg	types_def[] = {
136*9273SAli.Bahrami@Sun.COM 		MSG_STT_NOTYPE_DEF,	MSG_STT_OBJECT_DEF,
137*9273SAli.Bahrami@Sun.COM 		MSG_STT_FUNC_DEF,	MSG_STT_SECTION_DEF,
138*9273SAli.Bahrami@Sun.COM 		MSG_STT_FILE_DEF,	MSG_STT_COMMON_DEF,
139*9273SAli.Bahrami@Sun.COM 		MSG_STT_TLS_DEF,	MSG_STT_IFUNC_DEF
140*9273SAli.Bahrami@Sun.COM 	};
141*9273SAli.Bahrami@Sun.COM 	static const Msg	types_cf[] = {
142*9273SAli.Bahrami@Sun.COM 		MSG_STT_NOTYPE_CF,	MSG_STT_OBJECT_CF,
143*9273SAli.Bahrami@Sun.COM 		MSG_STT_FUNC_CF,	MSG_STT_SECTION_CF,
144*9273SAli.Bahrami@Sun.COM 		MSG_STT_FILE_CF,	MSG_STT_COMMON_CF,
145*9273SAli.Bahrami@Sun.COM 		MSG_STT_TLS_CF,		MSG_STT_IFUNC_CF
1465088Sab196087 	};
147*9273SAli.Bahrami@Sun.COM 	static const Msg	types_nf[] = {
148*9273SAli.Bahrami@Sun.COM 		MSG_STT_NOTYPE_NF,	MSG_STT_OBJECT_NF,
149*9273SAli.Bahrami@Sun.COM 		MSG_STT_FUNC_NF,	MSG_STT_SECTION_NF,
150*9273SAli.Bahrami@Sun.COM 		MSG_STT_FILE_NF,	MSG_STT_COMMON_NF,
151*9273SAli.Bahrami@Sun.COM 		MSG_STT_TLS_NF,		MSG_STT_IFUNC_NF
152*9273SAli.Bahrami@Sun.COM 	};
153*9273SAli.Bahrami@Sun.COM 	static const conv_ds_msg_t ds_types_def = {
154*9273SAli.Bahrami@Sun.COM 	    CONV_DS_MSG_INIT(STT_NOTYPE, types_def) };
155*9273SAli.Bahrami@Sun.COM 	static const conv_ds_msg_t ds_types_cf = {
156*9273SAli.Bahrami@Sun.COM 	    CONV_DS_MSG_INIT(STT_NOTYPE, types_cf) };
157*9273SAli.Bahrami@Sun.COM 	static const conv_ds_msg_t ds_types_nf = {
158*9273SAli.Bahrami@Sun.COM 	    CONV_DS_MSG_INIT(STT_NOTYPE, types_nf) };
159*9273SAli.Bahrami@Sun.COM 
1605088Sab196087 
161*9273SAli.Bahrami@Sun.COM 	static const Msg	sparc_def[] = { MSG_STT_SPARC_REGISTER_DEF };
162*9273SAli.Bahrami@Sun.COM 	static const Msg	sparc_cf[] = { MSG_STT_SPARC_REGISTER_CF };
163*9273SAli.Bahrami@Sun.COM 	static const Msg	sparc_nf[] = { MSG_STT_SPARC_REGISTER_NF };
164*9273SAli.Bahrami@Sun.COM 	static const conv_ds_msg_t ds_sparc_def = {
165*9273SAli.Bahrami@Sun.COM 	    CONV_DS_MSG_INIT(STT_SPARC_REGISTER, sparc_def) };
166*9273SAli.Bahrami@Sun.COM 	static const conv_ds_msg_t ds_sparc_cf = {
167*9273SAli.Bahrami@Sun.COM 	    CONV_DS_MSG_INIT(STT_SPARC_REGISTER, sparc_cf) };
168*9273SAli.Bahrami@Sun.COM 	static const conv_ds_msg_t ds_sparc_nf = {
169*9273SAli.Bahrami@Sun.COM 	    CONV_DS_MSG_INIT(STT_SPARC_REGISTER, sparc_nf) };
170*9273SAli.Bahrami@Sun.COM 
171*9273SAli.Bahrami@Sun.COM 
172*9273SAli.Bahrami@Sun.COM 	static const conv_ds_t	*retarr[MAX_RET];
173*9273SAli.Bahrami@Sun.COM 
174*9273SAli.Bahrami@Sun.COM 	int	retndx = 0;
175*9273SAli.Bahrami@Sun.COM 	int	is_sparc;
176*9273SAli.Bahrami@Sun.COM 
177*9273SAli.Bahrami@Sun.COM 	is_sparc = (mach == EM_SPARC) || (mach == EM_SPARCV9) ||
178*9273SAli.Bahrami@Sun.COM 	    (mach == EM_SPARC32PLUS) || (mach == CONV_MACH_ALL);
1795088Sab196087 
180*9273SAli.Bahrami@Sun.COM 	switch (CONV_TYPE_FMT_ALT(fmt_flags)) {
181*9273SAli.Bahrami@Sun.COM 	case CONV_FMT_ALT_CF:
182*9273SAli.Bahrami@Sun.COM 		retarr[retndx++] = CONV_DS_ADDR(ds_types_cf);
183*9273SAli.Bahrami@Sun.COM 		if (is_sparc)
184*9273SAli.Bahrami@Sun.COM 			retarr[retndx++] = CONV_DS_ADDR(ds_sparc_cf);
185*9273SAli.Bahrami@Sun.COM 		break;
186*9273SAli.Bahrami@Sun.COM 	case CONV_FMT_ALT_NF:
187*9273SAli.Bahrami@Sun.COM 		retarr[retndx++] = CONV_DS_ADDR(ds_types_nf);
188*9273SAli.Bahrami@Sun.COM 		if (is_sparc)
189*9273SAli.Bahrami@Sun.COM 			retarr[retndx++] = CONV_DS_ADDR(ds_sparc_nf);
190*9273SAli.Bahrami@Sun.COM 		break;
191*9273SAli.Bahrami@Sun.COM 	default:
192*9273SAli.Bahrami@Sun.COM 		retarr[retndx++] = CONV_DS_ADDR(ds_types_def);
193*9273SAli.Bahrami@Sun.COM 		if (is_sparc)
194*9273SAli.Bahrami@Sun.COM 			retarr[retndx++] = CONV_DS_ADDR(ds_sparc_def);
195*9273SAli.Bahrami@Sun.COM 		break;
196*9273SAli.Bahrami@Sun.COM 	}
1975088Sab196087 
198*9273SAli.Bahrami@Sun.COM 	retarr[retndx++] = NULL;
199*9273SAli.Bahrami@Sun.COM 	assert(retndx <= MAX_RET);
200*9273SAli.Bahrami@Sun.COM 	return (retarr);
2015088Sab196087 }
2025088Sab196087 
2035088Sab196087 const char *
conv_sym_info_type(Half mach,uchar_t type,Conv_fmt_flags_t fmt_flags,Conv_inv_buf_t * inv_buf)2045088Sab196087 conv_sym_info_type(Half mach, uchar_t type, Conv_fmt_flags_t fmt_flags,
2054734Sab196087     Conv_inv_buf_t *inv_buf)
2060Sstevel@tonic-gate {
207*9273SAli.Bahrami@Sun.COM 	return (conv_map_ds(ELFOSABI_NONE, mach, type,
208*9273SAli.Bahrami@Sun.COM 	    conv_sym_info_type_strings(mach, fmt_flags), fmt_flags, inv_buf));
209*9273SAli.Bahrami@Sun.COM }
2100Sstevel@tonic-gate 
211*9273SAli.Bahrami@Sun.COM conv_iter_ret_t
conv_iter_sym_info_type(Half mach,Conv_fmt_flags_t fmt_flags,conv_iter_cb_t func,void * uvalue)212*9273SAli.Bahrami@Sun.COM conv_iter_sym_info_type(Half mach, Conv_fmt_flags_t fmt_flags,
213*9273SAli.Bahrami@Sun.COM     conv_iter_cb_t func, void *uvalue)
214*9273SAli.Bahrami@Sun.COM {
215*9273SAli.Bahrami@Sun.COM 	return (conv_iter_ds(ELFOSABI_NONE, mach,
216*9273SAli.Bahrami@Sun.COM 	    conv_sym_info_type_strings(mach, fmt_flags), func, uvalue));
217*9273SAli.Bahrami@Sun.COM }
2185088Sab196087 
219*9273SAli.Bahrami@Sun.COM static const conv_ds_t **
conv_sym_info_bind_strings(Conv_fmt_flags_t fmt_flags)220*9273SAli.Bahrami@Sun.COM conv_sym_info_bind_strings(Conv_fmt_flags_t fmt_flags)
221*9273SAli.Bahrami@Sun.COM {
222*9273SAli.Bahrami@Sun.COM 	static const Msg	binds_def[] = {
223*9273SAli.Bahrami@Sun.COM 		MSG_STB_LOCAL_DEF,	MSG_STB_GLOBAL_DEF,
224*9273SAli.Bahrami@Sun.COM 		MSG_STB_WEAK_DEF
225*9273SAli.Bahrami@Sun.COM 	};
226*9273SAli.Bahrami@Sun.COM 	static const Msg	binds_cf[] = {
227*9273SAli.Bahrami@Sun.COM 		MSG_STB_LOCAL_CF,	MSG_STB_GLOBAL_CF,
228*9273SAli.Bahrami@Sun.COM 		MSG_STB_WEAK_CF
229*9273SAli.Bahrami@Sun.COM 	};
230*9273SAli.Bahrami@Sun.COM 	static const Msg	binds_nf[] = {
231*9273SAli.Bahrami@Sun.COM 		MSG_STB_LOCAL_NF,	MSG_STB_GLOBAL_NF,
232*9273SAli.Bahrami@Sun.COM 		MSG_STB_WEAK_NF
233*9273SAli.Bahrami@Sun.COM 	};
234*9273SAli.Bahrami@Sun.COM 	static const conv_ds_msg_t ds_binds_def = {
235*9273SAli.Bahrami@Sun.COM 	    CONV_DS_MSG_INIT(STB_LOCAL, binds_def) };
236*9273SAli.Bahrami@Sun.COM 	static const conv_ds_msg_t ds_binds_cf = {
237*9273SAli.Bahrami@Sun.COM 	    CONV_DS_MSG_INIT(STB_LOCAL, binds_cf) };
238*9273SAli.Bahrami@Sun.COM 	static const conv_ds_msg_t ds_binds_nf = {
239*9273SAli.Bahrami@Sun.COM 	    CONV_DS_MSG_INIT(STB_LOCAL, binds_nf) };
2405088Sab196087 
241*9273SAli.Bahrami@Sun.COM 
242*9273SAli.Bahrami@Sun.COM 	/* Build NULL terminated return arrays for each string style */
243*9273SAli.Bahrami@Sun.COM 	static const const conv_ds_t	*ds_def[] = {
244*9273SAli.Bahrami@Sun.COM 		CONV_DS_ADDR(ds_binds_def), NULL };
245*9273SAli.Bahrami@Sun.COM 	static const const conv_ds_t	*ds_cf[] = {
246*9273SAli.Bahrami@Sun.COM 		CONV_DS_ADDR(ds_binds_cf), NULL };
247*9273SAli.Bahrami@Sun.COM 	static const const conv_ds_t	*ds_nf[] = {
248*9273SAli.Bahrami@Sun.COM 		CONV_DS_ADDR(ds_binds_nf), NULL };
249*9273SAli.Bahrami@Sun.COM 
2505088Sab196087 
251*9273SAli.Bahrami@Sun.COM 	/* Select the strings to use */
252*9273SAli.Bahrami@Sun.COM 	switch (CONV_TYPE_FMT_ALT(fmt_flags)) {
253*9273SAli.Bahrami@Sun.COM 	case CONV_FMT_ALT_CF:
254*9273SAli.Bahrami@Sun.COM 		return (ds_cf);
255*9273SAli.Bahrami@Sun.COM 	case CONV_FMT_ALT_NF:
256*9273SAli.Bahrami@Sun.COM 		return (ds_nf);
2571976Sab196087 	}
258*9273SAli.Bahrami@Sun.COM 
259*9273SAli.Bahrami@Sun.COM 	return (ds_def);
2600Sstevel@tonic-gate }
2610Sstevel@tonic-gate 
2620Sstevel@tonic-gate const char *
conv_sym_info_bind(uchar_t bind,Conv_fmt_flags_t fmt_flags,Conv_inv_buf_t * inv_buf)2635088Sab196087 conv_sym_info_bind(uchar_t bind, Conv_fmt_flags_t fmt_flags,
2645088Sab196087     Conv_inv_buf_t *inv_buf)
2650Sstevel@tonic-gate {
266*9273SAli.Bahrami@Sun.COM 	return (conv_map_ds(ELFOSABI_NONE, EM_NONE, bind,
267*9273SAli.Bahrami@Sun.COM 	    conv_sym_info_bind_strings(fmt_flags), fmt_flags, inv_buf));
268*9273SAli.Bahrami@Sun.COM }
2690Sstevel@tonic-gate 
270*9273SAli.Bahrami@Sun.COM conv_iter_ret_t
conv_iter_sym_info_bind(Conv_fmt_flags_t fmt_flags,conv_iter_cb_t func,void * uvalue)271*9273SAli.Bahrami@Sun.COM conv_iter_sym_info_bind(Conv_fmt_flags_t fmt_flags, conv_iter_cb_t func,
272*9273SAli.Bahrami@Sun.COM     void *uvalue)
273*9273SAli.Bahrami@Sun.COM {
274*9273SAli.Bahrami@Sun.COM 	return (conv_iter_ds(ELFOSABI_NONE, EM_NONE,
275*9273SAli.Bahrami@Sun.COM 	    conv_sym_info_bind_strings(fmt_flags), func, uvalue));
276*9273SAli.Bahrami@Sun.COM }
277*9273SAli.Bahrami@Sun.COM 
278*9273SAli.Bahrami@Sun.COM static const conv_ds_t **
conv_sym_shndx_strings(Conv_fmt_flags_t fmt_flags)279*9273SAli.Bahrami@Sun.COM conv_sym_shndx_strings(Conv_fmt_flags_t fmt_flags)
280*9273SAli.Bahrami@Sun.COM {
281*9273SAli.Bahrami@Sun.COM #define	ALL	ELFOSABI_NONE, EM_NONE
282*9273SAli.Bahrami@Sun.COM #define	SOL	ELFOSABI_SOLARIS, EM_NONE
283*9273SAli.Bahrami@Sun.COM #define	AMD	ELFOSABI_NONE, EM_AMD64
2845088Sab196087 
285*9273SAli.Bahrami@Sun.COM 	/*
286*9273SAli.Bahrami@Sun.COM 	 * There aren't many of these values, and they are sparse,
287*9273SAli.Bahrami@Sun.COM 	 * so rather than separate them into different ranges, I use
288*9273SAli.Bahrami@Sun.COM 	 * a single Val_desc2 array for all of them.
289*9273SAli.Bahrami@Sun.COM 	 */
290*9273SAli.Bahrami@Sun.COM 	static const Val_desc2 shn_def[] = {
291*9273SAli.Bahrami@Sun.COM 		{ SHN_UNDEF,		ALL,	MSG_SHN_UNDEF_CFNP },
292*9273SAli.Bahrami@Sun.COM 		{ SHN_BEFORE,		ALL,	MSG_SHN_BEFORE_CFNP },
293*9273SAli.Bahrami@Sun.COM 		{ SHN_AFTER,		ALL,	MSG_SHN_AFTER_CFNP },
294*9273SAli.Bahrami@Sun.COM 		{ SHN_AMD64_LCOMMON,	AMD,	MSG_SHN_AMD64_LCOMMON_DEF },
295*9273SAli.Bahrami@Sun.COM 		{ SHN_SUNW_IGNORE,	SOL,	MSG_SHN_SUNW_IGNORE_DEF },
296*9273SAli.Bahrami@Sun.COM 		{ SHN_ABS,		ALL,	MSG_SHN_ABS_CFNP },
297*9273SAli.Bahrami@Sun.COM 		{ SHN_COMMON,		ALL,	MSG_SHN_COMMON_CFNP },
298*9273SAli.Bahrami@Sun.COM 		{ SHN_XINDEX,		ALL,	MSG_SHN_XINDEX_CFNP },
299*9273SAli.Bahrami@Sun.COM 		{ 0 }
300*9273SAli.Bahrami@Sun.COM 	};
301*9273SAli.Bahrami@Sun.COM 	static const Val_desc2 shn_cf[] = {
302*9273SAli.Bahrami@Sun.COM 		{ SHN_UNDEF,		ALL,	MSG_SHN_UNDEF_CF },
303*9273SAli.Bahrami@Sun.COM 		{ SHN_BEFORE,		ALL,	MSG_SHN_BEFORE_CF },
304*9273SAli.Bahrami@Sun.COM 		{ SHN_AFTER,		ALL,	MSG_SHN_AFTER_CF },
305*9273SAli.Bahrami@Sun.COM 		{ SHN_AMD64_LCOMMON,	AMD,	MSG_SHN_AMD64_LCOMMON_CF },
306*9273SAli.Bahrami@Sun.COM 		{ SHN_SUNW_IGNORE,	SOL,	MSG_SHN_SUNW_IGNORE_CF },
307*9273SAli.Bahrami@Sun.COM 		{ SHN_ABS,		ALL,	MSG_SHN_ABS_CF },
308*9273SAli.Bahrami@Sun.COM 		{ SHN_COMMON,		ALL,	MSG_SHN_COMMON_CF },
309*9273SAli.Bahrami@Sun.COM 		{ SHN_XINDEX,		ALL,	MSG_SHN_XINDEX_CF },
310*9273SAli.Bahrami@Sun.COM 		{ 0 }
311*9273SAli.Bahrami@Sun.COM 	};
312*9273SAli.Bahrami@Sun.COM 	static const Val_desc2 shn_cfnp[] = {
313*9273SAli.Bahrami@Sun.COM 		{ SHN_UNDEF,		ALL,	MSG_SHN_UNDEF_CFNP },
314*9273SAli.Bahrami@Sun.COM 		{ SHN_BEFORE,		ALL,	MSG_SHN_BEFORE_CFNP },
315*9273SAli.Bahrami@Sun.COM 		{ SHN_AFTER,		ALL,	MSG_SHN_AFTER_CFNP },
316*9273SAli.Bahrami@Sun.COM 		{ SHN_AMD64_LCOMMON,	AMD,	MSG_SHN_AMD64_LCOMMON_CFNP },
317*9273SAli.Bahrami@Sun.COM 		{ SHN_SUNW_IGNORE,	SOL,	MSG_SHN_SUNW_IGNORE_CFNP },
318*9273SAli.Bahrami@Sun.COM 		{ SHN_ABS,		ALL,	MSG_SHN_ABS_CFNP },
319*9273SAli.Bahrami@Sun.COM 		{ SHN_COMMON,		ALL,	MSG_SHN_COMMON_CFNP },
320*9273SAli.Bahrami@Sun.COM 		{ SHN_XINDEX,		ALL,	MSG_SHN_XINDEX_CFNP },
321*9273SAli.Bahrami@Sun.COM 		{ 0 }
322*9273SAli.Bahrami@Sun.COM 	};
323*9273SAli.Bahrami@Sun.COM 	static const Val_desc2 shn_nf[] = {
324*9273SAli.Bahrami@Sun.COM 		{ SHN_UNDEF,		ALL,	MSG_SHN_UNDEF_NF },
325*9273SAli.Bahrami@Sun.COM 		{ SHN_BEFORE,		ALL,	MSG_SHN_BEFORE_NF },
326*9273SAli.Bahrami@Sun.COM 		{ SHN_AFTER,		ALL,	MSG_SHN_AFTER_NF },
327*9273SAli.Bahrami@Sun.COM 		{ SHN_AMD64_LCOMMON,	AMD,	MSG_SHN_AMD64_LCOMMON_NF },
328*9273SAli.Bahrami@Sun.COM 		{ SHN_SUNW_IGNORE,	SOL,	MSG_SHN_SUNW_IGNORE_NF },
329*9273SAli.Bahrami@Sun.COM 		{ SHN_ABS,		ALL,	MSG_SHN_ABS_NF },
330*9273SAli.Bahrami@Sun.COM 		{ SHN_COMMON,		ALL,	MSG_SHN_COMMON_NF },
331*9273SAli.Bahrami@Sun.COM 		{ SHN_XINDEX,		ALL,	MSG_SHN_XINDEX_NF },
332*9273SAli.Bahrami@Sun.COM 		{ 0 }
333*9273SAli.Bahrami@Sun.COM 	};
334*9273SAli.Bahrami@Sun.COM 	static const conv_ds_vd2_t ds_shn_def = {
335*9273SAli.Bahrami@Sun.COM 	    CONV_DS_VD2, SHN_UNDEF, SHN_XINDEX, shn_def };
336*9273SAli.Bahrami@Sun.COM 	static const conv_ds_vd2_t ds_shn_cf = {
337*9273SAli.Bahrami@Sun.COM 	    CONV_DS_VD2, SHN_UNDEF, SHN_XINDEX, shn_cf };
338*9273SAli.Bahrami@Sun.COM 	static const conv_ds_vd2_t ds_shn_cfnp = {
339*9273SAli.Bahrami@Sun.COM 	    CONV_DS_VD2, SHN_UNDEF, SHN_XINDEX, shn_cfnp };
340*9273SAli.Bahrami@Sun.COM 	static const conv_ds_vd2_t ds_shn_nf = {
341*9273SAli.Bahrami@Sun.COM 	    CONV_DS_VD2, SHN_UNDEF, SHN_XINDEX, shn_nf };
3425088Sab196087 
343*9273SAli.Bahrami@Sun.COM 	/* Build NULL terminated return arrays for each string style */
344*9273SAli.Bahrami@Sun.COM 	static const const conv_ds_t	*ds_def[] = {
345*9273SAli.Bahrami@Sun.COM 		CONV_DS_ADDR(ds_shn_def), NULL };
346*9273SAli.Bahrami@Sun.COM 	static const const conv_ds_t	*ds_cf[] = {
347*9273SAli.Bahrami@Sun.COM 		CONV_DS_ADDR(ds_shn_cf), NULL };
348*9273SAli.Bahrami@Sun.COM 	static const const conv_ds_t	*ds_cfnp[] = {
349*9273SAli.Bahrami@Sun.COM 		CONV_DS_ADDR(ds_shn_cfnp), NULL };
350*9273SAli.Bahrami@Sun.COM 	static const const conv_ds_t	*ds_nf[] = {
351*9273SAli.Bahrami@Sun.COM 		CONV_DS_ADDR(ds_shn_nf), NULL };
3525088Sab196087 
353*9273SAli.Bahrami@Sun.COM 	/* Select the strings to use */
354*9273SAli.Bahrami@Sun.COM 	switch (CONV_TYPE_FMT_ALT(fmt_flags)) {
355*9273SAli.Bahrami@Sun.COM 	case CONV_FMT_ALT_CF:
356*9273SAli.Bahrami@Sun.COM 		return (ds_cf);
357*9273SAli.Bahrami@Sun.COM 	case CONV_FMT_ALT_CFNP:
358*9273SAli.Bahrami@Sun.COM 		return (ds_cfnp);
359*9273SAli.Bahrami@Sun.COM 	case CONV_FMT_ALT_NF:
360*9273SAli.Bahrami@Sun.COM 		return (ds_nf);
361*9273SAli.Bahrami@Sun.COM 	}
362*9273SAli.Bahrami@Sun.COM 
363*9273SAli.Bahrami@Sun.COM 	return (ds_def);
364*9273SAli.Bahrami@Sun.COM 
365*9273SAli.Bahrami@Sun.COM #undef ALL
366*9273SAli.Bahrami@Sun.COM #undef SOL
367*9273SAli.Bahrami@Sun.COM #undef AMD
3680Sstevel@tonic-gate }
3690Sstevel@tonic-gate 
3700Sstevel@tonic-gate const char *
conv_sym_shndx(uchar_t osabi,Half mach,Half shndx,Conv_fmt_flags_t fmt_flags,Conv_inv_buf_t * inv_buf)371*9273SAli.Bahrami@Sun.COM conv_sym_shndx(uchar_t osabi, Half mach, Half shndx, Conv_fmt_flags_t fmt_flags,
372*9273SAli.Bahrami@Sun.COM     Conv_inv_buf_t *inv_buf)
3730Sstevel@tonic-gate {
374*9273SAli.Bahrami@Sun.COM 	return (conv_map_ds(osabi, mach, shndx,
375*9273SAli.Bahrami@Sun.COM 	    conv_sym_shndx_strings(fmt_flags), fmt_flags, inv_buf));
3760Sstevel@tonic-gate }
3770Sstevel@tonic-gate 
378*9273SAli.Bahrami@Sun.COM conv_iter_ret_t
conv_iter_sym_shndx(conv_iter_osabi_t osabi,Half mach,Conv_fmt_flags_t fmt_flags,conv_iter_cb_t func,void * uvalue)379*9273SAli.Bahrami@Sun.COM conv_iter_sym_shndx(conv_iter_osabi_t osabi, Half mach,
380*9273SAli.Bahrami@Sun.COM     Conv_fmt_flags_t fmt_flags, conv_iter_cb_t func, void *uvalue)
3810Sstevel@tonic-gate {
382*9273SAli.Bahrami@Sun.COM 	static const Msg amd64_alias_cf[] = { MSG_SHN_X86_64_LCOMMON_CF };
383*9273SAli.Bahrami@Sun.COM 	static const conv_ds_msg_t ds_msg_amd64_alias_cf = {
384*9273SAli.Bahrami@Sun.COM 	    CONV_DS_MSG_INIT(SHN_X86_64_LCOMMON, amd64_alias_cf) };
385*9273SAli.Bahrami@Sun.COM 	static const conv_ds_t	*ds_amd64_alias_cf[] = {
386*9273SAli.Bahrami@Sun.COM 	    CONV_DS_ADDR(ds_msg_amd64_alias_cf), NULL };
387*9273SAli.Bahrami@Sun.COM 
388*9273SAli.Bahrami@Sun.COM 	static const Msg amd64_alias_cfnp[] = { MSG_SHN_X86_64_LCOMMON_CFNP };
389*9273SAli.Bahrami@Sun.COM 	static const conv_ds_msg_t ds_msg_amd64_alias_cfnp = {
390*9273SAli.Bahrami@Sun.COM 	    CONV_DS_MSG_INIT(SHN_X86_64_LCOMMON, amd64_alias_cfnp) };
391*9273SAli.Bahrami@Sun.COM 	static const conv_ds_t	*ds_amd64_alias_cfnp[] = {
392*9273SAli.Bahrami@Sun.COM 	    CONV_DS_ADDR(ds_msg_amd64_alias_cfnp), NULL };
393*9273SAli.Bahrami@Sun.COM 
394*9273SAli.Bahrami@Sun.COM 	static const Msg amd64_alias_nf[] = { MSG_SHN_X86_64_LCOMMON_NF };
395*9273SAli.Bahrami@Sun.COM 	static const conv_ds_msg_t ds_msg_amd64_alias_nf = {
396*9273SAli.Bahrami@Sun.COM 	    CONV_DS_MSG_INIT(SHN_X86_64_LCOMMON, amd64_alias_nf) };
397*9273SAli.Bahrami@Sun.COM 	static const conv_ds_t	*ds_amd64_alias_nf[] = {
398*9273SAli.Bahrami@Sun.COM 	    CONV_DS_ADDR(ds_msg_amd64_alias_nf), NULL };
399*9273SAli.Bahrami@Sun.COM 
400*9273SAli.Bahrami@Sun.COM 
401*9273SAli.Bahrami@Sun.COM 	if (conv_iter_ds(osabi, mach, conv_sym_shndx_strings(fmt_flags),
402*9273SAli.Bahrami@Sun.COM 	    func, uvalue) == CONV_ITER_DONE)
403*9273SAli.Bahrami@Sun.COM 		return (CONV_ITER_DONE);
4040Sstevel@tonic-gate 
405*9273SAli.Bahrami@Sun.COM 	/*
406*9273SAli.Bahrami@Sun.COM 	 * SHN_AMD64_LCOMMON is also known as SHN_X86_64_LCOMMON
407*9273SAli.Bahrami@Sun.COM 	 */
408*9273SAli.Bahrami@Sun.COM 	if (mach == EM_AMD64) {
409*9273SAli.Bahrami@Sun.COM 		const conv_ds_t	**ds;
410*9273SAli.Bahrami@Sun.COM 
411*9273SAli.Bahrami@Sun.COM 		switch (CONV_TYPE_FMT_ALT(fmt_flags)) {
412*9273SAli.Bahrami@Sun.COM 		case CONV_FMT_ALT_CF:
413*9273SAli.Bahrami@Sun.COM 			ds = ds_amd64_alias_cf;
414*9273SAli.Bahrami@Sun.COM 			break;
415*9273SAli.Bahrami@Sun.COM 		case CONV_FMT_ALT_NF:
416*9273SAli.Bahrami@Sun.COM 			ds = ds_amd64_alias_nf;
417*9273SAli.Bahrami@Sun.COM 			break;
418*9273SAli.Bahrami@Sun.COM 		default:
419*9273SAli.Bahrami@Sun.COM 			ds = ds_amd64_alias_cfnp;
420*9273SAli.Bahrami@Sun.COM 			break;
421*9273SAli.Bahrami@Sun.COM 		}
422*9273SAli.Bahrami@Sun.COM 		return (conv_iter_ds(ELFOSABI_NONE, mach, ds, func, uvalue));
423*9273SAli.Bahrami@Sun.COM 	}
424*9273SAli.Bahrami@Sun.COM 
425*9273SAli.Bahrami@Sun.COM 	return (CONV_ITER_CONT);
4260Sstevel@tonic-gate }
427