xref: /onnv-gate/usr/src/cmd/sgs/libconv/common/elf.c (revision 7833:60e027e61b69)
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 /*
236206Sab196087  * Copyright 2008 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 ELF header attributes.
290Sstevel@tonic-gate  */
300Sstevel@tonic-gate #include	<stdio.h>
310Sstevel@tonic-gate #include	<string.h>
320Sstevel@tonic-gate #include	"_conv.h"
330Sstevel@tonic-gate #include	"elf_msg.h"
340Sstevel@tonic-gate #include	<sys/elf_SPARC.h>
350Sstevel@tonic-gate 
361976Sab196087 
371976Sab196087 
381976Sab196087 /* Instantiate a local copy of conv_map2str() from _conv.h */
391976Sab196087 DEFINE_conv_map2str
401976Sab196087 
411976Sab196087 
421976Sab196087 
430Sstevel@tonic-gate const char *
445088Sab196087 conv_ehdr_class(uchar_t class, Conv_fmt_flags_t fmt_flags,
455088Sab196087     Conv_inv_buf_t *inv_buf)
460Sstevel@tonic-gate {
471618Srie 	static const Msg	classes[] = {
481976Sab196087 		MSG_ELFCLASSNONE, MSG_ELFCLASS32, MSG_ELFCLASS64
491976Sab196087 	};
501976Sab196087 	static const Msg	classes_alt[] = {
511976Sab196087 		MSG_ELFCLASSNONE_ALT, MSG_ELFCLASS32_ALT, MSG_ELFCLASS64_ALT
521618Srie 	};
530Sstevel@tonic-gate 
545088Sab196087 	/* Use alternative strings? */
555088Sab196087 	switch (CONV_TYPE_FMT_ALT(fmt_flags)) {
565088Sab196087 	case CONV_FMT_ALT_DUMP:
575088Sab196087 	case CONV_FMT_ALT_FILE:
585088Sab196087 		return (conv_map2str(inv_buf, class, fmt_flags,
595088Sab196087 		    ARRAY_NELTS(classes_alt), classes_alt));
605088Sab196087 	}
615088Sab196087 
625088Sab196087 	/* Use default strings */
634734Sab196087 	return (conv_map2str(inv_buf, class, fmt_flags,
645088Sab196087 	    ARRAY_NELTS(classes), classes));
650Sstevel@tonic-gate }
660Sstevel@tonic-gate 
670Sstevel@tonic-gate const char *
685088Sab196087 conv_ehdr_data(uchar_t data, Conv_fmt_flags_t fmt_flags,
695088Sab196087     Conv_inv_buf_t *inv_buf)
700Sstevel@tonic-gate {
711618Srie 	static const Msg	datas[] = {
721976Sab196087 		MSG_ELFDATANONE, MSG_ELFDATA2LSB, MSG_ELFDATA2MSB
731976Sab196087 	};
741976Sab196087 	static const Msg	datas_dump[] = {
751976Sab196087 		MSG_ELFDATANONE_ALT, MSG_ELFDATA2LSB_ALT1, MSG_ELFDATA2MSB_ALT1
761976Sab196087 	};
771976Sab196087 	static const Msg	datas_file[] = {
781976Sab196087 		MSG_ELFDATANONE_ALT, MSG_ELFDATA2LSB_ALT2, MSG_ELFDATA2MSB_ALT2
791618Srie 	};
800Sstevel@tonic-gate 
815088Sab196087 	/* Use alternative strings? */
825088Sab196087 	switch (CONV_TYPE_FMT_ALT(fmt_flags)) {
835088Sab196087 	case CONV_FMT_ALT_DUMP:
845088Sab196087 		return (conv_map2str(inv_buf, data, fmt_flags,
855088Sab196087 		    ARRAY_NELTS(datas_dump), datas_dump));
865088Sab196087 	case CONV_FMT_ALT_FILE:
875088Sab196087 		return (conv_map2str(inv_buf, data, fmt_flags,
885088Sab196087 		    ARRAY_NELTS(datas_file), datas_file));
895088Sab196087 	}
905088Sab196087 
915088Sab196087 	/* Use default strings */
924734Sab196087 	return (conv_map2str(inv_buf, data, fmt_flags,
935088Sab196087 	    ARRAY_NELTS(datas), datas));
940Sstevel@tonic-gate }
950Sstevel@tonic-gate 
960Sstevel@tonic-gate static const Msg machines[EM_NUM] = {
971618Srie 	MSG_EM_NONE,		MSG_EM_M32,		MSG_EM_SPARC,
981618Srie 	MSG_EM_386,		MSG_EM_68K,		MSG_EM_88K,
991618Srie 	MSG_EM_486,		MSG_EM_860,		MSG_EM_MIPS,
1002802Sab196087 	MSG_EM_S370,		MSG_EM_MIPS_RS3_LE,	MSG_EM_RS6000,
1011618Srie 	MSG_EM_UNKNOWN12,	MSG_EM_UNKNOWN13,	MSG_EM_UNKNOWN14,
1021618Srie 	MSG_EM_PA_RISC,		MSG_EM_nCUBE,		MSG_EM_VPP500,
1032802Sab196087 	MSG_EM_SPARC32PLUS,	MSG_EM_960,		MSG_EM_PPC,
1042802Sab196087 	MSG_EM_PPC64,		MSG_EM_S390,		MSG_EM_UNKNOWN23,
1051618Srie 	MSG_EM_UNKNOWN24,	MSG_EM_UNKNOWN25,	MSG_EM_UNKNOWN26,
1061618Srie 	MSG_EM_UNKNOWN27,	MSG_EM_UNKNOWN28,	MSG_EM_UNKNOWN29,
1071618Srie 	MSG_EM_UNKNOWN30,	MSG_EM_UNKNOWN31,	MSG_EM_UNKNOWN32,
1081618Srie 	MSG_EM_UNKNOWN33,	MSG_EM_UNKNOWN34,	MSG_EM_UNKNOWN35,
1093850Sab196087 	MSG_EM_V800,		MSG_EM_FR20,		MSG_EM_RH32,
1101618Srie 	MSG_EM_RCE,		MSG_EM_ARM,		MSG_EM_ALPHA,
1111618Srie 	MSG_EM_SH,		MSG_EM_SPARCV9,		MSG_EM_TRICORE,
1121618Srie 	MSG_EM_ARC,		MSG_EM_H8_300,		MSG_EM_H8_300H,
1131618Srie 	MSG_EM_H8S,		MSG_EM_H8_500,		MSG_EM_IA_64,
1141618Srie 	MSG_EM_MIPS_X,		MSG_EM_COLDFIRE,	MSG_EM_68HC12,
1151618Srie 	MSG_EM_MMA,		MSG_EM_PCP,		MSG_EM_NCPU,
1161618Srie 	MSG_EM_NDR1,		MSG_EM_STARCORE,	MSG_EM_ME16,
1171618Srie 	MSG_EM_ST100,		MSG_EM_TINYJ,		MSG_EM_AMD64,
1182802Sab196087 	MSG_EM_PDSP,		MSG_EM_UNKNOWN64,	MSG_EM_UNKNOWN65,
1191618Srie 	MSG_EM_FX66,		MSG_EM_ST9PLUS,		MSG_EM_ST7,
1201618Srie 	MSG_EM_68HC16,		MSG_EM_68HC11,		MSG_EM_68HC08,
1211618Srie 	MSG_EM_68HC05,		MSG_EM_SVX,		MSG_EM_ST19,
1221618Srie 	MSG_EM_VAX,		MSG_EM_CRIS,		MSG_EM_JAVELIN,
1231618Srie 	MSG_EM_FIREPATH,	MSG_EM_ZSP,		MSG_EM_MMIX,
1241618Srie 	MSG_EM_HUANY,		MSG_EM_PRISM,		MSG_EM_AVR,
1251618Srie 	MSG_EM_FR30,		MSG_EM_D10V,		MSG_EM_D30V,
1261618Srie 	MSG_EM_V850,		MSG_EM_M32R,		MSG_EM_MN10300,
1271618Srie 	MSG_EM_MN10200,		MSG_EM_PJ,		MSG_EM_OPENRISC,
1281618Srie 	MSG_EM_ARC_A5,		MSG_EM_XTENSA
1290Sstevel@tonic-gate };
1301976Sab196087 static const Msg machines_alt[EM_NUM] = {
1311976Sab196087 	MSG_EM_NONE_ALT,	MSG_EM_M32_ALT,		MSG_EM_SPARC_ALT,
1321976Sab196087 	MSG_EM_386_ALT,		MSG_EM_68K_ALT,		MSG_EM_88K_ALT,
1331976Sab196087 	MSG_EM_486_ALT,		MSG_EM_860_ALT,		MSG_EM_MIPS_ALT,
1342802Sab196087 	MSG_EM_S370,		MSG_EM_MIPS_RS3_LE_ALT,	MSG_EM_RS6000_ALT,
1351976Sab196087 	MSG_EM_UNKNOWN12,	MSG_EM_UNKNOWN13,	MSG_EM_UNKNOWN14,
1361976Sab196087 	MSG_EM_PA_RISC_ALT,	MSG_EM_nCUBE_ALT,	MSG_EM_VPP500_ALT,
1372802Sab196087 	MSG_EM_SPARC32PLUS_ALT,	MSG_EM_960,		MSG_EM_PPC_ALT,
1382802Sab196087 	MSG_EM_PPC64_ALT,	MSG_EM_S390,		MSG_EM_UNKNOWN23,
1391976Sab196087 	MSG_EM_UNKNOWN24,	MSG_EM_UNKNOWN25,	MSG_EM_UNKNOWN26,
1401976Sab196087 	MSG_EM_UNKNOWN27,	MSG_EM_UNKNOWN28,	MSG_EM_UNKNOWN29,
1411976Sab196087 	MSG_EM_UNKNOWN30,	MSG_EM_UNKNOWN31,	MSG_EM_UNKNOWN32,
1421976Sab196087 	MSG_EM_UNKNOWN33,	MSG_EM_UNKNOWN34,	MSG_EM_UNKNOWN35,
1433850Sab196087 	MSG_EM_V800,		MSG_EM_FR20,		MSG_EM_RH32,
1441976Sab196087 	MSG_EM_RCE,		MSG_EM_ARM_ALT,		MSG_EM_ALPHA_ALT,
1451976Sab196087 	MSG_EM_SH,		MSG_EM_SPARCV9_ALT,	MSG_EM_TRICORE,
1461976Sab196087 	MSG_EM_ARC,		MSG_EM_H8_300,		MSG_EM_H8_300H,
1471976Sab196087 	MSG_EM_H8S,		MSG_EM_H8_500,		MSG_EM_IA_64_ALT,
1481976Sab196087 	MSG_EM_MIPS_X,		MSG_EM_COLDFIRE,	MSG_EM_68HC12,
1491976Sab196087 	MSG_EM_MMA,		MSG_EM_PCP,		MSG_EM_NCPU,
1501976Sab196087 	MSG_EM_NDR1,		MSG_EM_STARCORE,	MSG_EM_ME16,
1511976Sab196087 	MSG_EM_ST100,		MSG_EM_TINYJ,		MSG_EM_AMD64_ALT,
1522802Sab196087 	MSG_EM_PDSP,		MSG_EM_UNKNOWN64,	MSG_EM_UNKNOWN65,
1531976Sab196087 	MSG_EM_FX66,		MSG_EM_ST9PLUS,		MSG_EM_ST7,
1541976Sab196087 	MSG_EM_68HC16,		MSG_EM_68HC11,		MSG_EM_68HC08,
1551976Sab196087 	MSG_EM_68HC05,		MSG_EM_SVX,		MSG_EM_ST19,
1561976Sab196087 	MSG_EM_VAX_ALT,		MSG_EM_CRIS,		MSG_EM_JAVELIN,
1571976Sab196087 	MSG_EM_FIREPATH,	MSG_EM_ZSP,		MSG_EM_MMIX,
1581976Sab196087 	MSG_EM_HUANY,		MSG_EM_PRISM,		MSG_EM_AVR,
1591976Sab196087 	MSG_EM_FR30,		MSG_EM_D10V,		MSG_EM_D30V,
1601976Sab196087 	MSG_EM_V850,		MSG_EM_M32R,		MSG_EM_MN10300,
1611976Sab196087 	MSG_EM_MN10200,		MSG_EM_PJ,		MSG_EM_OPENRISC,
1621976Sab196087 	MSG_EM_ARC_A5,		MSG_EM_XTENSA
1631976Sab196087 };
1640Sstevel@tonic-gate #if	(EM_NUM != (EM_XTENSA + 1))
1650Sstevel@tonic-gate #error	"EM_NUM has grown"
1660Sstevel@tonic-gate #endif
1671618Srie 
1681618Srie const char *
1695088Sab196087 conv_ehdr_mach(Half machine, Conv_fmt_flags_t fmt_flags,
1705088Sab196087     Conv_inv_buf_t *inv_buf)
1711618Srie {
1725088Sab196087 	/* Use alternative strings? */
1735088Sab196087 	switch (CONV_TYPE_FMT_ALT(fmt_flags)) {
1745088Sab196087 	case CONV_FMT_ALT_DUMP:
1755088Sab196087 	case CONV_FMT_ALT_FILE:
1765088Sab196087 		return (conv_map2str(inv_buf, machine, fmt_flags,
1775088Sab196087 		    ARRAY_NELTS(machines_alt), machines_alt));
1785088Sab196087 	}
1795088Sab196087 
1805088Sab196087 	/* Use default strings */
1814734Sab196087 	return (conv_map2str(inv_buf, machine, fmt_flags,
1825088Sab196087 	    ARRAY_NELTS(machines), machines));
1830Sstevel@tonic-gate }
1840Sstevel@tonic-gate 
1851976Sab196087 
1860Sstevel@tonic-gate const char *
1875088Sab196087 conv_ehdr_type(Half etype, Conv_fmt_flags_t fmt_flags, Conv_inv_buf_t *inv_buf)
1880Sstevel@tonic-gate {
1891618Srie 	static const Msg	etypes[] = {
1901618Srie 		MSG_ET_NONE,		MSG_ET_REL,		MSG_ET_EXEC,
1911618Srie 		MSG_ET_DYN,		MSG_ET_CORE
1921618Srie 	};
1931976Sab196087 	static const Msg	etypes_alt[] = {
1941976Sab196087 		MSG_ET_NONE_ALT,	MSG_ET_REL_ALT,		MSG_ET_EXEC_ALT,
1951976Sab196087 		MSG_ET_DYN_ALT,		MSG_ET_CORE_ALT
1961976Sab196087 	};
1970Sstevel@tonic-gate 
1981976Sab196087 	if (etype == ET_SUNWPSEUDO) {
1995088Sab196087 		switch (CONV_TYPE_FMT_ALT(fmt_flags)) {
2005088Sab196087 		case CONV_FMT_ALT_DUMP:
2015088Sab196087 		case CONV_FMT_ALT_FILE:
2025088Sab196087 			return (MSG_ORIG(MSG_ET_SUNWPSEUDO_ALT));
2035088Sab196087 		default:
2045088Sab196087 			return (MSG_ORIG(MSG_ET_SUNWPSEUDO));
2055088Sab196087 		}
2061976Sab196087 	}
2071976Sab196087 
2085088Sab196087 	/* Use alternative strings? */
2095088Sab196087 	switch (CONV_TYPE_FMT_ALT(fmt_flags)) {
2105088Sab196087 	case CONV_FMT_ALT_DUMP:
2115088Sab196087 	case CONV_FMT_ALT_FILE:
2125088Sab196087 		return (conv_map2str(inv_buf, etype, fmt_flags,
2135088Sab196087 		    ARRAY_NELTS(etypes_alt), etypes_alt));
2145088Sab196087 	}
2155088Sab196087 
2165088Sab196087 	/* Use default strings */
2174734Sab196087 	return (conv_map2str(inv_buf, etype, fmt_flags,
2185088Sab196087 	    ARRAY_NELTS(etypes), etypes));
2191976Sab196087 
2200Sstevel@tonic-gate }
2210Sstevel@tonic-gate 
2220Sstevel@tonic-gate const char *
2235088Sab196087 conv_ehdr_vers(Word version, Conv_fmt_flags_t fmt_flags,
2245088Sab196087     Conv_inv_buf_t *inv_buf)
2250Sstevel@tonic-gate {
2261618Srie 	static const Msg	versions[] = {
2271618Srie 		MSG_EV_NONE,		MSG_EV_CURRENT
2281618Srie 	};
2291976Sab196087 	static const Msg	versions_alt[] = {
2301976Sab196087 		MSG_EV_NONE_ALT,	MSG_EV_CURRENT_ALT
2311976Sab196087 	};
2320Sstevel@tonic-gate 
2335088Sab196087 	/* Use alternative strings? */
2345088Sab196087 	switch (CONV_TYPE_FMT_ALT(fmt_flags)) {
2355088Sab196087 	case CONV_FMT_ALT_DUMP:
2365088Sab196087 	case CONV_FMT_ALT_FILE:
2375088Sab196087 		return (conv_map2str(inv_buf, version, fmt_flags,
2385088Sab196087 		    ARRAY_NELTS(versions_alt), versions_alt));
2395088Sab196087 	}
2405088Sab196087 
2415088Sab196087 	/* Use default strings */
2424734Sab196087 	return (conv_map2str(inv_buf, version, fmt_flags,
2435088Sab196087 	    ARRAY_NELTS(versions), versions));
2440Sstevel@tonic-gate }
2450Sstevel@tonic-gate 
2462352Sab196087 #define	EFLAGSZ	CONV_EXPN_FIELD_DEF_PREFIX_SIZE + \
2472352Sab196087 		MSG_EF_SPARCV9_TSO_SIZE + CONV_EXPN_FIELD_DEF_SEP_SIZE +  \
2482352Sab196087 		MSG_EF_SPARC_SUN_US1_SIZE + CONV_EXPN_FIELD_DEF_SEP_SIZE +  \
2492352Sab196087 		MSG_EF_SPARC_HAL_R1_SIZE + CONV_EXPN_FIELD_DEF_SEP_SIZE +  \
2502352Sab196087 		MSG_EF_SPARC_SUN_US3_SIZE + CONV_EXPN_FIELD_DEF_SEP_SIZE +  \
2514734Sab196087 		CONV_INV_BUFSIZE + CONV_EXPN_FIELD_DEF_SUFFIX_SIZE
2524734Sab196087 
2534734Sab196087 /*
2544734Sab196087  * Ensure that Conv_ehdr_flags_buf_t is large enough:
2554734Sab196087  *
2564734Sab196087  * EFLAGSZ is the real minimum size of the buffer required by conv_ehdr_flags().
2574734Sab196087  * However, Conv_ehdr_flags_buf_t uses CONV_EHDR_FLAG_BUFSIZE to set the
2584734Sab196087  * buffer size. We do things this way because the definition of EFLAGSZ uses
2594734Sab196087  * information that is not available in the environment of other programs
2604734Sab196087  * that include the conv.h header file.
2614734Sab196087  */
2625152Sab196087 #if (CONV_EHDR_FLAGS_BUFSIZE != EFLAGSZ) && !defined(__lint)
2635152Sab196087 #define	REPORT_BUFSIZE EFLAGSZ
2645152Sab196087 #include "report_bufsize.h"
2655152Sab196087 #error "CONV_EHDR_FLAGS_BUFSIZE does not match EFLAGSZ"
2664734Sab196087 #endif
2670Sstevel@tonic-gate 
2680Sstevel@tonic-gate /*
2691618Srie  * Make a string representation of the e_flags field.
2700Sstevel@tonic-gate  */
2710Sstevel@tonic-gate const char *
2725088Sab196087 conv_ehdr_flags(Half mach, Word flags, Conv_fmt_flags_t fmt_flags,
2735088Sab196087     Conv_ehdr_flags_buf_t *flags_buf)
2740Sstevel@tonic-gate {
2751618Srie 	static Val_desc vda[] = {
2761618Srie 		{ EF_SPARC_32PLUS,	MSG_ORIG(MSG_EF_SPARC_32PLUS) },
2771618Srie 		{ EF_SPARC_SUN_US1,	MSG_ORIG(MSG_EF_SPARC_SUN_US1) },
2781618Srie 		{ EF_SPARC_HAL_R1,	MSG_ORIG(MSG_EF_SPARC_HAL_R1) },
2791618Srie 		{ EF_SPARC_SUN_US3,	MSG_ORIG(MSG_EF_SPARC_SUN_US3) },
2801618Srie 		{ 0,			0 }
2811618Srie 	};
2821618Srie 	static const Msg mm_flags[] = {
2831618Srie 		MSG_EF_SPARCV9_TSO,	MSG_EF_SPARCV9_PSO,
2841618Srie 		MSG_EF_SPARCV9_RMO
2851618Srie 	};
2862352Sab196087 	static const char *leading_str_arr[2];
2874734Sab196087 	static CONV_EXPN_FIELD_ARG conv_arg = {
2884734Sab196087 	    NULL, sizeof (flags_buf->buf), vda, leading_str_arr };
2892352Sab196087 
2902352Sab196087 	const char **lstr = leading_str_arr;
2910Sstevel@tonic-gate 
2924734Sab196087 	conv_arg.buf = flags_buf->buf;
2934734Sab196087 
2940Sstevel@tonic-gate 	/*
2951618Srie 	 * Non-SPARC architectures presently provide no known flags.
2960Sstevel@tonic-gate 	 */
2970Sstevel@tonic-gate 	if ((mach == EM_SPARCV9) || (((mach == EM_SPARC) ||
2980Sstevel@tonic-gate 	    (mach == EM_SPARC32PLUS)) && flags)) {
2991618Srie 		/*
3001618Srie 		 * Valid vendor extension bits for SPARCV9.  These must be
3011618Srie 		 * updated along with elf_SPARC.h.
3021618Srie 		 */
3030Sstevel@tonic-gate 
3042352Sab196087 		conv_arg.oflags = conv_arg.rflags = flags;
3051618Srie 		if ((mach == EM_SPARCV9) && (flags <= EF_SPARCV9_RMO)) {
3062352Sab196087 			*lstr++ = MSG_ORIG(mm_flags[flags & EF_SPARCV9_MM]);
3072352Sab196087 			conv_arg.rflags &= ~EF_SPARCV9_MM;
3080Sstevel@tonic-gate 		}
3092352Sab196087 		*lstr = NULL;
3100Sstevel@tonic-gate 
3115088Sab196087 		(void) conv_expn_field(&conv_arg, fmt_flags);
3120Sstevel@tonic-gate 
3134734Sab196087 		return (conv_arg.buf);
3141618Srie 	}
3154734Sab196087 
3164734Sab196087 	return (conv_invalid_val(&flags_buf->inv_buf, flags, CONV_FMT_DECIMAL));
3170Sstevel@tonic-gate }
3180Sstevel@tonic-gate 
3190Sstevel@tonic-gate /*
3203850Sab196087  * Make a string representation of the e_ident[EI_OSABI] field.
3213850Sab196087  */
3223850Sab196087 const char *
3235088Sab196087 conv_ehdr_osabi(uchar_t osabi, Conv_fmt_flags_t fmt_flags,
3245088Sab196087     Conv_inv_buf_t *inv_buf)
3253850Sab196087 {
3263850Sab196087 	static const Msg	osabi_arr[] = {
3273850Sab196087 		MSG_OSABI_NONE,		MSG_OSABI_HPUX,
3283850Sab196087 		MSG_OSABI_NETBSD,	MSG_OSABI_LINUX,
3293850Sab196087 		MSG_OSABI_UNKNOWN4,	MSG_OSABI_UNKNOWN5,
3303850Sab196087 		MSG_OSABI_SOLARIS,	MSG_OSABI_AIX,
3313850Sab196087 		MSG_OSABI_IRIX,		MSG_OSABI_FREEBSD,
3323850Sab196087 		MSG_OSABI_TRU64,	MSG_OSABI_MODESTO,
3333850Sab196087 		MSG_OSABI_OPENBSD,	MSG_OSABI_OPENVMS,
3343850Sab196087 		MSG_OSABI_NSK,		MSG_OSABI_AROS
3353850Sab196087 	};
3363850Sab196087 	static const Msg	osabi_arr_alt[] = {
3373850Sab196087 		MSG_OSABI_NONE_ALT,	MSG_OSABI_HPUX_ALT,
3383850Sab196087 		MSG_OSABI_NETBSD_ALT,	MSG_OSABI_LINUX_ALT,
3393850Sab196087 		MSG_OSABI_UNKNOWN4,	MSG_OSABI_UNKNOWN5,
3403850Sab196087 		MSG_OSABI_SOLARIS_ALT,	MSG_OSABI_AIX_ALT,
3413850Sab196087 		MSG_OSABI_IRIX_ALT,	MSG_OSABI_FREEBSD_ALT,
3423850Sab196087 		MSG_OSABI_TRU64_ALT,	MSG_OSABI_MODESTO_ALT,
3433850Sab196087 		MSG_OSABI_OPENBSD_ALT,	MSG_OSABI_OPENVMS_ALT,
3443850Sab196087 		MSG_OSABI_NSK_ALT,	MSG_OSABI_AROS_ALT
3453850Sab196087 	};
3463850Sab196087 
3473850Sab196087 	const char *str;
3483850Sab196087 
3493850Sab196087 	switch (osabi) {
3503850Sab196087 	case ELFOSABI_ARM:
3515088Sab196087 		switch (CONV_TYPE_FMT_ALT(fmt_flags)) {
3525088Sab196087 		case CONV_FMT_ALT_DUMP:
3535088Sab196087 		case CONV_FMT_ALT_FILE:
3545088Sab196087 			str = MSG_ORIG(MSG_OSABI_ARM_ALT);
3555088Sab196087 			break;
3565088Sab196087 		default:
3575088Sab196087 			str = MSG_ORIG(MSG_OSABI_ARM);
3585088Sab196087 		}
3593850Sab196087 		break;
3603850Sab196087 
3613850Sab196087 	case ELFOSABI_STANDALONE:
3625088Sab196087 		switch (CONV_TYPE_FMT_ALT(fmt_flags)) {
3635088Sab196087 		case CONV_FMT_ALT_DUMP:
3645088Sab196087 		case CONV_FMT_ALT_FILE:
3655088Sab196087 			str = MSG_ORIG(MSG_OSABI_STANDALONE_ALT);
3665088Sab196087 			break;
3675088Sab196087 		default:
3685088Sab196087 			str = MSG_ORIG(MSG_OSABI_STANDALONE);
3695088Sab196087 		}
3703850Sab196087 		break;
3713850Sab196087 
3723850Sab196087 	default:
3735088Sab196087 		switch (CONV_TYPE_FMT_ALT(fmt_flags)) {
3745088Sab196087 		case CONV_FMT_ALT_DUMP:
3755088Sab196087 		case CONV_FMT_ALT_FILE:
3765088Sab196087 			str = conv_map2str(inv_buf, osabi, fmt_flags,
3775088Sab196087 			    ARRAY_NELTS(osabi_arr_alt), osabi_arr_alt);
3785088Sab196087 			break;
3795088Sab196087 		default:
3805088Sab196087 			str = conv_map2str(inv_buf, osabi, fmt_flags,
3815088Sab196087 			    ARRAY_NELTS(osabi_arr), osabi_arr);
3825088Sab196087 		}
3833850Sab196087 		break;
3843850Sab196087 	}
3853850Sab196087 
3863850Sab196087 	return (str);
3873850Sab196087 }
3883850Sab196087 
3893850Sab196087 /*
3900Sstevel@tonic-gate  * A generic means of returning additional information for a rejected file in
3910Sstevel@tonic-gate  * terms of a string.
3920Sstevel@tonic-gate  */
3930Sstevel@tonic-gate const char *
3946206Sab196087 conv_reject_desc(Rej_desc * rej, Conv_reject_desc_buf_t *reject_desc_buf,
3956206Sab196087     Half mach)
3960Sstevel@tonic-gate {
3974734Sab196087 	ushort_t	type = rej->rej_type;
3984734Sab196087 	uint_t		info = rej->rej_info;
3990Sstevel@tonic-gate 
400*7833SRod.Evans@Sun.COM 	switch (type) {
401*7833SRod.Evans@Sun.COM 	case SGS_REJ_MACH:
4024734Sab196087 		return (conv_ehdr_mach((Half)info, 0,
4034734Sab196087 		    &reject_desc_buf->inv_buf));
404*7833SRod.Evans@Sun.COM 	case SGS_REJ_CLASS:
4054734Sab196087 		return (conv_ehdr_class((uchar_t)info, 0,
4064734Sab196087 		    &reject_desc_buf->inv_buf));
407*7833SRod.Evans@Sun.COM 	case SGS_REJ_DATA:
4084734Sab196087 		return (conv_ehdr_data((uchar_t)info, 0,
4094734Sab196087 		    &reject_desc_buf->inv_buf));
410*7833SRod.Evans@Sun.COM 	case SGS_REJ_TYPE:
4114734Sab196087 		return (conv_ehdr_type((Half)info, 0,
4124734Sab196087 		    &reject_desc_buf->inv_buf));
413*7833SRod.Evans@Sun.COM 	case SGS_REJ_BADFLAG:
414*7833SRod.Evans@Sun.COM 	case SGS_REJ_MISFLAG:
415*7833SRod.Evans@Sun.COM 	case SGS_REJ_HAL:
416*7833SRod.Evans@Sun.COM 	case SGS_REJ_US3:
4176206Sab196087 		return (conv_ehdr_flags(mach, (Word)info, 0,
4184734Sab196087 		    &reject_desc_buf->flags_buf));
419*7833SRod.Evans@Sun.COM 	case SGS_REJ_UNKFILE:
4200Sstevel@tonic-gate 		return ((const char *)0);
421*7833SRod.Evans@Sun.COM 	case SGS_REJ_STR:
422*7833SRod.Evans@Sun.COM 	case SGS_REJ_HWCAP_1:
423*7833SRod.Evans@Sun.COM 	case SGS_REJ_SFCAP_1:
4240Sstevel@tonic-gate 		if (rej->rej_str)
4250Sstevel@tonic-gate 			return ((const char *)rej->rej_str);
4260Sstevel@tonic-gate 		else
4270Sstevel@tonic-gate 			return (MSG_ORIG(MSG_STR_EMPTY));
428*7833SRod.Evans@Sun.COM 	default:
4294734Sab196087 		return (conv_invalid_val(&reject_desc_buf->inv_buf, info,
4301976Sab196087 		    CONV_FMT_DECIMAL));
431*7833SRod.Evans@Sun.COM 	}
4320Sstevel@tonic-gate }
433