xref: /onnv-gate/usr/src/cmd/sgs/elfedit/modules/common/ehdr.c (revision 9273:9a0603d78ad3)
15088Sab196087 /*
25088Sab196087  * CDDL HEADER START
35088Sab196087  *
45088Sab196087  * The contents of this file are subject to the terms of the
55088Sab196087  * Common Development and Distribution License (the "License").
65088Sab196087  * You may not use this file except in compliance with the License.
75088Sab196087  *
85088Sab196087  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
95088Sab196087  * or http://www.opensolaris.org/os/licensing.
105088Sab196087  * See the License for the specific language governing permissions
115088Sab196087  * and limitations under the License.
125088Sab196087  *
135088Sab196087  * When distributing Covered Code, include this CDDL HEADER in each
145088Sab196087  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
155088Sab196087  * If applicable, add the following below this CDDL HEADER, with the
165088Sab196087  * fields enclosed by brackets "[]" replaced with your own identifying
175088Sab196087  * information: Portions Copyright [yyyy] [name of copyright owner]
185088Sab196087  *
195088Sab196087  * CDDL HEADER END
205088Sab196087  */
215088Sab196087 
225088Sab196087 /*
23*9273SAli.Bahrami@Sun.COM  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
245088Sab196087  * Use is subject to license terms.
255088Sab196087  */
265088Sab196087 
275088Sab196087 #include	<stdio.h>
285088Sab196087 #include	<ctype.h>
295088Sab196087 #include	<elfedit.h>
305088Sab196087 #include	<sys/elf_SPARC.h>
315088Sab196087 #include	<sys/elf_amd64.h>
325088Sab196087 #include	<strings.h>
335088Sab196087 #include	<conv.h>
345088Sab196087 #include	<debug.h>
355088Sab196087 #include	<ehdr_msg.h>
365088Sab196087 
375088Sab196087 
385088Sab196087 
395088Sab196087 
405088Sab196087 /*
415088Sab196087  * This module handles changes to the ELF header
425088Sab196087  */
435088Sab196087 
445088Sab196087 
455088Sab196087 
465088Sab196087 /*
475088Sab196087  * This module uses shared code for several of the commands.
485088Sab196087  * It is sometimes necessary to know which specific command
495088Sab196087  * is active.
505088Sab196087  */
515088Sab196087 typedef enum {
525088Sab196087 	/* Dump command, used as module default to display ELF header */
535088Sab196087 	EHDR_CMD_T_DUMP =		0,	/* ehdr:dump */
545088Sab196087 
555088Sab196087 	/* Commands that correspond directly to ELF header fields */
565088Sab196087 	EHDR_CMD_T_E_IDENT =		1,	/* ehdr:e_ident */
575088Sab196087 	EHDR_CMD_T_E_TYPE =		2,	/* ehdr:e_type */
585088Sab196087 	EHDR_CMD_T_E_MACHINE =		3,	/* ehdr:e_machine */
595088Sab196087 	EHDR_CMD_T_E_VERSION =		4,	/* ehdr:e_version */
605088Sab196087 	EHDR_CMD_T_E_ENTRY =		5,	/* ehdr:e_entry */
615088Sab196087 	EHDR_CMD_T_E_PHOFF =		6,	/* ehdr:e_phoff */
625088Sab196087 	EHDR_CMD_T_E_SHOFF =		7,	/* ehdr:e_shoff */
635088Sab196087 	EHDR_CMD_T_E_FLAGS =		8,	/* ehdr:e_flags */
645088Sab196087 	EHDR_CMD_T_E_EHSIZE =		9,	/* ehdr:e_ehsize */
655088Sab196087 	EHDR_CMD_T_E_PHENTSIZE =	10,	/* ehdr:e_phentsize */
665088Sab196087 	EHDR_CMD_T_E_PHNUM =		11,	/* ehdr:e_phnum */
675088Sab196087 	EHDR_CMD_T_E_SHENTSIZE =	12,	/* ehdr:e_shentsize */
685088Sab196087 	EHDR_CMD_T_E_SHNUM =		13,	/* ehdr:e_shnum */
695088Sab196087 	EHDR_CMD_T_E_SHSTRNDX =		14,	/* ehdr:e_shstrndx */
705088Sab196087 
715088Sab196087 	/* Commands that correspond to the e_ident[] array in ELF hdr */
725088Sab196087 	EHDR_CMD_T_EI_MAG0 =		15,	/* ehdr:ei_mag0 */
735088Sab196087 	EHDR_CMD_T_EI_MAG1 =		16,	/* ehdr:ei_mag1 */
745088Sab196087 	EHDR_CMD_T_EI_MAG2 =		17,	/* ehdr:ei_mag2 */
755088Sab196087 	EHDR_CMD_T_EI_MAG3 =		18,	/* ehdr:ei_mag3 */
765088Sab196087 	EHDR_CMD_T_EI_CLASS =		19,	/* ehdr:ei_class */
775088Sab196087 	EHDR_CMD_T_EI_DATA =		20,	/* ehdr:ei_data */
785088Sab196087 	EHDR_CMD_T_EI_VERSION =		21,	/* ehdr:ei_version */
795088Sab196087 	EHDR_CMD_T_EI_OSABI =		22,	/* ehdr:ei_osabi */
805088Sab196087 	EHDR_CMD_T_EI_ABIVERSION =	23	/* ehdr:ei_abiversion */
815088Sab196087 } EHDR_CMD_T;
825088Sab196087 
835088Sab196087 
845088Sab196087 
855088Sab196087 
865088Sab196087 
875088Sab196087 
885088Sab196087 #ifndef _ELF64
895088Sab196087 /*
905088Sab196087  * We supply this function for the msg module
915088Sab196087  */
925088Sab196087 const char *
_ehdr_msg(Msg mid)935088Sab196087 _ehdr_msg(Msg mid)
945088Sab196087 {
955088Sab196087 	return (gettext(MSG_ORIG(mid)));
965088Sab196087 }
975088Sab196087 #endif
985088Sab196087 
995088Sab196087 
1005088Sab196087 /*
1015088Sab196087  * This function is supplied to elfedit through our elfedit_module_t
1025088Sab196087  * definition. It translates the opaque elfedit_i18nhdl_t handles
1035088Sab196087  * in our module interface into the actual strings for elfedit to
1045088Sab196087  * use.
1055088Sab196087  *
1065088Sab196087  * note:
1075088Sab196087  *	This module uses Msg codes for its i18n handle type.
1085088Sab196087  *	So the translation is simply to use MSG_INTL() to turn
1095088Sab196087  *	it into a string and return it.
1105088Sab196087  */
1115088Sab196087 static const char *
mod_i18nhdl_to_str(elfedit_i18nhdl_t hdl)1125088Sab196087 mod_i18nhdl_to_str(elfedit_i18nhdl_t hdl)
1135088Sab196087 {
1145088Sab196087 	Msg msg = (Msg)hdl;
1155088Sab196087 
1165088Sab196087 	return (MSG_INTL(msg));
1175088Sab196087 }
1185088Sab196087 
1195088Sab196087 
1205088Sab196087 
1215088Sab196087 /*
1225088Sab196087  * The ehdr_opt_t enum specifies a bit value for every optional
1235088Sab196087  * argument allowed by a command in this module.
1245088Sab196087  */
1255088Sab196087 typedef enum {
1265088Sab196087 	EHDR_OPT_F_AND =	1,	/* -and: AND (&) values to dest */
1275088Sab196087 	EHDR_OPT_F_CMP =	2,	/* -cmp: Complement (~) values */
1285088Sab196087 	EHDR_OPT_F_OR =		4,	/* -or: OR (|) values to dest */
1295088Sab196087 	EHDR_OPT_F_SHNDX =	8,	/* -shndx: sec argument is index of */
1305088Sab196087 					/*	section, not name */
1315088Sab196087 	EHDR_OPT_F_SHTYP =	16	/* -shtyp: sec argument is type of */
1325088Sab196087 					/*	section, not name */
1335088Sab196087 } ehdr_opt_t;
1345088Sab196087 
1355088Sab196087 
1365088Sab196087 /*
1375088Sab196087  * A variable of type ARGSTATE is used by each command to maintain
1385088Sab196087  * information about the arguments and related things. It is
1395088Sab196087  * initialized by process_args(), and used by the other routines.
1405088Sab196087  */
1415088Sab196087 typedef struct {
1425088Sab196087 	elfedit_obj_state_t	*obj_state;
1435088Sab196087 	ehdr_opt_t		optmask;   	/* Mask of options used */
1445088Sab196087 	int			argc;		/* # of plain arguments */
1455088Sab196087 	const char		**argv;		/* Plain arguments */
1465088Sab196087 } ARGSTATE;
1475088Sab196087 
1485088Sab196087 
1495088Sab196087 
1505088Sab196087 /*
1515088Sab196087  * Standard argument processing for ehdr module
1525088Sab196087  *
1535088Sab196087  * entry
1545088Sab196087  *	obj_state, argc, argv - Standard command arguments
1555088Sab196087  *	argstate - Address of ARGSTATE block to be initialized
1565088Sab196087  *
1575088Sab196087  * exit:
1585088Sab196087  *	On success, *argstate is initialized. On error,
1595088Sab196087  *	an error is issued and this routine does not return.
1605088Sab196087  */
1615088Sab196087 static void
process_args(elfedit_obj_state_t * obj_state,int argc,const char * argv[],ARGSTATE * argstate)1625088Sab196087 process_args(elfedit_obj_state_t *obj_state, int argc, const char *argv[],
1635088Sab196087     ARGSTATE *argstate)
1645088Sab196087 {
1655088Sab196087 	elfedit_getopt_state_t	getopt_state;
1665088Sab196087 	elfedit_getopt_ret_t	*getopt_ret;
1675088Sab196087 
1685088Sab196087 	bzero(argstate, sizeof (*argstate));
1695088Sab196087 	argstate->obj_state = obj_state;
1705088Sab196087 
1715088Sab196087 	elfedit_getopt_init(&getopt_state, &argc, &argv);
1725088Sab196087 	/* Add each new option to the options mask */
1735088Sab196087 	while ((getopt_ret = elfedit_getopt(&getopt_state)) != NULL)
1745088Sab196087 		argstate->optmask |= getopt_ret->gor_idmask;
1755088Sab196087 
1765088Sab196087 	/* If there may be an arbitrary amount of output, use a pager */
1775088Sab196087 	if (argc == 0)
1785088Sab196087 		elfedit_pager_init();
1795088Sab196087 
1805088Sab196087 	/* Return the updated values of argc/argv */
1815088Sab196087 	argstate->argc = argc;
1825088Sab196087 	argstate->argv = argv;
1835088Sab196087 }
1845088Sab196087 
1855088Sab196087 
1865088Sab196087 
1875088Sab196087 
1885088Sab196087 
1895088Sab196087 
1905088Sab196087 /*
1915088Sab196087  * Format the given magic number byte into a buffer
1925088Sab196087  *
1935088Sab196087  * entry:
1945088Sab196087  *	value - Value of the magic value byte given by
1955088Sab196087  *		ehdr->ei_ident[EI_MAG?]
1965088Sab196087  */
1975088Sab196087 static const char *
conv_magic_value(int value)1985088Sab196087 conv_magic_value(int value)
1995088Sab196087 {
2005088Sab196087 	/*
2015088Sab196087 	 * This routine can be called twice within a single C statement,
2025088Sab196087 	 * so we use alternating buffers on each call to allow this
2035088Sab196087 	 * without requiring the caller to supply a buffer (the size of
2045088Sab196087 	 * which they don't know).
2055088Sab196087 	 */
2065088Sab196087 	static char buf1[20];
2075088Sab196087 	static char buf2[20];
2085088Sab196087 	static char *buf;
2095088Sab196087 
2105088Sab196087 	/* Switch buffers */
2115088Sab196087 	buf = (buf == buf1) ? buf2 : buf1;
2125088Sab196087 
2135088Sab196087 	if (isprint(value))
2145088Sab196087 		(void) snprintf(buf, sizeof (buf1),
2155088Sab196087 		    MSG_ORIG(MSG_FMT_HEXNUM_QCHR), value, value);
2165088Sab196087 	else
2175088Sab196087 		(void) snprintf(buf, sizeof (buf1),
2185088Sab196087 		    MSG_ORIG(MSG_FMT_HEXNUM), value);
2195088Sab196087 	return (buf);
2205088Sab196087 }
2215088Sab196087 
2225088Sab196087 
2235088Sab196087 
2245088Sab196087 /*
2255088Sab196087  * Print ELF header values, taking the calling command, and output style
2265088Sab196087  * into account.
2275088Sab196087  *
2285088Sab196087  * entry:
2295088Sab196087  *	cmd - EHDR_CMD_T_* value giving identify of caller
2305088Sab196087  *	e_ident_ndx - Ignored unless cmd is EHDR_CMD_T_E_IDENT. In IDENT
2315088Sab196087  *		case, index of item in e_ident[] array to display, or
2325088Sab196087  *		-1 to display the entire array.
2335088Sab196087  *	autoprint - If True, output is only produced if the elfedit
2345088Sab196087  *		autoprint flag is set. If False, output is always produced.
2355088Sab196087  *	argstate - Argument state block
2365088Sab196087  */
2375088Sab196087 static void
print_ehdr(EHDR_CMD_T cmd,int e_ident_ndx,int autoprint,ARGSTATE * argstate)2385088Sab196087 print_ehdr(EHDR_CMD_T cmd, int e_ident_ndx, int autoprint,
2395088Sab196087     ARGSTATE *argstate)
2405088Sab196087 {
2415088Sab196087 	elfedit_outstyle_t	outstyle;
2425088Sab196087 	Conv_fmt_flags_t	flags_fmt_flags = 0;
2435088Sab196087 	Ehdr		*ehdr;
2445088Sab196087 	int		c;
2455088Sab196087 	Conv_inv_buf_t	inv_buf;
2465088Sab196087 
2475088Sab196087 	if (autoprint && ((elfedit_flags() & ELFEDIT_F_AUTOPRINT) == 0))
2485088Sab196087 		return;
2495088Sab196087 
2505088Sab196087 	/*
2515088Sab196087 	 * Pick an output style. ehdr:dump is required to use the default
2525088Sab196087 	 * style. The other commands use the current output style.
2535088Sab196087 	 */
2545088Sab196087 	if (cmd == EHDR_CMD_T_DUMP) {
2555088Sab196087 		outstyle = ELFEDIT_OUTSTYLE_DEFAULT;
2565088Sab196087 	} else {
2575088Sab196087 		outstyle = elfedit_outstyle();
2585088Sab196087 
2595088Sab196087 		/*
2605088Sab196087 		 * When the caller specifies the simple output style,
2615088Sab196087 		 * omit the brackets from around the values.
2625088Sab196087 		 */
2635088Sab196087 		if (outstyle == ELFEDIT_OUTSTYLE_SIMPLE)
2645088Sab196087 			flags_fmt_flags = CONV_FMT_NOBKT;
2655088Sab196087 
2665088Sab196087 		/*
2675088Sab196087 		 * For things that show a single header item, switch
2685088Sab196087 		 * from default to simple mode.
2695088Sab196087 		 */
2705088Sab196087 		if ((outstyle == ELFEDIT_OUTSTYLE_DEFAULT) &&
2715088Sab196087 		    ((cmd != EHDR_CMD_T_E_IDENT) || (e_ident_ndx != -1)))
2725088Sab196087 			outstyle = ELFEDIT_OUTSTYLE_SIMPLE;
2735088Sab196087 	}
2745088Sab196087 
2755088Sab196087 	ehdr = argstate->obj_state->os_ehdr;
2765088Sab196087 
2775088Sab196087 	/*
2785088Sab196087 	 * If doing default output, use elfdump style where we
2795088Sab196087 	 * show the full ELF header. In this case, the command
2805088Sab196087 	 * that called us doesn't matter. This can only happen
2815088Sab196087 	 * from ehdr:dump or ehdr:e_ident/
2825088Sab196087 	 */
2835088Sab196087 	if (outstyle == ELFEDIT_OUTSTYLE_DEFAULT) {
2845088Sab196087 		const char *ndx, *value;
2855088Sab196087 		char ndx_buf[64], value_buf[20];
2865088Sab196087 		int i;
2875088Sab196087 
2885088Sab196087 		if (cmd == EHDR_CMD_T_DUMP) {
2895088Sab196087 			Elf_ehdr(NULL, ehdr,
2905088Sab196087 			    argstate->obj_state->os_secarr[0].sec_shdr);
2915088Sab196087 			elfedit_printf(MSG_ORIG(MSG_STR_NL));
2925088Sab196087 		}
2935088Sab196087 
2945088Sab196087 		/*
2955088Sab196087 		 * Elf_ehdr() does not display all of e_ident[], so we
2965088Sab196087 		 * augment by displaying the entire array separately.
2975088Sab196087 		 */
2985088Sab196087 		elfedit_printf(MSG_ORIG(MSG_STR_EIDENT_HDR));
2995088Sab196087 
3005088Sab196087 		for (i = 0; i < EI_NIDENT; i++) {
3015088Sab196087 			ndx = value = NULL;
3025088Sab196087 
3035088Sab196087 			switch (i) {
3045088Sab196087 			case EI_MAG0:
3055088Sab196087 			case EI_MAG1:
3065088Sab196087 			case EI_MAG2:
3075088Sab196087 			case EI_MAG3:
3085088Sab196087 				ndx = elfedit_atoconst_value_to_str(
3095088Sab196087 				    ELFEDIT_CONST_EI, i, 1);
3105088Sab196087 				value = conv_magic_value(ehdr->e_ident[i]);
3115088Sab196087 				break;
3125088Sab196087 			case EI_CLASS:
3135088Sab196087 				ndx = elfedit_atoconst_value_to_str(
3145088Sab196087 				    ELFEDIT_CONST_EI, EI_CLASS, 1);
3155088Sab196087 				value = conv_ehdr_class(ehdr->e_ident[EI_CLASS],
3165088Sab196087 				    0, &inv_buf);
3175088Sab196087 				break;
3185088Sab196087 			case EI_DATA:
3195088Sab196087 				ndx = elfedit_atoconst_value_to_str(
3205088Sab196087 				    ELFEDIT_CONST_EI, EI_DATA, 1);
3215088Sab196087 				value = conv_ehdr_data(ehdr->e_ident[EI_DATA],
3225088Sab196087 				    0, &inv_buf);
3235088Sab196087 				break;
3245088Sab196087 			case EI_VERSION:
3255088Sab196087 				ndx = elfedit_atoconst_value_to_str(
3265088Sab196087 				    ELFEDIT_CONST_EI, EI_VERSION, 1);
3275088Sab196087 				value = conv_ehdr_vers(
3285088Sab196087 				    ehdr->e_ident[EI_VERSION], 0, &inv_buf);
3295088Sab196087 				break;
3305088Sab196087 			case EI_OSABI:
3315088Sab196087 				ndx = elfedit_atoconst_value_to_str(
3325088Sab196087 				    ELFEDIT_CONST_EI, EI_OSABI, 1);
3335088Sab196087 				value = conv_ehdr_osabi(ehdr->e_ident[EI_OSABI],
3345088Sab196087 				    0, &inv_buf);
3355088Sab196087 				break;
3365088Sab196087 			case EI_ABIVERSION:
3375088Sab196087 				ndx = elfedit_atoconst_value_to_str(
3385088Sab196087 				    ELFEDIT_CONST_EI, EI_ABIVERSION, 1);
339*9273SAli.Bahrami@Sun.COM 				value = conv_ehdr_abivers(
340*9273SAli.Bahrami@Sun.COM 				    ehdr->e_ident[EI_OSABI],
341*9273SAli.Bahrami@Sun.COM 				    ehdr->e_ident[EI_ABIVERSION],
342*9273SAli.Bahrami@Sun.COM 				    CONV_FMT_DECIMAL, &inv_buf);
3435088Sab196087 				break;
3445088Sab196087 			default:
3455088Sab196087 				value = value_buf;
3465088Sab196087 				(void) snprintf(value_buf, sizeof (value_buf),
3475088Sab196087 				    MSG_ORIG(MSG_FMT_HEXNUM), ehdr->e_ident[i]);
3485088Sab196087 				break;
3495088Sab196087 			}
3505088Sab196087 
3515088Sab196087 			if (ndx == NULL)
3525088Sab196087 				(void) snprintf(ndx_buf, sizeof (ndx_buf),
3535088Sab196087 				    MSG_ORIG(MSG_FMT_BKTINT), i);
3545088Sab196087 			else
3555088Sab196087 				(void) snprintf(ndx_buf, sizeof (ndx_buf),
3565088Sab196087 				    MSG_ORIG(MSG_FMT_BKTSTR), ndx);
3575088Sab196087 			elfedit_printf(MSG_ORIG(MSG_FMT_EI_ELT),
3585088Sab196087 			    ndx_buf, value);
3595088Sab196087 		}
3605088Sab196087 		return;
3615088Sab196087 	}
3625088Sab196087 
3635088Sab196087 
3645088Sab196087 	switch (cmd) {
3655088Sab196087 	case EHDR_CMD_T_E_IDENT:
3665088Sab196087 		{
3675088Sab196087 			int		i, cnt;
3685088Sab196087 
3695088Sab196087 			/* Show one element, or the entire thing? */
3705088Sab196087 			if (e_ident_ndx == -1) {
3715088Sab196087 				i = 0;
3725088Sab196087 				cnt = EI_NIDENT;
3735088Sab196087 			} else {
3745088Sab196087 				i = e_ident_ndx;
3755088Sab196087 				cnt = 1;
3765088Sab196087 			}
3775088Sab196087 
3785088Sab196087 			for (; cnt-- > 0; i++) {
3795088Sab196087 				/*
3805088Sab196087 				 * If using numeric style, or there is
3815088Sab196087 				 * no conversion routine for this item,
3825088Sab196087 				 * print a simple hex value.
3835088Sab196087 				 */
3845088Sab196087 				if ((outstyle == ELFEDIT_OUTSTYLE_NUM) ||
385*9273SAli.Bahrami@Sun.COM 				    (i > EI_ABIVERSION)) {
3865088Sab196087 					elfedit_printf(
3875088Sab196087 					    MSG_ORIG(MSG_FMT_HEXNUMNL),
3885088Sab196087 					    ehdr->e_ident[i]);
3895088Sab196087 					continue;
3905088Sab196087 				}
3915088Sab196087 
3925088Sab196087 				/* Handle special cases in simple mode */
3935088Sab196087 				switch (i) {
3945088Sab196087 				case EI_MAG0:
3955088Sab196087 				case EI_MAG1:
3965088Sab196087 				case EI_MAG2:
3975088Sab196087 				case EI_MAG3:
3985088Sab196087 					elfedit_printf(MSG_ORIG(MSG_FMT_STRNL),
3995088Sab196087 					    conv_magic_value(ehdr->e_ident[i]));
4005088Sab196087 					continue;
4015088Sab196087 				case EI_CLASS:
4025088Sab196087 					elfedit_printf(MSG_ORIG(MSG_FMT_STRNL),
4035088Sab196087 					    conv_ehdr_class(
4045088Sab196087 					    ehdr->e_ident[EI_CLASS], 0,
4055088Sab196087 					    &inv_buf));
4065088Sab196087 					continue;
4075088Sab196087 				case EI_DATA:
4085088Sab196087 					elfedit_printf(MSG_ORIG(MSG_FMT_STRNL),
4095088Sab196087 					    conv_ehdr_data(
4105088Sab196087 					    ehdr->e_ident[EI_DATA], 0,
4115088Sab196087 					    &inv_buf));
4125088Sab196087 					continue;
4135088Sab196087 				case EI_VERSION:
4145088Sab196087 					elfedit_printf(MSG_ORIG(MSG_FMT_STRNL),
4155088Sab196087 					    conv_ehdr_vers(
4165088Sab196087 					    ehdr->e_ident[EI_VERSION], 0,
4175088Sab196087 					    &inv_buf));
4185088Sab196087 					continue;
4195088Sab196087 				case EI_OSABI:
4205088Sab196087 					elfedit_printf(MSG_ORIG(MSG_FMT_STRNL),
4215088Sab196087 					    conv_ehdr_osabi(
4225088Sab196087 					    ehdr->e_ident[EI_OSABI], 0,
4235088Sab196087 					    &inv_buf));
4245088Sab196087 					continue;
425*9273SAli.Bahrami@Sun.COM 				case EI_ABIVERSION:
426*9273SAli.Bahrami@Sun.COM 					elfedit_printf(MSG_ORIG(MSG_FMT_STRNL),
427*9273SAli.Bahrami@Sun.COM 					    conv_ehdr_abivers(
428*9273SAli.Bahrami@Sun.COM 					    ehdr->e_ident[EI_OSABI],
429*9273SAli.Bahrami@Sun.COM 					    ehdr->e_ident[EI_ABIVERSION],
430*9273SAli.Bahrami@Sun.COM 					    CONV_FMT_DECIMAL, &inv_buf));
431*9273SAli.Bahrami@Sun.COM 					continue;
4325088Sab196087 				}
4335088Sab196087 			}
4345088Sab196087 		}
4355088Sab196087 		return;
4365088Sab196087 
4375088Sab196087 	case EHDR_CMD_T_E_TYPE:
4385088Sab196087 		if (outstyle == ELFEDIT_OUTSTYLE_SIMPLE)
4395088Sab196087 			elfedit_printf(MSG_ORIG(MSG_FMT_STRNL),
440*9273SAli.Bahrami@Sun.COM 			    conv_ehdr_type(ehdr->e_ident[EI_OSABI],
441*9273SAli.Bahrami@Sun.COM 			    ehdr->e_type, 0, &inv_buf));
4425088Sab196087 		else
4435088Sab196087 			elfedit_printf(MSG_ORIG(MSG_FMT_DECNUMNL),
4445088Sab196087 			    ehdr->e_type);
4455088Sab196087 		return;
4465088Sab196087 
4475088Sab196087 	case EHDR_CMD_T_E_MACHINE:
4485088Sab196087 		if (outstyle == ELFEDIT_OUTSTYLE_SIMPLE) {
4495088Sab196087 			elfedit_printf(MSG_ORIG(MSG_FMT_STRNL),
4505088Sab196087 			    conv_ehdr_mach(ehdr->e_machine, 0, &inv_buf));
4515088Sab196087 		} else {
4525088Sab196087 			elfedit_printf(MSG_ORIG(MSG_FMT_DECNUMNL),
4535088Sab196087 			    EC_WORD(ehdr->e_machine));
4545088Sab196087 		}
4555088Sab196087 		return;
4565088Sab196087 
4575088Sab196087 	case EHDR_CMD_T_E_VERSION:
4585088Sab196087 		if (outstyle == ELFEDIT_OUTSTYLE_SIMPLE)
4595088Sab196087 			elfedit_printf(MSG_ORIG(MSG_FMT_STRNL),
4605088Sab196087 			    conv_ehdr_vers(ehdr->e_version, 0, &inv_buf));
4615088Sab196087 		else
4625088Sab196087 			elfedit_printf(MSG_ORIG(MSG_FMT_DECNUMNL),
4635088Sab196087 			    ehdr->e_version);
4645088Sab196087 		return;
4655088Sab196087 
4665088Sab196087 	case EHDR_CMD_T_E_ENTRY:
4675088Sab196087 		elfedit_printf(MSG_ORIG(MSG_FMT_HEXNUMNL),
4685088Sab196087 		    EC_WORD(ehdr->e_entry));
4695088Sab196087 		return;
4705088Sab196087 
4715088Sab196087 	case EHDR_CMD_T_E_PHOFF:
4725088Sab196087 		elfedit_printf(MSG_ORIG(MSG_FMT_HEXNUMNL),
4735088Sab196087 		    EC_WORD(ehdr->e_phoff));
4745088Sab196087 		return;
4755088Sab196087 
4765088Sab196087 	case EHDR_CMD_T_E_SHOFF:
4775088Sab196087 		elfedit_printf(MSG_ORIG(MSG_FMT_HEXNUMNL),
4785088Sab196087 		    EC_WORD(ehdr->e_shoff));
4795088Sab196087 		return;
4805088Sab196087 
4815088Sab196087 	case EHDR_CMD_T_E_FLAGS:
4825088Sab196087 		if (outstyle == ELFEDIT_OUTSTYLE_SIMPLE) {
4835088Sab196087 			Conv_ehdr_flags_buf_t	flags_buf;
4845088Sab196087 
4855088Sab196087 			elfedit_printf(MSG_ORIG(MSG_FMT_STRNL),
4865088Sab196087 			    conv_ehdr_flags(ehdr->e_machine, ehdr->e_flags,
4875088Sab196087 			    flags_fmt_flags, &flags_buf));
4885088Sab196087 		} else {
4895088Sab196087 			elfedit_printf(MSG_ORIG(MSG_FMT_HEXNUMNL),
4905088Sab196087 			    ehdr->e_flags);
4915088Sab196087 		}
4925088Sab196087 		return;
4935088Sab196087 
4945088Sab196087 	case EHDR_CMD_T_E_EHSIZE:
4955088Sab196087 		elfedit_printf(MSG_ORIG(MSG_FMT_DECNUMNL),
4965088Sab196087 		    EC_WORD(ehdr->e_ehsize));
4975088Sab196087 		return;
4985088Sab196087 
4995088Sab196087 	case EHDR_CMD_T_E_PHENTSIZE:
5005088Sab196087 		elfedit_printf(MSG_ORIG(MSG_FMT_DECNUMNL),
5015088Sab196087 		    EC_WORD(ehdr->e_phentsize));
5025088Sab196087 		return;
5035088Sab196087 
5045088Sab196087 	case EHDR_CMD_T_E_PHNUM:
5055088Sab196087 		{
5065088Sab196087 			Word num = ehdr->e_phnum;
5075088Sab196087 
5085088Sab196087 			/*
5095088Sab196087 			 * If using extended indexes, fetch the real
5105088Sab196087 			 * value from shdr[0].sh_info
5115088Sab196087 			 */
5125088Sab196087 			if (num == PN_XNUM)
5135088Sab196087 				num = argstate->obj_state->
5145088Sab196087 				    os_secarr[0].sec_shdr->sh_info;
5155088Sab196087 
5165088Sab196087 			elfedit_printf(MSG_ORIG(MSG_FMT_DECNUMNL),
5175088Sab196087 			    EC_WORD(num));
5185088Sab196087 		}
5195088Sab196087 		return;
5205088Sab196087 
5215088Sab196087 	case EHDR_CMD_T_E_SHENTSIZE:
5225088Sab196087 		elfedit_printf(MSG_ORIG(MSG_FMT_DECNUMNL),
5235088Sab196087 		    EC_WORD(ehdr->e_shentsize));
5245088Sab196087 		return;
5255088Sab196087 
5265088Sab196087 	case EHDR_CMD_T_E_SHNUM:
5275088Sab196087 		{
5285088Sab196087 			Word num = ehdr->e_shnum;
5295088Sab196087 
5305088Sab196087 			/*
5315088Sab196087 			 * If using extended indexes, fetch the real
5325088Sab196087 			 * value from shdr[0].sh_size
5335088Sab196087 			 */
5345088Sab196087 			if (num == 0)
5355088Sab196087 				num = argstate->obj_state->
5365088Sab196087 				    os_secarr[0].sec_shdr->sh_size;
5375088Sab196087 
5385088Sab196087 			elfedit_printf(MSG_ORIG(MSG_FMT_DECNUMNL),
5395088Sab196087 			    EC_WORD(num));
5405088Sab196087 		}
5415088Sab196087 		return;
5425088Sab196087 
5435088Sab196087 	case EHDR_CMD_T_E_SHSTRNDX:
5445088Sab196087 		{
5455088Sab196087 			Word num = ehdr->e_shstrndx;
5465088Sab196087 
5475088Sab196087 			/*
5485088Sab196087 			 * If using extended indexes, fetch the real
5495088Sab196087 			 * value from shdr[0].sh_link
5505088Sab196087 			 */
5515088Sab196087 			if (num == SHN_XINDEX)
5525088Sab196087 				num = argstate->obj_state->
5535088Sab196087 				    os_secarr[0].sec_shdr->sh_link;
5545088Sab196087 
5555088Sab196087 			elfedit_printf(MSG_ORIG(MSG_FMT_DECNUMNL),
5565088Sab196087 			    EC_WORD(num));
5575088Sab196087 		}
5585088Sab196087 		return;
5595088Sab196087 
5605088Sab196087 	case EHDR_CMD_T_EI_MAG0:
5615088Sab196087 	case EHDR_CMD_T_EI_MAG1:
5625088Sab196087 	case EHDR_CMD_T_EI_MAG2:
5635088Sab196087 	case EHDR_CMD_T_EI_MAG3:
5645088Sab196087 		/* This depends on EHDR_CMD_T_EI_MAG[0-3] being contiguous */
5655088Sab196087 		c = ehdr->e_ident[cmd - EHDR_CMD_T_EI_MAG0];
5665088Sab196087 		if (outstyle == ELFEDIT_OUTSTYLE_SIMPLE)
5675088Sab196087 			elfedit_printf(MSG_ORIG(MSG_FMT_STRNL),
5685088Sab196087 			    conv_magic_value(c));
5695088Sab196087 		else
5705088Sab196087 			elfedit_printf(MSG_ORIG(MSG_FMT_HEXNUMNL), c);
5715088Sab196087 		return;
5725088Sab196087 
5735088Sab196087 	case EHDR_CMD_T_EI_CLASS:
5745088Sab196087 		c = ehdr->e_ident[EI_CLASS];
5755088Sab196087 		if (outstyle == ELFEDIT_OUTSTYLE_SIMPLE)
5765088Sab196087 			elfedit_printf(MSG_ORIG(MSG_FMT_STRNL),
5775088Sab196087 			    conv_ehdr_class(c, 0, &inv_buf));
5785088Sab196087 		else
5795088Sab196087 			elfedit_printf(MSG_ORIG(MSG_FMT_HEXNUMNL), c);
5805088Sab196087 		return;
5815088Sab196087 
5825088Sab196087 	case EHDR_CMD_T_EI_DATA:
5835088Sab196087 		c = ehdr->e_ident[EI_DATA];
5845088Sab196087 		if (outstyle == ELFEDIT_OUTSTYLE_SIMPLE)
5855088Sab196087 			elfedit_printf(MSG_ORIG(MSG_FMT_STRNL),
5865088Sab196087 			    conv_ehdr_data(c, 0, &inv_buf));
5875088Sab196087 		else
5885088Sab196087 			elfedit_printf(MSG_ORIG(MSG_FMT_HEXNUMNL), c);
5895088Sab196087 		return;
5905088Sab196087 
5915088Sab196087 	case EHDR_CMD_T_EI_VERSION:
5925088Sab196087 		c = ehdr->e_ident[EI_VERSION];
5935088Sab196087 		if (outstyle == ELFEDIT_OUTSTYLE_SIMPLE)
5945088Sab196087 			elfedit_printf(MSG_ORIG(MSG_FMT_STRNL),
5955088Sab196087 			    conv_ehdr_vers(c, 0, &inv_buf));
5965088Sab196087 		else
5975088Sab196087 			elfedit_printf(MSG_ORIG(MSG_FMT_HEXNUMNL), c);
5985088Sab196087 		return;
5995088Sab196087 
6005088Sab196087 	case EHDR_CMD_T_EI_OSABI:
6015088Sab196087 		c = ehdr->e_ident[EI_OSABI];
6025088Sab196087 		if (outstyle == ELFEDIT_OUTSTYLE_SIMPLE) {
6035088Sab196087 			elfedit_printf(MSG_ORIG(MSG_FMT_STRNL),
6045088Sab196087 			    conv_ehdr_osabi(c, 0, &inv_buf));
6055088Sab196087 		} else {
6065088Sab196087 			elfedit_printf(MSG_ORIG(MSG_FMT_HEXNUMNL),
6075088Sab196087 			    EC_WORD(c));
6085088Sab196087 		}
6095088Sab196087 		return;
6105088Sab196087 
6115088Sab196087 	case EHDR_CMD_T_EI_ABIVERSION:
612*9273SAli.Bahrami@Sun.COM 		c = ehdr->e_ident[EI_ABIVERSION];
613*9273SAli.Bahrami@Sun.COM 		if (outstyle == ELFEDIT_OUTSTYLE_SIMPLE) {
614*9273SAli.Bahrami@Sun.COM 			elfedit_printf(MSG_ORIG(MSG_FMT_STRNL),
615*9273SAli.Bahrami@Sun.COM 			    conv_ehdr_abivers(ehdr->e_ident[EI_OSABI],
616*9273SAli.Bahrami@Sun.COM 			    c, CONV_FMT_DECIMAL, &inv_buf));
617*9273SAli.Bahrami@Sun.COM 		} else {
618*9273SAli.Bahrami@Sun.COM 			elfedit_printf(MSG_ORIG(MSG_FMT_HEXNUMNL),
619*9273SAli.Bahrami@Sun.COM 			    EC_WORD(c));
620*9273SAli.Bahrami@Sun.COM 		}
6215088Sab196087 		return;
6225088Sab196087 	}
6235088Sab196087 }
6245088Sab196087 
6255088Sab196087 
6265088Sab196087 /*
6275088Sab196087  * Common body for the ehdr: module commands. These commands
6285088Sab196087  * share a large amount of common behavior, so it is convenient
6295088Sab196087  * to centralize things and use the cmd argument to handle the
6305088Sab196087  * small differences.
6315088Sab196087  *
6325088Sab196087  * entry:
6335088Sab196087  *	cmd - One of the EHDR_CMD_T_* constants listed above, specifying
6345088Sab196087  *		which command to implement.
6355088Sab196087  *	obj_state, argc, argv - Standard command arguments
6365088Sab196087  */
6375088Sab196087 static elfedit_cmdret_t
cmd_body(EHDR_CMD_T cmd,elfedit_obj_state_t * obj_state,int argc,const char * argv[])6385088Sab196087 cmd_body(EHDR_CMD_T cmd, elfedit_obj_state_t *obj_state,
6395088Sab196087     int argc, const char *argv[])
6405088Sab196087 {
6415088Sab196087 	/*
6425088Sab196087 	 * When a call comes in for ehdr:e_ident[ndx], and the
6435088Sab196087 	 * specified element is one that we have a special command
6445088Sab196087 	 * for, then we revector to that special command instead
6455088Sab196087 	 * of using the generic ehdr:e_ident processing. This array,
6465088Sab196087 	 * which is indexed by the e_ident[] index value is used
6475088Sab196087 	 * to decide if that is the case. If the resulting value
6485088Sab196087 	 * is EHDR_CMD_T_E_IDENT, then the generic processing is
6495088Sab196087 	 * used. Otherwise, we revector to the specified command.
6505088Sab196087 	 */
6515088Sab196087 	static const int e_ident_revector[16] = {
6525088Sab196087 		EHDR_CMD_T_EI_MAG0,		/* 0: EI_MAG0 */
6535088Sab196087 		EHDR_CMD_T_EI_MAG1,		/* 1: EI_MAG1 */
6545088Sab196087 		EHDR_CMD_T_EI_MAG2,		/* 2: EI_MAG2 */
6555088Sab196087 		EHDR_CMD_T_EI_MAG3,		/* 3: EI_MAG3 */
6565088Sab196087 		EHDR_CMD_T_EI_CLASS,		/* 4: EI_CLASS */
6575088Sab196087 		EHDR_CMD_T_EI_DATA,		/* 5: EI_DATA */
6585088Sab196087 		EHDR_CMD_T_EI_VERSION,		/* 6: EI_VERSION */
6595088Sab196087 		EHDR_CMD_T_EI_OSABI,		/* 7: EI_OSABI */
6605088Sab196087 		EHDR_CMD_T_EI_ABIVERSION,	/* 8: EI_ABIVERSION */
6615088Sab196087 		EHDR_CMD_T_E_IDENT,		/* 9: generic */
6625088Sab196087 		EHDR_CMD_T_E_IDENT,		/* 10: generic */
6635088Sab196087 		EHDR_CMD_T_E_IDENT,		/* 11: generic */
6645088Sab196087 		EHDR_CMD_T_E_IDENT,		/* 12: generic */
6655088Sab196087 		EHDR_CMD_T_E_IDENT,		/* 13: generic */
6665088Sab196087 		EHDR_CMD_T_E_IDENT,		/* 14: generic */
6675088Sab196087 		EHDR_CMD_T_E_IDENT,		/* 15: generic */
6685088Sab196087 	};
6695088Sab196087 
6705088Sab196087 
6715088Sab196087 	ARGSTATE		argstate;
6725088Sab196087 	Ehdr			*ehdr;
6735088Sab196087 	elfedit_cmdret_t	ret = ELFEDIT_CMDRET_NONE;
6745088Sab196087 	int			e_ident_ndx = -1;
6755088Sab196087 	Conv_inv_buf_t		inv_buf1, inv_buf2;
6765088Sab196087 
6775088Sab196087 	/* Process the optional arguments */
6785088Sab196087 	process_args(obj_state, argc, argv, &argstate);
6795088Sab196087 
6805088Sab196087 	/* Check number of arguments */
6815088Sab196087 	switch (cmd) {
6825088Sab196087 	case EHDR_CMD_T_DUMP:
6835088Sab196087 		/* ehdr:dump does not accept arguments */
6845088Sab196087 		if (argstate.argc > 0)
6855088Sab196087 			elfedit_command_usage();
6865088Sab196087 		break;
6875088Sab196087 	case EHDR_CMD_T_E_IDENT:
6885088Sab196087 		/*
6895088Sab196087 		 * ehdr:e_ident accepts 1 or 2 arguments, the first
6905088Sab196087 		 * being the index into the array, and the second being
6915088Sab196087 		 * the value. If there are arguments, then process the
6925088Sab196087 		 * index, and remove it from the argument list.
6935088Sab196087 		 */
6945088Sab196087 		if (argstate.argc > 0) {
6955088Sab196087 			if (argstate.argc > 2)
6965088Sab196087 				elfedit_command_usage();
6975088Sab196087 			e_ident_ndx = (int)
6985088Sab196087 			    elfedit_atoconst_range(argstate.argv[0],
6995088Sab196087 			    MSG_ORIG(MSG_STR_INDEX), 0, EI_NIDENT - 1,
7005088Sab196087 			    ELFEDIT_CONST_EI);
7015088Sab196087 			argstate.argc--;
7025088Sab196087 			argstate.argv++;
7035088Sab196087 
7045088Sab196087 			/*
7055088Sab196087 			 * If the index is for one of the e_ident elements
7065088Sab196087 			 * that we have a special command for, then switch
7075088Sab196087 			 * to that command. e_ident_revector[] returns
7085088Sab196087 			 * EHDR_CMD_T_E_IDENT in the cases where such a command
7095088Sab196087 			 * does not exist, in which case we'll continue with the
7105088Sab196087 			 * generic code.
7115088Sab196087 			 */
7125088Sab196087 			cmd = e_ident_revector[e_ident_ndx];
7135088Sab196087 		}
7145088Sab196087 		break;
7155088Sab196087 	case EHDR_CMD_T_E_FLAGS:
7165088Sab196087 		/* ehdr:e_flags accepts an arbitrary number of arguments */
7175088Sab196087 		break;
7185088Sab196087 	default:
7195088Sab196087 		/* The remaining commands accept a single optional argument */
7205088Sab196087 		if (argstate.argc > 1)
7215088Sab196087 			elfedit_command_usage();
7225088Sab196087 		break;
7235088Sab196087 	}
7245088Sab196087 
7255088Sab196087 	/* If there are no arguments, dump the ELF header and return */
7265088Sab196087 	if (argstate.argc == 0) {
7275088Sab196087 		print_ehdr(cmd, e_ident_ndx, 0, &argstate);
7285088Sab196087 		return (ELFEDIT_CMDRET_NONE);
7295088Sab196087 	}
7305088Sab196087 
7315088Sab196087 	ehdr = obj_state->os_ehdr;
7325088Sab196087 	switch (cmd) {
7335088Sab196087 		/*
7345088Sab196087 		 * EHDR_CMD_T_DUMP can't get here: It never has an
7355088Sab196087 		 * argument, and is handled above.
7365088Sab196087 		 */
7375088Sab196087 
7385088Sab196087 	case EHDR_CMD_T_E_IDENT:
7395088Sab196087 		{
7405088Sab196087 			/*
7415088Sab196087 			 * Only those e_ident[] elements for which we
7425088Sab196087 			 * don't have a specialized command come here.
7435088Sab196087 			 * The argument is a value to be set in
7445088Sab196087 			 * e_ident[e_ident_ndx].
7455088Sab196087 			 */
7465088Sab196087 			uchar_t value = (uchar_t)
7475088Sab196087 			    elfedit_atoui_range(argstate.argv[0],
7485088Sab196087 			    MSG_ORIG(MSG_STR_VALUE), 0, 255, NULL);
7495088Sab196087 
7505088Sab196087 			if (ehdr->e_ident[e_ident_ndx] == value) {
7515088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
7525088Sab196087 				    MSG_INTL(MSG_DEBUG_EI_D_X_OK),
7535088Sab196087 				    e_ident_ndx, EC_WORD(value));
7545088Sab196087 			} else {
7555088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
7565088Sab196087 				    MSG_INTL(MSG_DEBUG_EI_D_X_CHG),
7575088Sab196087 				    e_ident_ndx, ehdr->e_ident[e_ident_ndx],
7585088Sab196087 				    value);
7595088Sab196087 				ret = ELFEDIT_CMDRET_MOD;
7605088Sab196087 				ehdr->e_ident[e_ident_ndx] = value;
7615088Sab196087 			}
7625088Sab196087 		}
7635088Sab196087 		break;
7645088Sab196087 
7655088Sab196087 	case EHDR_CMD_T_E_TYPE:
7665088Sab196087 		{
7675088Sab196087 			/* The argument gives the object type */
7685088Sab196087 			Half type = (Half) elfedit_atoconst(argstate.argv[0],
7695088Sab196087 			    ELFEDIT_CONST_ET);
7705088Sab196087 			const char *name = MSG_ORIG(MSG_CMD_E_TYPE);
7715088Sab196087 
7725088Sab196087 			if (ehdr->e_type == type) {
7735088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
7745088Sab196087 				    MSG_INTL(MSG_DEBUG_E_S_OK), name,
775*9273SAli.Bahrami@Sun.COM 				    conv_ehdr_type(ehdr->e_ident[EI_OSABI],
776*9273SAli.Bahrami@Sun.COM 				    ehdr->e_type, 0, &inv_buf1));
7775088Sab196087 			} else {
7785088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
7795088Sab196087 				    MSG_INTL(MSG_DEBUG_E_S_CHG), name,
780*9273SAli.Bahrami@Sun.COM 				    conv_ehdr_type(ehdr->e_ident[EI_OSABI],
781*9273SAli.Bahrami@Sun.COM 				    ehdr->e_type, 0, &inv_buf1),
782*9273SAli.Bahrami@Sun.COM 				    conv_ehdr_type(ehdr->e_ident[EI_OSABI],
783*9273SAli.Bahrami@Sun.COM 				    type, 0, &inv_buf2));
7845088Sab196087 				ret = ELFEDIT_CMDRET_MOD;
7855088Sab196087 				ehdr->e_type = type;
7865088Sab196087 			}
7875088Sab196087 		}
7885088Sab196087 		break;
7895088Sab196087 
7905088Sab196087 	case EHDR_CMD_T_E_MACHINE:
7915088Sab196087 		{
7925088Sab196087 			/* The argument gives the machine code */
7935088Sab196087 			Half mach = (Half) elfedit_atoconst(argstate.argv[0],
7945088Sab196087 			    ELFEDIT_CONST_EM);
7955088Sab196087 			const char *name = MSG_ORIG(MSG_CMD_E_MACHINE);
7965088Sab196087 
7975088Sab196087 			if (ehdr->e_machine == mach) {
7985088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
7995088Sab196087 				    MSG_INTL(MSG_DEBUG_E_S_OK), name,
8005088Sab196087 				    conv_ehdr_mach(ehdr->e_machine, 0,
8015088Sab196087 				    &inv_buf1));
8025088Sab196087 			} else {
8035088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
8045088Sab196087 				    MSG_INTL(MSG_DEBUG_E_S_CHG), name,
8055088Sab196087 				    conv_ehdr_mach(ehdr->e_machine, 0,
8065088Sab196087 				    &inv_buf1),
8075088Sab196087 				    conv_ehdr_mach(mach, 0, &inv_buf2));
808*9273SAli.Bahrami@Sun.COM 				ret = ELFEDIT_CMDRET_MOD_OS_MACH;
8095088Sab196087 				ehdr->e_machine = mach;
810*9273SAli.Bahrami@Sun.COM 
8115088Sab196087 			}
8125088Sab196087 		}
8135088Sab196087 		break;
8145088Sab196087 
8155088Sab196087 	case EHDR_CMD_T_E_VERSION:
8165088Sab196087 		{
8175088Sab196087 			/* The argument gives the version */
8185088Sab196087 			Word ver = (Word) elfedit_atoconst(argstate.argv[0],
8195088Sab196087 			    ELFEDIT_CONST_EV);
8205088Sab196087 			const char *name = MSG_ORIG(MSG_CMD_E_VERSION);
8215088Sab196087 
8225088Sab196087 			if (ehdr->e_version == ver) {
8235088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
8245088Sab196087 				    MSG_INTL(MSG_DEBUG_E_S_OK), name,
8255088Sab196087 				    conv_ehdr_vers(ehdr->e_version, 0,
8265088Sab196087 				    &inv_buf1));
8275088Sab196087 			} else {
8285088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
8295088Sab196087 				    MSG_INTL(MSG_DEBUG_E_S_CHG), name,
8305088Sab196087 				    conv_ehdr_vers(ehdr->e_version, 0,
8315088Sab196087 				    &inv_buf1),
8325088Sab196087 				    conv_ehdr_vers(ver, 0, &inv_buf2));
8335088Sab196087 				ret = ELFEDIT_CMDRET_MOD;
8345088Sab196087 				ehdr->e_version = ver;
8355088Sab196087 			}
8365088Sab196087 		}
8375088Sab196087 		break;
8385088Sab196087 
8395088Sab196087 	case EHDR_CMD_T_E_ENTRY:
8405088Sab196087 		{
8415088Sab196087 			/* The argument gives the entry address */
8425088Sab196087 			Addr entry = (Addr)
8435088Sab196087 			    elfedit_atoui(argstate.argv[0], NULL);
8445088Sab196087 			const char *name = MSG_ORIG(MSG_CMD_E_ENTRY);
8455088Sab196087 
8465088Sab196087 			if (ehdr->e_entry == entry) {
8475088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
8485088Sab196087 				    MSG_INTL(MSG_DEBUG_E_LLX_OK), name,
8495088Sab196087 				    EC_ADDR(ehdr->e_entry));
8505088Sab196087 			} else {
8515088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
8525088Sab196087 				    MSG_INTL(MSG_DEBUG_E_LLX_CHG), name,
8535088Sab196087 				    EC_ADDR(ehdr->e_entry), EC_ADDR(entry));
8545088Sab196087 				ret = ELFEDIT_CMDRET_MOD;
8555088Sab196087 				ehdr->e_entry = entry;
8565088Sab196087 			}
8575088Sab196087 		}
8585088Sab196087 		break;
8595088Sab196087 
8605088Sab196087 	case EHDR_CMD_T_E_PHOFF:
8615088Sab196087 		{
8625088Sab196087 			/* The argument gives the program header offset */
8635088Sab196087 			Off off = (Off) elfedit_atoui(argstate.argv[0],
8645088Sab196087 			    NULL);
8655088Sab196087 			const char *name = MSG_ORIG(MSG_CMD_E_PHOFF);
8665088Sab196087 
8675088Sab196087 			if (ehdr->e_phoff == off) {
8685088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
8695088Sab196087 				    MSG_INTL(MSG_DEBUG_E_LLX_OK), name,
8705088Sab196087 				    EC_OFF(ehdr->e_phoff));
8715088Sab196087 			} else {
8725088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
8735088Sab196087 				    MSG_INTL(MSG_DEBUG_E_LLX_CHG), name,
8745088Sab196087 				    EC_OFF(ehdr->e_phoff), EC_OFF(off));
8755088Sab196087 				ret = ELFEDIT_CMDRET_MOD;
8765088Sab196087 				ehdr->e_phoff = off;
8775088Sab196087 			}
8785088Sab196087 		}
8795088Sab196087 		break;
8805088Sab196087 
8815088Sab196087 	case EHDR_CMD_T_E_SHOFF:
8825088Sab196087 		{
8835088Sab196087 			/* The argument gives the section header offset */
8845088Sab196087 			Off off = (Off) elfedit_atoui(argstate.argv[0],
8855088Sab196087 			    NULL);
8865088Sab196087 			const char *name = MSG_ORIG(MSG_CMD_E_SHOFF);
8875088Sab196087 
8885088Sab196087 			if (ehdr->e_shoff == off) {
8895088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
8905088Sab196087 				    MSG_INTL(MSG_DEBUG_E_LLX_OK), name,
8915088Sab196087 				    EC_OFF(ehdr->e_shoff));
8925088Sab196087 			} else {
8935088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
8945088Sab196087 				    MSG_INTL(MSG_DEBUG_E_LLX_CHG), name,
8955088Sab196087 				    EC_OFF(ehdr->e_shoff), EC_OFF(off));
8965088Sab196087 				ret = ELFEDIT_CMDRET_MOD;
8975088Sab196087 				ehdr->e_shoff = off;
8985088Sab196087 			}
8995088Sab196087 		}
9005088Sab196087 		break;
9015088Sab196087 
9025088Sab196087 	case EHDR_CMD_T_E_FLAGS:
9035088Sab196087 		{
9045088Sab196087 			Conv_ehdr_flags_buf_t flags_buf1, flags_buf2;
9055088Sab196087 			const char *name = MSG_ORIG(MSG_CMD_E_FLAGS);
9065088Sab196087 			Word flags = 0;
9075088Sab196087 			int i;
9085088Sab196087 
9095088Sab196087 			/* Collect the arguments */
9105088Sab196087 			for (i = 0; i < argstate.argc; i++)
9115088Sab196087 				flags |= (Word)
9125088Sab196087 				    elfedit_atoconst(argstate.argv[i],
9135088Sab196087 				    ELFEDIT_CONST_EF);
9145088Sab196087 
9155088Sab196087 			/* Complement the value? */
9165088Sab196087 			if (argstate.optmask & EHDR_OPT_F_CMP)
9175088Sab196087 				flags = ~flags;
9185088Sab196087 
9195088Sab196087 			/* Perform any requested bit operations */
9205088Sab196087 			if (argstate.optmask & EHDR_OPT_F_AND)
9215088Sab196087 				flags &= ehdr->e_flags;
9225088Sab196087 			else if (argstate.optmask & EHDR_OPT_F_OR)
9235088Sab196087 				flags |= ehdr->e_flags;
9245088Sab196087 
9255088Sab196087 			/* Set the value */
9265088Sab196087 			if (ehdr->e_flags == flags) {
9275088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
9285088Sab196087 				    MSG_INTL(MSG_DEBUG_E_S_OK), name,
9295088Sab196087 				    conv_ehdr_flags(ehdr->e_machine,
9305088Sab196087 				    ehdr->e_flags, 0, &flags_buf1));
9315088Sab196087 			} else {
9325088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
9335088Sab196087 				    MSG_INTL(MSG_DEBUG_E_S_CHG), name,
9345088Sab196087 				    conv_ehdr_flags(ehdr->e_machine,
9355088Sab196087 				    ehdr->e_flags, 0, &flags_buf1),
9365088Sab196087 				    conv_ehdr_flags(ehdr->e_machine,
9375088Sab196087 				    flags, 0, &flags_buf2));
9385088Sab196087 				ret = ELFEDIT_CMDRET_MOD;
9395088Sab196087 				ehdr->e_flags = flags;
9405088Sab196087 			}
9415088Sab196087 		}
9425088Sab196087 		break;
9435088Sab196087 
9445088Sab196087 	case EHDR_CMD_T_E_EHSIZE:
9455088Sab196087 		{
9465088Sab196087 			/* The argument gives the ELF header size */
9475088Sab196087 			Half ehsize = (Half) elfedit_atoui(argstate.argv[0],
9485088Sab196087 			    NULL);
9495088Sab196087 			const char *name = MSG_ORIG(MSG_CMD_E_EHSIZE);
9505088Sab196087 
9515088Sab196087 			if (ehdr->e_ehsize == ehsize) {
9525088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
9535088Sab196087 				    MSG_INTL(MSG_DEBUG_E_D_OK), name,
9545088Sab196087 				    EC_WORD(ehdr->e_ehsize));
9555088Sab196087 			} else {
9565088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
9575088Sab196087 				    MSG_INTL(MSG_DEBUG_E_D_CHG), name,
9585088Sab196087 				    EC_WORD(ehdr->e_ehsize), EC_WORD(ehsize));
9595088Sab196087 				ret = ELFEDIT_CMDRET_MOD;
9605088Sab196087 				ehdr->e_ehsize = ehsize;
9615088Sab196087 			}
9625088Sab196087 		}
9635088Sab196087 		break;
9645088Sab196087 
9655088Sab196087 	case EHDR_CMD_T_E_PHENTSIZE:
9665088Sab196087 		{
9675088Sab196087 			/*
9685088Sab196087 			 * The argument gives the size of a program
9695088Sab196087 			 * header element.
9705088Sab196087 			 */
9715088Sab196087 			Half phentsize = (Half) elfedit_atoui(argstate.argv[0],
9725088Sab196087 			    NULL);
9735088Sab196087 			const char *name = MSG_ORIG(MSG_CMD_E_PHENTSIZE);
9745088Sab196087 
9755088Sab196087 			if (ehdr->e_phentsize == phentsize) {
9765088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
9775088Sab196087 				    MSG_INTL(MSG_DEBUG_E_D_OK), name,
9785088Sab196087 				    EC_WORD(ehdr->e_phentsize));
9795088Sab196087 			} else {
9805088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
9815088Sab196087 				    MSG_INTL(MSG_DEBUG_E_D_CHG), name,
9825088Sab196087 				    EC_WORD(ehdr->e_phentsize),
9835088Sab196087 				    EC_WORD(phentsize));
9845088Sab196087 				ret = ELFEDIT_CMDRET_MOD;
9855088Sab196087 				ehdr->e_phentsize = phentsize;
9865088Sab196087 			}
9875088Sab196087 		}
9885088Sab196087 		break;
9895088Sab196087 
9905088Sab196087 	case EHDR_CMD_T_E_PHNUM:
9915088Sab196087 		{
9925088Sab196087 			/* The argument gives the number of program headers */
9935088Sab196087 			Word phnum = (Word) elfedit_atoui(argstate.argv[0],
9945088Sab196087 			    NULL);
9955088Sab196087 			const char *name = MSG_ORIG(MSG_CMD_E_PHNUM);
9965088Sab196087 			elfedit_section_t *sec0 = &obj_state->os_secarr[0];
9975088Sab196087 			Shdr *shdr0 = sec0->sec_shdr;
9985088Sab196087 			Half e_phnum;
9995088Sab196087 			Word sh_info;
10005088Sab196087 
10015088Sab196087 			if (phnum >= PN_XNUM) {
10025088Sab196087 				e_phnum = PN_XNUM;
10035088Sab196087 				sh_info = phnum;
10045088Sab196087 			} else {
10055088Sab196087 				e_phnum = phnum;
10065088Sab196087 				sh_info = 0;
10075088Sab196087 			}
10085088Sab196087 
10095088Sab196087 			if (ehdr->e_phnum == e_phnum) {
10105088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
10115088Sab196087 				    MSG_INTL(MSG_DEBUG_E_D_OK), name,
10125088Sab196087 				    EC_WORD(ehdr->e_phnum));
10135088Sab196087 			} else {
10145088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
10155088Sab196087 				    MSG_INTL(MSG_DEBUG_E_D_CHG), name,
10165088Sab196087 				    EC_WORD(ehdr->e_phnum), e_phnum);
10175088Sab196087 				ret = ELFEDIT_CMDRET_MOD;
10185088Sab196087 				ehdr->e_phnum = e_phnum;
10195088Sab196087 			}
10205088Sab196087 			if (shdr0->sh_info == sh_info) {
10215088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
10225088Sab196087 				    MSG_INTL(MSG_DEBUG_SHDR0_D_OK),
10235088Sab196087 				    MSG_ORIG(MSG_STR_SH_INFO),
10245088Sab196087 				    EC_WORD(shdr0->sh_info));
10255088Sab196087 			} else {
10265088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
10275088Sab196087 				    MSG_INTL(MSG_DEBUG_SHDR0_D_CHG),
10285088Sab196087 				    MSG_ORIG(MSG_STR_SH_INFO),
10295088Sab196087 				    EC_WORD(shdr0->sh_info), sh_info);
10305088Sab196087 				ret = ELFEDIT_CMDRET_MOD;
10315088Sab196087 				shdr0->sh_info = sh_info;
10325088Sab196087 				elfedit_modified_shdr(sec0);
10335088Sab196087 			}
10345088Sab196087 		}
10355088Sab196087 		break;
10365088Sab196087 
10375088Sab196087 	case EHDR_CMD_T_E_SHENTSIZE:
10385088Sab196087 		{
10395088Sab196087 			/*
10405088Sab196087 			 * The argument gives the size of a program
10415088Sab196087 			 * header element.
10425088Sab196087 			 */
10435088Sab196087 			Half shentsize = (Half) elfedit_atoui(argstate.argv[0],
10445088Sab196087 			    NULL);
10455088Sab196087 			const char *name = MSG_ORIG(MSG_CMD_E_SHENTSIZE);
10465088Sab196087 
10475088Sab196087 			if (ehdr->e_shentsize == shentsize) {
10485088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
10495088Sab196087 				    MSG_INTL(MSG_DEBUG_E_D_OK), name,
10505088Sab196087 				    EC_WORD(ehdr->e_shentsize));
10515088Sab196087 			} else {
10525088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
10535088Sab196087 				    MSG_INTL(MSG_DEBUG_E_D_CHG), name,
10545088Sab196087 				    EC_WORD(ehdr->e_shentsize),
10555088Sab196087 				    EC_WORD(shentsize));
10565088Sab196087 				ret = ELFEDIT_CMDRET_MOD;
10575088Sab196087 				ehdr->e_shentsize = shentsize;
10585088Sab196087 			}
10595088Sab196087 		}
10605088Sab196087 		break;
10615088Sab196087 
10625088Sab196087 	case EHDR_CMD_T_E_SHNUM:
10635088Sab196087 		{
10645088Sab196087 			/* The argument gives the number of section headers */
10655088Sab196087 			Word shnum = (Word) elfedit_atoui(argstate.argv[0],
10665088Sab196087 			    NULL);
10675088Sab196087 			const char *name = MSG_ORIG(MSG_CMD_E_SHNUM);
10685088Sab196087 			elfedit_section_t *sec0 = &obj_state->os_secarr[0];
10695088Sab196087 			Shdr *shdr0 = sec0->sec_shdr;
10705088Sab196087 			Half e_shnum;
10715088Sab196087 			Word sh_size;
10725088Sab196087 
10735088Sab196087 			if (shnum >= SHN_LORESERVE) {
10745088Sab196087 				e_shnum = 0;
10755088Sab196087 				sh_size = shnum;
10765088Sab196087 			} else {
10775088Sab196087 				e_shnum = shnum;
10785088Sab196087 				sh_size = 0;
10795088Sab196087 			}
10805088Sab196087 
10815088Sab196087 			if (ehdr->e_shnum == e_shnum) {
10825088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
10835088Sab196087 				    MSG_INTL(MSG_DEBUG_E_D_OK), name,
10845088Sab196087 				    EC_WORD(ehdr->e_shnum));
10855088Sab196087 			} else {
10865088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
10875088Sab196087 				    MSG_INTL(MSG_DEBUG_E_D_CHG), name,
10885088Sab196087 				    EC_WORD(ehdr->e_shnum), e_shnum);
10895088Sab196087 				ret = ELFEDIT_CMDRET_MOD;
10905088Sab196087 				ehdr->e_shnum = e_shnum;
10915088Sab196087 			}
10925088Sab196087 			if (shdr0->sh_size == sh_size) {
10935088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
10945088Sab196087 				    MSG_INTL(MSG_DEBUG_SHDR0_D_OK),
10955088Sab196087 				    MSG_ORIG(MSG_STR_SH_SIZE),
10965088Sab196087 				    EC_WORD(shdr0->sh_size));
10975088Sab196087 			} else {
10985088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
10995088Sab196087 				    MSG_INTL(MSG_DEBUG_SHDR0_D_CHG),
11005088Sab196087 				    MSG_ORIG(MSG_STR_SH_SIZE),
11015088Sab196087 				    EC_WORD(shdr0->sh_size), sh_size);
11025088Sab196087 				ret = ELFEDIT_CMDRET_MOD;
11035088Sab196087 				shdr0->sh_size = sh_size;
11045088Sab196087 				elfedit_modified_shdr(sec0);
11055088Sab196087 			}
11065088Sab196087 		}
11075088Sab196087 		break;
11085088Sab196087 
11095088Sab196087 	case EHDR_CMD_T_E_SHSTRNDX:
11105088Sab196087 		{
11115088Sab196087 			const char *name = MSG_ORIG(MSG_CMD_E_SHSTRNDX);
11125088Sab196087 			Word shstrndx;
11135088Sab196087 			elfedit_section_t *sec0 = &obj_state->os_secarr[0];
11145088Sab196087 			Shdr *shdr0 = sec0->sec_shdr;
11155088Sab196087 			Half e_shstrndx;
11165088Sab196087 			Word sh_link;
11175088Sab196087 
11185088Sab196087 			/*
11195088Sab196087 			 * By default, sec argument is name of section.
11205088Sab196087 			 * If -shndx is used, it is a numeric index, and
11215088Sab196087 			 * if -shtyp is used, it is a section type.
11225088Sab196087 			 */
11235088Sab196087 			if (argstate.optmask & EHDR_OPT_F_SHNDX)
11245088Sab196087 				shstrndx = elfedit_atoshndx(argstate.argv[0],
11255088Sab196087 				    obj_state->os_shnum);
11265088Sab196087 			else if (argstate.optmask & EHDR_OPT_F_SHTYP)
11275088Sab196087 				shstrndx = elfedit_type_to_shndx(obj_state,
11285088Sab196087 				    elfedit_atoconst(argstate.argv[0],
11295088Sab196087 				    ELFEDIT_CONST_SHT));
11305088Sab196087 			else
11315088Sab196087 				shstrndx = elfedit_name_to_shndx(obj_state,
11325088Sab196087 				    argstate.argv[0]);
11335088Sab196087 
11345088Sab196087 			/* Warn if the section isn't a string table */
11355088Sab196087 			if ((shstrndx >= obj_state->os_shnum) ||
11365088Sab196087 			    ((shstrndx >= SHN_LORESERVE) &&
11375088Sab196087 			    (shstrndx <= SHN_HIRESERVE)) ||
11385088Sab196087 			    (obj_state->os_secarr[shstrndx].sec_shdr->sh_type !=
11395088Sab196087 			    SHT_STRTAB))
11405088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
11415088Sab196087 				    MSG_INTL(MSG_DEBUG_NOTSTRTAB), name,
11425088Sab196087 				    EC_WORD(shstrndx));
11435088Sab196087 
11445088Sab196087 			if (shstrndx >= SHN_LORESERVE) {
11455088Sab196087 				e_shstrndx = SHN_XINDEX;
11465088Sab196087 				sh_link = shstrndx;
11475088Sab196087 			} else {
11485088Sab196087 				e_shstrndx = shstrndx;
11495088Sab196087 				sh_link = 0;
11505088Sab196087 			}
11515088Sab196087 
11525088Sab196087 			if (ehdr->e_shstrndx == e_shstrndx) {
11535088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
11545088Sab196087 				    MSG_INTL(MSG_DEBUG_E_D_OK), name,
11555088Sab196087 				    EC_WORD(ehdr->e_shstrndx));
11565088Sab196087 			} else {
11575088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
11585088Sab196087 				    MSG_INTL(MSG_DEBUG_E_D_CHG), name,
11595088Sab196087 				    EC_WORD(ehdr->e_shstrndx), e_shstrndx);
11605088Sab196087 				ret = ELFEDIT_CMDRET_MOD;
11615088Sab196087 				ehdr->e_shstrndx = e_shstrndx;
11625088Sab196087 			}
11635088Sab196087 			if (shdr0->sh_link == sh_link) {
11645088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
11655088Sab196087 				    MSG_INTL(MSG_DEBUG_SHDR0_D_OK),
11665088Sab196087 				    MSG_ORIG(MSG_STR_SH_LINK),
11675088Sab196087 				    EC_WORD(shdr0->sh_link));
11685088Sab196087 			} else {
11695088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
11705088Sab196087 				    MSG_INTL(MSG_DEBUG_SHDR0_D_CHG),
11715088Sab196087 				    MSG_ORIG(MSG_STR_SH_LINK),
11725088Sab196087 				    EC_WORD(shdr0->sh_link), sh_link);
11735088Sab196087 				ret = ELFEDIT_CMDRET_MOD;
11745088Sab196087 				shdr0->sh_link = sh_link;
11755088Sab196087 				elfedit_modified_shdr(sec0);
11765088Sab196087 			}
11775088Sab196087 		}
11785088Sab196087 		break;
11795088Sab196087 
11805088Sab196087 	case EHDR_CMD_T_EI_MAG0:
11815088Sab196087 	case EHDR_CMD_T_EI_MAG1:
11825088Sab196087 	case EHDR_CMD_T_EI_MAG2:
11835088Sab196087 	case EHDR_CMD_T_EI_MAG3:
11845088Sab196087 		{
11855088Sab196087 			/*
11865088Sab196087 			 * This depends on EHDR_CMD_T_EI_MAG[0-3]
11875088Sab196087 			 * being contiguous
11885088Sab196087 			 */
11895088Sab196087 			int ei_ndx = (cmd - EHDR_CMD_T_EI_MAG0) + EI_MAG0;
11905088Sab196087 
11915088Sab196087 			/* The argument gives the magic number byte */
11925088Sab196087 			int mag = (int)elfedit_atoui_range(argstate.argv[0],
11935088Sab196087 			    MSG_ORIG(MSG_STR_VALUE), 0, 255, NULL);
11945088Sab196087 
11955088Sab196087 			if (ehdr->e_ident[ei_ndx] == mag) {
11965088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
11975088Sab196087 				    MSG_INTL(MSG_DEBUG_EI_S_S_OK),
11985088Sab196087 				    elfedit_atoconst_value_to_str(
11995088Sab196087 				    ELFEDIT_CONST_EI, ei_ndx, 1),
12005088Sab196087 				    conv_magic_value(ehdr->e_ident[ei_ndx]));
12015088Sab196087 			} else {
12025088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
12035088Sab196087 				    MSG_INTL(MSG_DEBUG_EI_S_S_CHG),
12045088Sab196087 				    elfedit_atoconst_value_to_str(
12055088Sab196087 				    ELFEDIT_CONST_EI, ei_ndx, 1),
12065088Sab196087 				    conv_magic_value(ehdr->e_ident[ei_ndx]),
12075088Sab196087 				    conv_magic_value(mag));
12085088Sab196087 				ret = ELFEDIT_CMDRET_MOD;
12095088Sab196087 				ehdr->e_ident[ei_ndx] = mag;
12105088Sab196087 			}
12115088Sab196087 		}
12125088Sab196087 		break;
12135088Sab196087 
12145088Sab196087 	case EHDR_CMD_T_EI_CLASS:
12155088Sab196087 		{
12165088Sab196087 			/* The argument gives the ELFCLASS value */
12175088Sab196087 			int class = (int)elfedit_atoconst_range(
12185088Sab196087 			    argstate.argv[0], MSG_ORIG(MSG_STR_VALUE), 0, 255,
12195088Sab196087 			    ELFEDIT_CONST_ELFCLASS);
12205088Sab196087 			const char *name = elfedit_atoconst_value_to_str(
12215088Sab196087 			    ELFEDIT_CONST_EI, EI_CLASS, 1);
12225088Sab196087 
12235088Sab196087 			if (ehdr->e_ident[EI_CLASS] == class) {
12245088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
12255088Sab196087 				    MSG_INTL(MSG_DEBUG_EI_S_S_OK), name,
12265088Sab196087 				    conv_ehdr_class(class, 0, &inv_buf1));
12275088Sab196087 			} else {
12285088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
12295088Sab196087 				    MSG_INTL(MSG_DEBUG_EI_S_S_CHG), name,
12305088Sab196087 				    conv_ehdr_class(ehdr->e_ident[EI_CLASS],
12315088Sab196087 				    0, &inv_buf1),
12325088Sab196087 				    conv_ehdr_class(class, 0, &inv_buf2));
12335088Sab196087 				ret = ELFEDIT_CMDRET_MOD;
12345088Sab196087 				ehdr->e_ident[EI_CLASS] = class;
12355088Sab196087 			}
12365088Sab196087 		}
12375088Sab196087 		break;
12385088Sab196087 
12395088Sab196087 	case EHDR_CMD_T_EI_DATA:
12405088Sab196087 		{
12415088Sab196087 			/* The argument gives the ELFDATA value */
12425088Sab196087 			int data = (int)elfedit_atoconst_range(argstate.argv[0],
12435088Sab196087 			    MSG_ORIG(MSG_STR_VALUE), 0, 255,
12445088Sab196087 			    ELFEDIT_CONST_ELFDATA);
12455088Sab196087 			const char *name = elfedit_atoconst_value_to_str(
12465088Sab196087 			    ELFEDIT_CONST_EI, EI_DATA, 1);
12475088Sab196087 
12485088Sab196087 			if (ehdr->e_ident[EI_DATA] == data) {
12495088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
12505088Sab196087 				    MSG_INTL(MSG_DEBUG_EI_S_S_OK), name,
12515088Sab196087 				    conv_ehdr_data(data, 0, &inv_buf1));
12525088Sab196087 			} else {
12535088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
12545088Sab196087 				    MSG_INTL(MSG_DEBUG_EI_S_S_CHG), name,
12555088Sab196087 				    conv_ehdr_data(ehdr->e_ident[EI_DATA],
12565088Sab196087 				    0, &inv_buf1),
12575088Sab196087 				    conv_ehdr_data(data, 0, &inv_buf2));
12585088Sab196087 				ret = ELFEDIT_CMDRET_MOD;
12595088Sab196087 				ehdr->e_ident[EI_DATA] = data;
12605088Sab196087 			}
12615088Sab196087 		}
12625088Sab196087 		break;
12635088Sab196087 
12645088Sab196087 	case EHDR_CMD_T_EI_VERSION:
12655088Sab196087 		{
12665088Sab196087 			/* The argument gives the version */
12675088Sab196087 			int ver = (int)elfedit_atoconst_range(argstate.argv[0],
12685088Sab196087 			    MSG_ORIG(MSG_STR_VALUE), 0, 255, ELFEDIT_CONST_EV);
12695088Sab196087 			const char *name = elfedit_atoconst_value_to_str(
12705088Sab196087 			    ELFEDIT_CONST_EI, EI_VERSION, 1);
12715088Sab196087 
12725088Sab196087 			if (ehdr->e_ident[EI_VERSION] == ver) {
12735088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
12745088Sab196087 				    MSG_INTL(MSG_DEBUG_EI_S_S_OK), name,
12755088Sab196087 				    conv_ehdr_vers(ver, 0, &inv_buf1));
12765088Sab196087 			} else {
12775088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
12785088Sab196087 				    MSG_INTL(MSG_DEBUG_EI_S_S_CHG), name,
12795088Sab196087 				    conv_ehdr_vers(ehdr->e_ident[EI_VERSION],
12805088Sab196087 				    0, &inv_buf1),
12815088Sab196087 				    conv_ehdr_vers(ver, 0, &inv_buf2));
12825088Sab196087 				ret = ELFEDIT_CMDRET_MOD;
12835088Sab196087 				ehdr->e_ident[EI_VERSION] = ver;
12845088Sab196087 			}
12855088Sab196087 		}
12865088Sab196087 		break;
12875088Sab196087 
12885088Sab196087 	case EHDR_CMD_T_EI_OSABI:
12895088Sab196087 		{
12905088Sab196087 			/* The argument gives the ABI code */
12915088Sab196087 			int osabi = (int)elfedit_atoconst_range(
12925088Sab196087 			    argstate.argv[0], MSG_ORIG(MSG_STR_VALUE), 0, 255,
12935088Sab196087 			    ELFEDIT_CONST_ELFOSABI);
12945088Sab196087 			const char *name = elfedit_atoconst_value_to_str(
12955088Sab196087 			    ELFEDIT_CONST_EI, EI_OSABI, 1);
12965088Sab196087 
12975088Sab196087 			if (ehdr->e_ident[EI_OSABI] == osabi) {
12985088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
12995088Sab196087 				    MSG_INTL(MSG_DEBUG_EI_S_S_OK), name,
13005088Sab196087 				    conv_ehdr_osabi(osabi, 0, &inv_buf1));
13015088Sab196087 			} else {
13025088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
13035088Sab196087 				    MSG_INTL(MSG_DEBUG_EI_S_S_CHG), name,
13045088Sab196087 				    conv_ehdr_osabi(ehdr->e_ident[EI_OSABI],
13055088Sab196087 				    0, &inv_buf1),
13065088Sab196087 				    conv_ehdr_osabi(osabi, 0, &inv_buf2));
1307*9273SAli.Bahrami@Sun.COM 				ret = ELFEDIT_CMDRET_MOD_OS_MACH;
13085088Sab196087 				ehdr->e_ident[EI_OSABI] = osabi;
13095088Sab196087 			}
13105088Sab196087 		}
13115088Sab196087 		break;
13125088Sab196087 
13135088Sab196087 	case EHDR_CMD_T_EI_ABIVERSION:
13145088Sab196087 		{
13155088Sab196087 			/* The argument gives the ABI version  */
1316*9273SAli.Bahrami@Sun.COM 			int abiver = (int)elfedit_atoconst_range(
1317*9273SAli.Bahrami@Sun.COM 			    argstate.argv[0], MSG_ORIG(MSG_STR_VALUE), 0, 255,
1318*9273SAli.Bahrami@Sun.COM 			    ELFEDIT_CONST_EAV);
13195088Sab196087 			const char *name = elfedit_atoconst_value_to_str(
13205088Sab196087 			    ELFEDIT_CONST_EI, EI_ABIVERSION, 1);
13215088Sab196087 
13225088Sab196087 			if (ehdr->e_ident[EI_ABIVERSION] == abiver) {
13235088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
1324*9273SAli.Bahrami@Sun.COM 				    MSG_INTL(MSG_DEBUG_EI_S_S_OK), name,
1325*9273SAli.Bahrami@Sun.COM 				    conv_ehdr_abivers(ehdr->e_ident[EI_OSABI],
1326*9273SAli.Bahrami@Sun.COM 				    abiver, CONV_FMT_DECIMAL, &inv_buf1));
13275088Sab196087 			} else {
13285088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
1329*9273SAli.Bahrami@Sun.COM 				    MSG_INTL(MSG_DEBUG_EI_S_S_CHG), name,
1330*9273SAli.Bahrami@Sun.COM 				    conv_ehdr_abivers(ehdr->e_ident[EI_OSABI],
1331*9273SAli.Bahrami@Sun.COM 				    ehdr->e_ident[EI_ABIVERSION],
1332*9273SAli.Bahrami@Sun.COM 				    CONV_FMT_DECIMAL, &inv_buf1),
1333*9273SAli.Bahrami@Sun.COM 				    conv_ehdr_abivers(ehdr->e_ident[EI_OSABI],
1334*9273SAli.Bahrami@Sun.COM 				    abiver, CONV_FMT_DECIMAL, &inv_buf2));
13355088Sab196087 				ret = ELFEDIT_CMDRET_MOD;
13365088Sab196087 				ehdr->e_ident[EI_ABIVERSION] = abiver;
13375088Sab196087 			}
13385088Sab196087 		}
13395088Sab196087 		break;
13405088Sab196087 	}
13415088Sab196087 
13425088Sab196087 	/*
13435088Sab196087 	 * If we modified the ELF header, tell libelf.
13445088Sab196087 	 */
13455088Sab196087 	if (ret == ELFEDIT_CMDRET_MOD)
13465088Sab196087 		elfedit_modified_ehdr(obj_state);
13475088Sab196087 
13485088Sab196087 	/* Do autoprint */
13495088Sab196087 	print_ehdr(cmd, e_ident_ndx, 1, &argstate);
13505088Sab196087 
13515088Sab196087 	return (ret);
13525088Sab196087 }
13535088Sab196087 
13545088Sab196087 
13555088Sab196087 
13565088Sab196087 
13575088Sab196087 /*
13585088Sab196087  * Command completion functions for the various commands
13595088Sab196087  */
13605088Sab196087 
13615088Sab196087 /*ARGSUSED*/
13625088Sab196087 static void
cpl_e_ident(elfedit_obj_state_t * obj_state,void * cpldata,int argc,const char * argv[],int num_opt)13635088Sab196087 cpl_e_ident(elfedit_obj_state_t *obj_state, void *cpldata, int argc,
13645088Sab196087     const char *argv[], int num_opt)
13655088Sab196087 {
13665088Sab196087 	elfedit_atoui_t	ndx;
13675088Sab196087 
13685088Sab196087 	/*
13695088Sab196087 	 * This command doesn't accept options, so num_opt should be
13705088Sab196087 	 * 0. This is a defensive measure, in case that should change.
13715088Sab196087 	 */
13725088Sab196087 	argc -= num_opt;
13735088Sab196087 	argv += num_opt;
13745088Sab196087 
13755088Sab196087 	if (argc == 1) {
13765088Sab196087 		elfedit_cpl_atoconst(cpldata, ELFEDIT_CONST_EI);
13775088Sab196087 		return;
13785088Sab196087 	}
13795088Sab196087 
13805088Sab196087 	if (argc != 2)
13815088Sab196087 		return;
13825088Sab196087 
13835088Sab196087 	/*
13845088Sab196087 	 * In order to offer up the right completion strings for
13855088Sab196087 	 * the value, we need to know what index was given for
13865088Sab196087 	 * the first argument. If we don't recognize the index,
13875088Sab196087 	 * we want to return quietly without issuing an error,
13885088Sab196087 	 * so we use elfedit_atoui_range2(), which returns
13895088Sab196087 	 * a success/failure result and does not throw any errors.
13905088Sab196087 	 */
13915088Sab196087 	if (elfedit_atoconst_range2(argv[0], 0, EI_NIDENT - 1,
13925088Sab196087 	    ELFEDIT_CONST_EI, &ndx) == 0)
13935088Sab196087 		return;
13945088Sab196087 	switch (ndx) {
13955088Sab196087 	case EI_CLASS:
13965088Sab196087 		elfedit_cpl_atoconst(cpldata, ELFEDIT_CONST_ELFCLASS);
13975088Sab196087 		break;
13985088Sab196087 	case EI_DATA:
13995088Sab196087 		elfedit_cpl_atoconst(cpldata, ELFEDIT_CONST_ELFDATA);
14005088Sab196087 		break;
14015088Sab196087 	case EI_VERSION:
14025088Sab196087 		elfedit_cpl_atoconst(cpldata, ELFEDIT_CONST_EV);
14035088Sab196087 		break;
14045088Sab196087 	case EI_OSABI:
14055088Sab196087 		elfedit_cpl_atoconst(cpldata, ELFEDIT_CONST_ELFOSABI);
14065088Sab196087 		break;
14075088Sab196087 	}
14085088Sab196087 }
14095088Sab196087 
14105088Sab196087 /*ARGSUSED*/
14115088Sab196087 static void
cpl_e_type(elfedit_obj_state_t * obj_state,void * cpldata,int argc,const char * argv[],int num_opt)14125088Sab196087 cpl_e_type(elfedit_obj_state_t *obj_state, void *cpldata, int argc,
14135088Sab196087     const char *argv[], int num_opt)
14145088Sab196087 {
14155088Sab196087 	/*
14165088Sab196087 	 * This command doesn't accept options, so num_opt should be
14175088Sab196087 	 * 0. This is a defensive measure, in case that should change.
14185088Sab196087 	 */
14195088Sab196087 	argc -= num_opt;
14205088Sab196087 	argv += num_opt;
14215088Sab196087 
14225088Sab196087 	if (argc == 1)
14235088Sab196087 		elfedit_cpl_atoconst(cpldata, ELFEDIT_CONST_ET);
14245088Sab196087 }
14255088Sab196087 
14265088Sab196087 /*ARGSUSED*/
14275088Sab196087 static void
cpl_e_machine(elfedit_obj_state_t * obj_state,void * cpldata,int argc,const char * argv[],int num_opt)14285088Sab196087 cpl_e_machine(elfedit_obj_state_t *obj_state, void *cpldata, int argc,
14295088Sab196087     const char *argv[], int num_opt)
14305088Sab196087 {
14315088Sab196087 	/*
14325088Sab196087 	 * This command doesn't accept options, so num_opt should be
14335088Sab196087 	 * 0. This is a defensive measure, in case that should change.
14345088Sab196087 	 */
14355088Sab196087 	argc -= num_opt;
14365088Sab196087 	argv += num_opt;
14375088Sab196087 
14385088Sab196087 	if (argc == 1)
14395088Sab196087 		elfedit_cpl_atoconst(cpldata, ELFEDIT_CONST_EM);
14405088Sab196087 }
14415088Sab196087 
14425088Sab196087 /*ARGSUSED*/
14435088Sab196087 static void
cpl_e_version(elfedit_obj_state_t * obj_state,void * cpldata,int argc,const char * argv[],int num_opt)14445088Sab196087 cpl_e_version(elfedit_obj_state_t *obj_state, void *cpldata, int argc,
14455088Sab196087     const char *argv[], int num_opt)
14465088Sab196087 {
14475088Sab196087 	/*
14485088Sab196087 	 * This command doesn't accept options, so num_opt should be
14495088Sab196087 	 * 0. This is a defensive measure, in case that should change.
14505088Sab196087 	 */
14515088Sab196087 	argc -= num_opt;
14525088Sab196087 	argv += num_opt;
14535088Sab196087 
14545088Sab196087 	if (argc == 1)
14555088Sab196087 		elfedit_cpl_atoconst(cpldata, ELFEDIT_CONST_EV);
14565088Sab196087 }
14575088Sab196087 
14585088Sab196087 /*ARGSUSED*/
14595088Sab196087 static void
cpl_e_flags(elfedit_obj_state_t * obj_state,void * cpldata,int argc,const char * argv[],int num_opt)14605088Sab196087 cpl_e_flags(elfedit_obj_state_t *obj_state, void *cpldata, int argc,
14615088Sab196087     const char *argv[], int num_opt)
14625088Sab196087 {
14635088Sab196087 	/* This routine allows multiple flags to be specified */
14645088Sab196087 	elfedit_cpl_atoconst(cpldata, ELFEDIT_CONST_EF);
14655088Sab196087 }
14665088Sab196087 
14675088Sab196087 /*ARGSUSED*/
14685088Sab196087 static void
cpl_e_shstrndx(elfedit_obj_state_t * obj_state,void * cpldata,int argc,const char * argv[],int num_opt)14695088Sab196087 cpl_e_shstrndx(elfedit_obj_state_t *obj_state, void *cpldata, int argc,
14705088Sab196087     const char *argv[], int num_opt)
14715088Sab196087 {
14725088Sab196087 	enum { NAME, INDEX, TYPE } op;
14735088Sab196087 	Word ndx;
14745088Sab196087 
14755088Sab196087 	/*
14765088Sab196087 	 * The plainargument can be a section name, index, or
14775088Sab196087 	 * type, based on the options used. All have completions.
14785088Sab196087 	 */
14795088Sab196087 	if (argc != (num_opt + 1))
14805088Sab196087 		return;
14815088Sab196087 
14825088Sab196087 	op = NAME;
14835088Sab196087 	for (ndx = 0; ndx < num_opt; ndx++) {
14845088Sab196087 		if (strcmp(argv[ndx], MSG_ORIG(MSG_STR_MINUS_SHNDX)) == 0)
14855088Sab196087 			op = INDEX;
14865088Sab196087 		else if (strcmp(argv[ndx], MSG_ORIG(MSG_STR_MINUS_SHTYP)) == 0)
14875088Sab196087 			op = TYPE;
14885088Sab196087 	}
14895088Sab196087 
14905088Sab196087 	if (obj_state == NULL) {	/* No object available */
14915088Sab196087 		if (op == TYPE)
14925088Sab196087 			elfedit_cpl_atoconst(cpldata, ELFEDIT_CONST_SHT);
14935088Sab196087 		return;
14945088Sab196087 	}
14955088Sab196087 
14965088Sab196087 	/*
14975088Sab196087 	 * Loop over the sections and supply command completion
14985088Sab196087 	 * for the string tables in the file.
14995088Sab196087 	 */
15005088Sab196087 	for (ndx = 0; ndx < obj_state->os_shnum; ndx++) {
15015088Sab196087 		elfedit_section_t *sec = &obj_state->os_secarr[ndx];
15025088Sab196087 
15035088Sab196087 		if (sec->sec_shdr->sh_type != SHT_STRTAB)
15045088Sab196087 			continue;
15055088Sab196087 
15065088Sab196087 		switch (op) {
15075088Sab196087 		case NAME:
15085088Sab196087 			elfedit_cpl_match(cpldata, sec->sec_name, 0);
15095088Sab196087 			break;
15105088Sab196087 		case INDEX:
15116225Sab196087 			elfedit_cpl_ndx(cpldata, ndx);
15125088Sab196087 			break;
15135088Sab196087 		case TYPE:
15145088Sab196087 			elfedit_cpl_atoconst(cpldata, ELFEDIT_CONST_SHT_STRTAB);
15155088Sab196087 			break;
15165088Sab196087 		}
15175088Sab196087 	}
15185088Sab196087 }
15195088Sab196087 
15205088Sab196087 /*ARGSUSED*/
15215088Sab196087 static void
cpl_ei_class(elfedit_obj_state_t * obj_state,void * cpldata,int argc,const char * argv[],int num_opt)15225088Sab196087 cpl_ei_class(elfedit_obj_state_t *obj_state, void *cpldata, int argc,
15235088Sab196087     const char *argv[], int num_opt)
15245088Sab196087 {
15255088Sab196087 	/*
15265088Sab196087 	 * This command doesn't accept options, so num_opt should be
15275088Sab196087 	 * 0. This is a defensive measure, in case that should change.
15285088Sab196087 	 */
15295088Sab196087 	argc -= num_opt;
15305088Sab196087 	argv += num_opt;
15315088Sab196087 
15325088Sab196087 	if (argc == 1)
15335088Sab196087 		elfedit_cpl_atoconst(cpldata, ELFEDIT_CONST_ELFCLASS);
15345088Sab196087 }
15355088Sab196087 
15365088Sab196087 /*ARGSUSED*/
15375088Sab196087 static void
cpl_ei_data(elfedit_obj_state_t * obj_state,void * cpldata,int argc,const char * argv[],int num_opt)15385088Sab196087 cpl_ei_data(elfedit_obj_state_t *obj_state, void *cpldata, int argc,
15395088Sab196087     const char *argv[], int num_opt)
15405088Sab196087 {
15415088Sab196087 	/*
15425088Sab196087 	 * This command doesn't accept options, so num_opt should be
15435088Sab196087 	 * 0. This is a defensive measure, in case that should change.
15445088Sab196087 	 */
15455088Sab196087 	argc -= num_opt;
15465088Sab196087 	argv += num_opt;
15475088Sab196087 
15485088Sab196087 	if (argc == 1)
15495088Sab196087 		elfedit_cpl_atoconst(cpldata, ELFEDIT_CONST_ELFDATA);
15505088Sab196087 }
15515088Sab196087 
15525088Sab196087 /*ARGSUSED*/
15535088Sab196087 static void
cpl_ei_osabi(elfedit_obj_state_t * obj_state,void * cpldata,int argc,const char * argv[],int num_opt)15545088Sab196087 cpl_ei_osabi(elfedit_obj_state_t *obj_state, void *cpldata, int argc,
15555088Sab196087     const char *argv[], int num_opt)
15565088Sab196087 {
15575088Sab196087 	/*
15585088Sab196087 	 * This command doesn't accept options, so num_opt should be
15595088Sab196087 	 * 0. This is a defensive measure, in case that should change.
15605088Sab196087 	 */
15615088Sab196087 	argc -= num_opt;
15625088Sab196087 	argv += num_opt;
15635088Sab196087 
15645088Sab196087 	if (argc == 1)
15655088Sab196087 		elfedit_cpl_atoconst(cpldata, ELFEDIT_CONST_ELFOSABI);
15665088Sab196087 }
15675088Sab196087 
1568*9273SAli.Bahrami@Sun.COM /*ARGSUSED*/
1569*9273SAli.Bahrami@Sun.COM static void
cpl_ei_abiversion(elfedit_obj_state_t * obj_state,void * cpldata,int argc,const char * argv[],int num_opt)1570*9273SAli.Bahrami@Sun.COM cpl_ei_abiversion(elfedit_obj_state_t *obj_state, void *cpldata, int argc,
1571*9273SAli.Bahrami@Sun.COM     const char *argv[], int num_opt)
1572*9273SAli.Bahrami@Sun.COM {
1573*9273SAli.Bahrami@Sun.COM 	/*
1574*9273SAli.Bahrami@Sun.COM 	 * This command doesn't accept options, so num_opt should be
1575*9273SAli.Bahrami@Sun.COM 	 * 0. This is a defensive measure, in case that should change.
1576*9273SAli.Bahrami@Sun.COM 	 */
1577*9273SAli.Bahrami@Sun.COM 	argc -= num_opt;
1578*9273SAli.Bahrami@Sun.COM 	argv += num_opt;
1579*9273SAli.Bahrami@Sun.COM 
1580*9273SAli.Bahrami@Sun.COM 	if (argc == 1)
1581*9273SAli.Bahrami@Sun.COM 		elfedit_cpl_atoconst(cpldata, ELFEDIT_CONST_EAV);
1582*9273SAli.Bahrami@Sun.COM }
1583*9273SAli.Bahrami@Sun.COM 
15845088Sab196087 
15855088Sab196087 
15865088Sab196087 
15875088Sab196087 /*
15885088Sab196087  * Implementation functions for the commands
15895088Sab196087  */
15905088Sab196087 static elfedit_cmdret_t
cmd_dump(elfedit_obj_state_t * obj_state,int argc,const char * argv[])15915088Sab196087 cmd_dump(elfedit_obj_state_t *obj_state, int argc, const char *argv[])
15925088Sab196087 {
15935088Sab196087 	return (cmd_body(EHDR_CMD_T_DUMP, obj_state, argc, argv));
15945088Sab196087 }
15955088Sab196087 
15965088Sab196087 
15975088Sab196087 static elfedit_cmdret_t
cmd_e_ident(elfedit_obj_state_t * obj_state,int argc,const char * argv[])15985088Sab196087 cmd_e_ident(elfedit_obj_state_t *obj_state, int argc, const char *argv[])
15995088Sab196087 {
16005088Sab196087 	return (cmd_body(EHDR_CMD_T_E_IDENT, obj_state, argc, argv));
16015088Sab196087 }
16025088Sab196087 
16035088Sab196087 
16045088Sab196087 static elfedit_cmdret_t
cmd_e_type(elfedit_obj_state_t * obj_state,int argc,const char * argv[])16055088Sab196087 cmd_e_type(elfedit_obj_state_t *obj_state, int argc, const char *argv[])
16065088Sab196087 {
16075088Sab196087 	return (cmd_body(EHDR_CMD_T_E_TYPE, obj_state, argc, argv));
16085088Sab196087 }
16095088Sab196087 
16105088Sab196087 
16115088Sab196087 static elfedit_cmdret_t
cmd_e_machine(elfedit_obj_state_t * obj_state,int argc,const char * argv[])16125088Sab196087 cmd_e_machine(elfedit_obj_state_t *obj_state, int argc, const char *argv[])
16135088Sab196087 {
16145088Sab196087 	return (cmd_body(EHDR_CMD_T_E_MACHINE, obj_state, argc, argv));
16155088Sab196087 }
16165088Sab196087 
16175088Sab196087 
16185088Sab196087 static elfedit_cmdret_t
cmd_e_version(elfedit_obj_state_t * obj_state,int argc,const char * argv[])16195088Sab196087 cmd_e_version(elfedit_obj_state_t *obj_state, int argc, const char *argv[])
16205088Sab196087 {
16215088Sab196087 	return (cmd_body(EHDR_CMD_T_E_VERSION, obj_state, argc, argv));
16225088Sab196087 }
16235088Sab196087 
16245088Sab196087 
16255088Sab196087 static elfedit_cmdret_t
cmd_e_entry(elfedit_obj_state_t * obj_state,int argc,const char * argv[])16265088Sab196087 cmd_e_entry(elfedit_obj_state_t *obj_state, int argc, const char *argv[])
16275088Sab196087 {
16285088Sab196087 	return (cmd_body(EHDR_CMD_T_E_ENTRY, obj_state, argc, argv));
16295088Sab196087 }
16305088Sab196087 
16315088Sab196087 
16325088Sab196087 static elfedit_cmdret_t
cmd_e_phoff(elfedit_obj_state_t * obj_state,int argc,const char * argv[])16335088Sab196087 cmd_e_phoff(elfedit_obj_state_t *obj_state, int argc, const char *argv[])
16345088Sab196087 {
16355088Sab196087 	return (cmd_body(EHDR_CMD_T_E_PHOFF, obj_state, argc, argv));
16365088Sab196087 }
16375088Sab196087 
16385088Sab196087 
16395088Sab196087 static elfedit_cmdret_t
cmd_e_shoff(elfedit_obj_state_t * obj_state,int argc,const char * argv[])16405088Sab196087 cmd_e_shoff(elfedit_obj_state_t *obj_state, int argc, const char *argv[])
16415088Sab196087 {
16425088Sab196087 	return (cmd_body(EHDR_CMD_T_E_SHOFF, obj_state, argc, argv));
16435088Sab196087 }
16445088Sab196087 
16455088Sab196087 
16465088Sab196087 static elfedit_cmdret_t
cmd_e_flags(elfedit_obj_state_t * obj_state,int argc,const char * argv[])16475088Sab196087 cmd_e_flags(elfedit_obj_state_t *obj_state, int argc, const char *argv[])
16485088Sab196087 {
16495088Sab196087 	return (cmd_body(EHDR_CMD_T_E_FLAGS, obj_state, argc, argv));
16505088Sab196087 }
16515088Sab196087 
16525088Sab196087 
16535088Sab196087 static elfedit_cmdret_t
cmd_e_ehsize(elfedit_obj_state_t * obj_state,int argc,const char * argv[])16545088Sab196087 cmd_e_ehsize(elfedit_obj_state_t *obj_state, int argc, const char *argv[])
16555088Sab196087 {
16565088Sab196087 	return (cmd_body(EHDR_CMD_T_E_EHSIZE, obj_state, argc, argv));
16575088Sab196087 }
16585088Sab196087 
16595088Sab196087 
16605088Sab196087 static elfedit_cmdret_t
cmd_e_phentsize(elfedit_obj_state_t * obj_state,int argc,const char * argv[])16615088Sab196087 cmd_e_phentsize(elfedit_obj_state_t *obj_state, int argc, const char *argv[])
16625088Sab196087 {
16635088Sab196087 	return (cmd_body(EHDR_CMD_T_E_PHENTSIZE, obj_state, argc, argv));
16645088Sab196087 }
16655088Sab196087 
16665088Sab196087 
16675088Sab196087 static elfedit_cmdret_t
cmd_e_phnum(elfedit_obj_state_t * obj_state,int argc,const char * argv[])16685088Sab196087 cmd_e_phnum(elfedit_obj_state_t *obj_state, int argc, const char *argv[])
16695088Sab196087 {
16705088Sab196087 	return (cmd_body(EHDR_CMD_T_E_PHNUM, obj_state, argc, argv));
16715088Sab196087 }
16725088Sab196087 
16735088Sab196087 
16745088Sab196087 static elfedit_cmdret_t
cmd_e_shentsize(elfedit_obj_state_t * obj_state,int argc,const char * argv[])16755088Sab196087 cmd_e_shentsize(elfedit_obj_state_t *obj_state, int argc, const char *argv[])
16765088Sab196087 {
16775088Sab196087 	return (cmd_body(EHDR_CMD_T_E_SHENTSIZE, obj_state, argc, argv));
16785088Sab196087 }
16795088Sab196087 
16805088Sab196087 
16815088Sab196087 static elfedit_cmdret_t
cmd_e_shnum(elfedit_obj_state_t * obj_state,int argc,const char * argv[])16825088Sab196087 cmd_e_shnum(elfedit_obj_state_t *obj_state, int argc, const char *argv[])
16835088Sab196087 {
16845088Sab196087 	return (cmd_body(EHDR_CMD_T_E_SHNUM, obj_state, argc, argv));
16855088Sab196087 }
16865088Sab196087 
16875088Sab196087 
16885088Sab196087 static elfedit_cmdret_t
cmd_e_shstrndx(elfedit_obj_state_t * obj_state,int argc,const char * argv[])16895088Sab196087 cmd_e_shstrndx(elfedit_obj_state_t *obj_state, int argc, const char *argv[])
16905088Sab196087 {
16915088Sab196087 	return (cmd_body(EHDR_CMD_T_E_SHSTRNDX, obj_state, argc, argv));
16925088Sab196087 }
16935088Sab196087 
16945088Sab196087 
16955088Sab196087 static elfedit_cmdret_t
cmd_ei_mag0(elfedit_obj_state_t * obj_state,int argc,const char * argv[])16965088Sab196087 cmd_ei_mag0(elfedit_obj_state_t *obj_state, int argc, const char *argv[])
16975088Sab196087 {
16985088Sab196087 	return (cmd_body(EHDR_CMD_T_EI_MAG0, obj_state, argc, argv));
16995088Sab196087 }
17005088Sab196087 
17015088Sab196087 
17025088Sab196087 static elfedit_cmdret_t
cmd_ei_mag1(elfedit_obj_state_t * obj_state,int argc,const char * argv[])17035088Sab196087 cmd_ei_mag1(elfedit_obj_state_t *obj_state, int argc, const char *argv[])
17045088Sab196087 {
17055088Sab196087 	return (cmd_body(EHDR_CMD_T_EI_MAG1, obj_state, argc, argv));
17065088Sab196087 }
17075088Sab196087 
17085088Sab196087 
17095088Sab196087 static elfedit_cmdret_t
cmd_ei_mag2(elfedit_obj_state_t * obj_state,int argc,const char * argv[])17105088Sab196087 cmd_ei_mag2(elfedit_obj_state_t *obj_state, int argc, const char *argv[])
17115088Sab196087 {
17125088Sab196087 	return (cmd_body(EHDR_CMD_T_EI_MAG2, obj_state, argc, argv));
17135088Sab196087 }
17145088Sab196087 
17155088Sab196087 
17165088Sab196087 static elfedit_cmdret_t
cmd_ei_mag3(elfedit_obj_state_t * obj_state,int argc,const char * argv[])17175088Sab196087 cmd_ei_mag3(elfedit_obj_state_t *obj_state, int argc, const char *argv[])
17185088Sab196087 {
17195088Sab196087 	return (cmd_body(EHDR_CMD_T_EI_MAG3, obj_state, argc, argv));
17205088Sab196087 }
17215088Sab196087 
17225088Sab196087 
17235088Sab196087 static elfedit_cmdret_t
cmd_ei_class(elfedit_obj_state_t * obj_state,int argc,const char * argv[])17245088Sab196087 cmd_ei_class(elfedit_obj_state_t *obj_state, int argc, const char *argv[])
17255088Sab196087 {
17265088Sab196087 	return (cmd_body(EHDR_CMD_T_EI_CLASS, obj_state, argc, argv));
17275088Sab196087 }
17285088Sab196087 
17295088Sab196087 
17305088Sab196087 static elfedit_cmdret_t
cmd_ei_data(elfedit_obj_state_t * obj_state,int argc,const char * argv[])17315088Sab196087 cmd_ei_data(elfedit_obj_state_t *obj_state, int argc, const char *argv[])
17325088Sab196087 {
17335088Sab196087 	return (cmd_body(EHDR_CMD_T_EI_DATA, obj_state, argc, argv));
17345088Sab196087 }
17355088Sab196087 
17365088Sab196087 
17375088Sab196087 static elfedit_cmdret_t
cmd_ei_version(elfedit_obj_state_t * obj_state,int argc,const char * argv[])17385088Sab196087 cmd_ei_version(elfedit_obj_state_t *obj_state, int argc, const char *argv[])
17395088Sab196087 {
17405088Sab196087 	return (cmd_body(EHDR_CMD_T_EI_VERSION, obj_state, argc, argv));
17415088Sab196087 }
17425088Sab196087 
17435088Sab196087 
17445088Sab196087 static elfedit_cmdret_t
cmd_ei_osabi(elfedit_obj_state_t * obj_state,int argc,const char * argv[])17455088Sab196087 cmd_ei_osabi(elfedit_obj_state_t *obj_state, int argc, const char *argv[])
17465088Sab196087 {
17475088Sab196087 	return (cmd_body(EHDR_CMD_T_EI_OSABI, obj_state, argc, argv));
17485088Sab196087 }
17495088Sab196087 
17505088Sab196087 
17515088Sab196087 static elfedit_cmdret_t
cmd_ei_abiversion(elfedit_obj_state_t * obj_state,int argc,const char * argv[])17525088Sab196087 cmd_ei_abiversion(elfedit_obj_state_t *obj_state, int argc, const char *argv[])
17535088Sab196087 {
17545088Sab196087 	return (cmd_body(EHDR_CMD_T_EI_ABIVERSION, obj_state, argc, argv));
17555088Sab196087 }
17565088Sab196087 
17575088Sab196087 
17585088Sab196087 
17595088Sab196087 
17605088Sab196087 /*ARGSUSED*/
17615088Sab196087 elfedit_module_t *
elfedit_init(elfedit_module_version_t version)17625088Sab196087 elfedit_init(elfedit_module_version_t version)
17635088Sab196087 {
17645088Sab196087 	/* Many of the commands only accept -o */
17655088Sab196087 	static elfedit_cmd_optarg_t opt_std[] = {
17665088Sab196087 		{ ELFEDIT_STDOA_OPT_O, NULL,
17675088Sab196087 		    ELFEDIT_CMDOA_F_INHERIT, 0, 0 },
17685088Sab196087 		{ NULL }
17695088Sab196087 	};
17705088Sab196087 
17715088Sab196087 
17725088Sab196087 	/* ehdr:dump */
17735088Sab196087 	static const char *name_dump[] = {
17745088Sab196087 	    MSG_ORIG(MSG_CMD_DUMP),
17755088Sab196087 	    MSG_ORIG(MSG_STR_EMPTY),	/* "" makes this the default command */
17765088Sab196087 	    NULL
17775088Sab196087 	};
17785088Sab196087 
17795088Sab196087 	/* ehdr:e_ident */
17805088Sab196087 	static const char *name_e_ident[] = {
17815088Sab196087 		MSG_ORIG(MSG_CMD_E_IDENT), NULL };
17825088Sab196087 	static elfedit_cmd_optarg_t arg_e_ident[] = {
17835088Sab196087 		{ MSG_ORIG(MSG_STR_INDEX),
17845088Sab196087 		    /* MSG_INTL(MSG_ARGDESC_E_IDENT_NDX) */
17855088Sab196087 		    ELFEDIT_I18NHDL(MSG_ARGDESC_E_IDENT_NDX),
17865088Sab196087 		    ELFEDIT_CMDOA_F_OPT, 0 },
17875088Sab196087 		{ MSG_ORIG(MSG_STR_VALUE),
17885088Sab196087 		    /* MSG_INTL(MSG_ARGDESC_E_IDENT_VALUE) */
17895088Sab196087 		    ELFEDIT_I18NHDL(MSG_ARGDESC_E_IDENT_VALUE),
17905088Sab196087 		    ELFEDIT_CMDOA_F_OPT, 0 },
17915088Sab196087 		{ NULL }
17925088Sab196087 	};
17935088Sab196087 
17945088Sab196087 	/* ehdr:e_type */
17955088Sab196087 	static const char *name_e_type[] = {
17965088Sab196087 		MSG_ORIG(MSG_CMD_E_TYPE), NULL };
17975088Sab196087 	static elfedit_cmd_optarg_t arg_e_type[] = {
17985088Sab196087 		{ MSG_ORIG(MSG_STR_VALUE),
17995088Sab196087 		    /* MSG_INTL(MSG_ARGDESC_E_TYPE_VALUE) */
18005088Sab196087 		    ELFEDIT_I18NHDL(MSG_ARGDESC_E_TYPE_VALUE),
18015088Sab196087 		    ELFEDIT_CMDOA_F_OPT, 0 },
18025088Sab196087 		{ NULL }
18035088Sab196087 	};
18045088Sab196087 
18055088Sab196087 	/* ehdr:e_machine */
18065088Sab196087 	static const char *name_e_machine[] = {
18075088Sab196087 		MSG_ORIG(MSG_CMD_E_MACHINE), NULL };
18085088Sab196087 	static elfedit_cmd_optarg_t arg_e_machine[] = {
18095088Sab196087 		{ MSG_ORIG(MSG_STR_TYPE),
18105088Sab196087 		    /* MSG_INTL(MSG_ARGDESC_E_MACHINE_VALUE) */
18115088Sab196087 		    ELFEDIT_I18NHDL(MSG_ARGDESC_E_MACHINE_VALUE),
18125088Sab196087 		    ELFEDIT_CMDOA_F_OPT, 0 },
18135088Sab196087 		{ NULL }
18145088Sab196087 	};
18155088Sab196087 
18165088Sab196087 	/* ehdr:e_version */
18175088Sab196087 	static const char *name_e_version[] = {
18185088Sab196087 		MSG_ORIG(MSG_CMD_E_VERSION), NULL };
18195088Sab196087 	static elfedit_cmd_optarg_t arg_e_version[] = {
18205088Sab196087 		{ MSG_ORIG(MSG_STR_VERSION),
18215088Sab196087 		    /* MSG_INTL(MSG_ARGDESC_E_VERSION_VALUE) */
18225088Sab196087 		    ELFEDIT_I18NHDL(MSG_ARGDESC_E_VERSION_VALUE),
18235088Sab196087 		    ELFEDIT_CMDOA_F_OPT, 0 },
18245088Sab196087 		{ NULL }
18255088Sab196087 	};
18265088Sab196087 
18275088Sab196087 	/* ehdr:e_entry */
18285088Sab196087 	static const char *name_e_entry[] = {
18295088Sab196087 		MSG_ORIG(MSG_CMD_E_ENTRY), NULL };
18305088Sab196087 	static elfedit_cmd_optarg_t arg_e_entry[] = {
18315088Sab196087 		{ MSG_ORIG(MSG_STR_VALUE),
18325088Sab196087 		    /* MSG_INTL(MSG_ARGDESC_E_ENTRY_VALUE) */
18335088Sab196087 		    ELFEDIT_I18NHDL(MSG_ARGDESC_E_ENTRY_VALUE),
18345088Sab196087 		    ELFEDIT_CMDOA_F_OPT, 0 },
18355088Sab196087 		{ NULL }
18365088Sab196087 	};
18375088Sab196087 
18385088Sab196087 	/* ehdr:e_phoff */
18395088Sab196087 	static const char *name_e_phoff[] = {
18405088Sab196087 		MSG_ORIG(MSG_CMD_E_PHOFF), NULL };
18415088Sab196087 	static elfedit_cmd_optarg_t arg_e_phoff[] = {
18425088Sab196087 		{ MSG_ORIG(MSG_STR_OFFSET),
18435088Sab196087 		    /* MSG_INTL(MSG_ARGDESC_E_PHOFF_VALUE) */
18445088Sab196087 		    ELFEDIT_I18NHDL(MSG_ARGDESC_E_PHOFF_VALUE),
18455088Sab196087 		    ELFEDIT_CMDOA_F_OPT, 0 },
18465088Sab196087 		{ NULL }
18475088Sab196087 	};
18485088Sab196087 
18495088Sab196087 	/* ehdr:e_shoff */
18505088Sab196087 	static const char *name_e_shoff[] = {
18515088Sab196087 		MSG_ORIG(MSG_CMD_E_SHOFF), NULL };
18525088Sab196087 	static elfedit_cmd_optarg_t arg_e_shoff[] = {
18535088Sab196087 		{ MSG_ORIG(MSG_STR_OFFSET),
18545088Sab196087 		    /* MSG_INTL(MSG_ARGDESC_E_SHOFF_VALUE) */
18555088Sab196087 		    ELFEDIT_I18NHDL(MSG_ARGDESC_E_SHOFF_VALUE),
18565088Sab196087 		    ELFEDIT_CMDOA_F_OPT, 0 },
18575088Sab196087 		{ NULL }
18585088Sab196087 	};
18595088Sab196087 
18605088Sab196087 	/* ehdr:e_flags */
18615088Sab196087 	static const char *name_e_flags[] = {
18625088Sab196087 		MSG_ORIG(MSG_CMD_E_FLAGS), NULL };
18635088Sab196087 	static elfedit_cmd_optarg_t opt_e_flags[] = {
18645088Sab196087 		{ ELFEDIT_STDOA_OPT_AND, NULL,
18655088Sab196087 		    ELFEDIT_CMDOA_F_INHERIT, EHDR_OPT_F_AND, EHDR_OPT_F_OR },
18665088Sab196087 		{ ELFEDIT_STDOA_OPT_CMP, NULL,
18675088Sab196087 		    ELFEDIT_CMDOA_F_INHERIT, EHDR_OPT_F_CMP, 0 },
18685088Sab196087 		{ ELFEDIT_STDOA_OPT_O, NULL,
18695088Sab196087 		    ELFEDIT_CMDOA_F_INHERIT, 0, 0 },
18705088Sab196087 		{ ELFEDIT_STDOA_OPT_OR, NULL,
18715088Sab196087 		    ELFEDIT_CMDOA_F_INHERIT, EHDR_OPT_F_OR, EHDR_OPT_F_AND },
18725088Sab196087 		{ NULL }
18735088Sab196087 	};
18745088Sab196087 	static elfedit_cmd_optarg_t arg_e_flags[] = {
18755088Sab196087 		{ MSG_ORIG(MSG_STR_FLAGVALUE),
18765088Sab196087 		    /* MSG_INTL(MSG_ARGDESC_E_FLAGS_VALUE) */
18775088Sab196087 		    ELFEDIT_I18NHDL(MSG_ARGDESC_E_FLAGS_VALUE),
18785088Sab196087 		    ELFEDIT_CMDOA_F_OPT | ELFEDIT_CMDOA_F_MULT, 0 },
18795088Sab196087 		{ NULL }
18805088Sab196087 	};
18815088Sab196087 
18825088Sab196087 	/* ehdr:e_ehsize */
18835088Sab196087 	static const char *name_e_ehsize[] = {
18845088Sab196087 		MSG_ORIG(MSG_CMD_E_EHSIZE), NULL };
18855088Sab196087 	static elfedit_cmd_optarg_t arg_e_ehsize[] = {
18865088Sab196087 		{ MSG_ORIG(MSG_STR_VALUE),
18875088Sab196087 		    /* MSG_INTL(MSG_ARGDESC_E_EHSIZE_VALUE) */
18885088Sab196087 		    ELFEDIT_I18NHDL(MSG_ARGDESC_E_EHSIZE_VALUE),
18895088Sab196087 		    ELFEDIT_CMDOA_F_OPT, 0 },
18905088Sab196087 		{ NULL }
18915088Sab196087 	};
18925088Sab196087 
18935088Sab196087 	/* ehdr:e_phentsize */
18945088Sab196087 	static const char *name_e_phentsize[] = {
18955088Sab196087 		MSG_ORIG(MSG_CMD_E_PHENTSIZE), NULL };
18965088Sab196087 	static elfedit_cmd_optarg_t arg_e_phentsize[] = {
18975088Sab196087 		{ MSG_ORIG(MSG_STR_VALUE),
18985088Sab196087 		    /* MSG_INTL(MSG_ARGDESC_E_PHENTSIZE_VALUE) */
18995088Sab196087 		    ELFEDIT_I18NHDL(MSG_ARGDESC_E_PHENTSIZE_VALUE),
19005088Sab196087 		    ELFEDIT_CMDOA_F_OPT, 0 },
19015088Sab196087 		{ NULL }
19025088Sab196087 	};
19035088Sab196087 
19045088Sab196087 	/* ehdr:e_phnum */
19055088Sab196087 	static const char *name_e_phnum[] = {
19065088Sab196087 		MSG_ORIG(MSG_CMD_E_PHNUM), NULL };
19075088Sab196087 	static elfedit_cmd_optarg_t arg_e_phnum[] = {
19085088Sab196087 		{ MSG_ORIG(MSG_STR_VALUE),
19095088Sab196087 		    /* MSG_INTL(MSG_ARGDESC_E_PHNUM_VALUE) */
19105088Sab196087 		    ELFEDIT_I18NHDL(MSG_ARGDESC_E_PHNUM_VALUE),
19115088Sab196087 		    ELFEDIT_CMDOA_F_OPT, 0 },
19125088Sab196087 		{ NULL }
19135088Sab196087 	};
19145088Sab196087 
19155088Sab196087 	/* ehdr:e_shentsize */
19165088Sab196087 	static const char *name_e_shentsize[] = {
19175088Sab196087 		MSG_ORIG(MSG_CMD_E_SHENTSIZE), NULL };
19185088Sab196087 	static elfedit_cmd_optarg_t arg_e_shentsize[] = {
19195088Sab196087 		{ MSG_ORIG(MSG_STR_VALUE),
19205088Sab196087 		    /* MSG_INTL(MSG_ARGDESC_E_SHENTSIZE_VALUE) */
19215088Sab196087 		    ELFEDIT_I18NHDL(MSG_ARGDESC_E_SHENTSIZE_VALUE),
19225088Sab196087 		    ELFEDIT_CMDOA_F_OPT, 0 },
19235088Sab196087 		{ NULL }
19245088Sab196087 	};
19255088Sab196087 
19265088Sab196087 	/* ehdr:e_shnum */
19275088Sab196087 	static const char *name_e_shnum[] = {
19285088Sab196087 		MSG_ORIG(MSG_CMD_E_SHNUM), NULL };
19295088Sab196087 	static elfedit_cmd_optarg_t arg_e_shnum[] = {
19305088Sab196087 		{ MSG_ORIG(MSG_STR_VALUE),
19315088Sab196087 		    /* MSG_INTL(MSG_ARGDESC_E_SHNUM_VALUE) */
19325088Sab196087 		    ELFEDIT_I18NHDL(MSG_ARGDESC_E_SHNUM_VALUE),
19335088Sab196087 		    ELFEDIT_CMDOA_F_OPT, 0 },
19345088Sab196087 		{ NULL }
19355088Sab196087 	};
19365088Sab196087 
19375088Sab196087 	/* ehdr:e_shstrndx */
19385088Sab196087 	static const char *name_e_shstrndx[] = {
19395088Sab196087 		MSG_ORIG(MSG_CMD_E_SHSTRNDX), NULL };
19405088Sab196087 	static elfedit_cmd_optarg_t opt_e_shstrndx[] = {
19415088Sab196087 		{ ELFEDIT_STDOA_OPT_O, NULL,
19425088Sab196087 		    ELFEDIT_CMDOA_F_INHERIT, 0, 0 },
19435088Sab196087 		{ MSG_ORIG(MSG_STR_MINUS_SHNDX),
19445088Sab196087 		    /* MSG_INTL(MSG_OPTDESC_SHNDX) */
19455088Sab196087 		    ELFEDIT_I18NHDL(MSG_OPTDESC_SHNDX), 0,
19465088Sab196087 		    EHDR_OPT_F_SHNDX, EHDR_OPT_F_SHTYP },
19475088Sab196087 		{ MSG_ORIG(MSG_STR_MINUS_SHTYP),
19485088Sab196087 		    /* MSG_INTL(MSG_OPTDESC_SHTYP) */
19495088Sab196087 		    ELFEDIT_I18NHDL(MSG_OPTDESC_SHTYP), 0,
19505088Sab196087 		    EHDR_OPT_F_SHTYP, EHDR_OPT_F_SHNDX,  },
19515088Sab196087 		{ NULL }
19525088Sab196087 	};
19535088Sab196087 	static elfedit_cmd_optarg_t arg_e_shstrndx[] = {
19545088Sab196087 		{ MSG_ORIG(MSG_STR_SEC),
19555088Sab196087 		    /* MSG_INTL(MSG_ARGDESC_E_SHSTRNDX_SEC) */
19565088Sab196087 		    ELFEDIT_I18NHDL(MSG_ARGDESC_E_SHSTRNDX_SEC),
19575088Sab196087 		    ELFEDIT_CMDOA_F_OPT, 0 },
19585088Sab196087 		{ NULL }
19595088Sab196087 	};
19605088Sab196087 
19615088Sab196087 	/* ehdr:ei_mag0 */
19625088Sab196087 	static const char *name_ei_mag0[] = {
19635088Sab196087 		MSG_ORIG(MSG_CMD_EI_MAG0), NULL };
19645088Sab196087 	static elfedit_cmd_optarg_t arg_ei_mag0[] = {
19655088Sab196087 		{ MSG_ORIG(MSG_STR_VALUE),
19665088Sab196087 		    /* MSG_INTL(MSG_ARGDESC_EI_MAG0_VALUE) */
19675088Sab196087 		    ELFEDIT_I18NHDL(MSG_ARGDESC_EI_MAG0_VALUE),
19685088Sab196087 		    ELFEDIT_CMDOA_F_OPT, 0 },
19695088Sab196087 		{ NULL }
19705088Sab196087 	};
19715088Sab196087 
19725088Sab196087 	/* ehdr:ei_mag1 */
19735088Sab196087 	static const char *name_ei_mag1[] = {
19745088Sab196087 		MSG_ORIG(MSG_CMD_EI_MAG1), NULL };
19755088Sab196087 	static elfedit_cmd_optarg_t arg_ei_mag1[] = {
19765088Sab196087 		{ MSG_ORIG(MSG_STR_VALUE),
19775088Sab196087 		    /* MSG_INTL(MSG_ARGDESC_EI_MAG1_VALUE) */
19785088Sab196087 		    ELFEDIT_I18NHDL(MSG_ARGDESC_EI_MAG1_VALUE),
19795088Sab196087 		    ELFEDIT_CMDOA_F_OPT, 0 },
19805088Sab196087 		{ NULL }
19815088Sab196087 	};
19825088Sab196087 
19835088Sab196087 	/* ehdr:ei_mag2 */
19845088Sab196087 	static const char *name_ei_mag2[] = {
19855088Sab196087 		MSG_ORIG(MSG_CMD_EI_MAG2), NULL };
19865088Sab196087 	static elfedit_cmd_optarg_t arg_ei_mag2[] = {
19875088Sab196087 		{ MSG_ORIG(MSG_STR_VALUE),
19885088Sab196087 		    /* MSG_INTL(MSG_ARGDESC_EI_MAG2_VALUE) */
19895088Sab196087 		    ELFEDIT_I18NHDL(MSG_ARGDESC_EI_MAG2_VALUE),
19905088Sab196087 		    ELFEDIT_CMDOA_F_OPT, 0 },
19915088Sab196087 		{ NULL }
19925088Sab196087 	};
19935088Sab196087 
19945088Sab196087 	/* ehdr:ei_mag3 */
19955088Sab196087 	static const char *name_ei_mag3[] = {
19965088Sab196087 		MSG_ORIG(MSG_CMD_EI_MAG3), NULL };
19975088Sab196087 	static elfedit_cmd_optarg_t arg_ei_mag3[] = {
19985088Sab196087 		{ MSG_ORIG(MSG_STR_VALUE),
19995088Sab196087 		    /* MSG_INTL(MSG_ARGDESC_EI_MAG3_VALUE) */
20005088Sab196087 		    ELFEDIT_I18NHDL(MSG_ARGDESC_EI_MAG3_VALUE),
20015088Sab196087 		    ELFEDIT_CMDOA_F_OPT, 0 },
20025088Sab196087 		{ NULL }
20035088Sab196087 	};
20045088Sab196087 
20055088Sab196087 	/* ehdr:ei_class */
20065088Sab196087 	static const char *name_ei_class[] = {
20075088Sab196087 		MSG_ORIG(MSG_CMD_EI_CLASS), NULL };
20085088Sab196087 	static elfedit_cmd_optarg_t arg_ei_class[] = {
20095088Sab196087 		{ MSG_ORIG(MSG_STR_VALUE),
20105088Sab196087 		    /* MSG_INTL(MSG_ARGDESC_EI_CLASS_VALUE) */
20115088Sab196087 		    ELFEDIT_I18NHDL(MSG_ARGDESC_EI_CLASS_VALUE),
20125088Sab196087 		    ELFEDIT_CMDOA_F_OPT, 0 },
20135088Sab196087 		{ NULL }
20145088Sab196087 	};
20155088Sab196087 
20165088Sab196087 	/* ehdr:ei_data */
20175088Sab196087 	static const char *name_ei_data[] = {
20185088Sab196087 		MSG_ORIG(MSG_CMD_EI_DATA), NULL };
20195088Sab196087 	static elfedit_cmd_optarg_t arg_ei_data[] = {
20205088Sab196087 		{ MSG_ORIG(MSG_STR_VALUE),
20215088Sab196087 		    /* MSG_INTL(MSG_ARGDESC_EI_DATA_VALUE) */
20225088Sab196087 		    ELFEDIT_I18NHDL(MSG_ARGDESC_EI_DATA_VALUE),
20235088Sab196087 		    ELFEDIT_CMDOA_F_OPT, 0 },
20245088Sab196087 		{ NULL }
20255088Sab196087 	};
20265088Sab196087 
20275088Sab196087 	/* ehdr:ei_version */
20285088Sab196087 	static const char *name_ei_version[] = {
20295088Sab196087 		MSG_ORIG(MSG_CMD_EI_VERSION), NULL };
20305088Sab196087 	/* Note: arg_e_version is also used for this command */
20315088Sab196087 
20325088Sab196087 	/* ehdr:ei_osabi */
20335088Sab196087 	static const char *name_ei_osabi[] = {
20345088Sab196087 		MSG_ORIG(MSG_CMD_EI_OSABI), NULL };
20355088Sab196087 	static elfedit_cmd_optarg_t arg_ei_osabi[] = {
20365088Sab196087 		{ MSG_ORIG(MSG_STR_VALUE),
20375088Sab196087 		    /* MSG_INTL(MSG_ARGDESC_EI_OSABI_VALUE) */
20385088Sab196087 		    ELFEDIT_I18NHDL(MSG_ARGDESC_EI_OSABI_VALUE),
20395088Sab196087 		    ELFEDIT_CMDOA_F_OPT, 0 },
20405088Sab196087 		{ NULL }
20415088Sab196087 	};
20425088Sab196087 
20435088Sab196087 	/* ehdr:ei_abiversion */
20445088Sab196087 	static const char *name_ei_abiversion[] = {
20455088Sab196087 		MSG_ORIG(MSG_CMD_EI_ABIVERSION), NULL };
20465088Sab196087 	static elfedit_cmd_optarg_t arg_ei_abiversion[] = {
20475088Sab196087 		{ MSG_ORIG(MSG_STR_VALUE),
20485088Sab196087 		    /* MSG_INTL(MSG_ARGDESC_EI_ABIVERSION_VALUE) */
20495088Sab196087 		    ELFEDIT_I18NHDL(MSG_ARGDESC_EI_ABIVERSION_VALUE),
20505088Sab196087 		    ELFEDIT_CMDOA_F_OPT, 0 },
20515088Sab196087 		{ NULL }
20525088Sab196087 	};
20535088Sab196087 
20545088Sab196087 
20555088Sab196087 
20565088Sab196087 
20575088Sab196087 	static elfedit_cmd_t cmds[] = {
20585088Sab196087 		/* ehdr:dump */
20595088Sab196087 		{ cmd_dump, NULL, name_dump,
20605088Sab196087 		    /* MSG_INTL(MSG_DESC_DUMP) */
20615088Sab196087 		    ELFEDIT_I18NHDL(MSG_DESC_DUMP),
20625088Sab196087 		    /* MSG_INTL(MSG_HELP_DUMP) */
20635088Sab196087 		    ELFEDIT_I18NHDL(MSG_HELP_DUMP),
20645088Sab196087 		    NULL, NULL },
20655088Sab196087 
20665088Sab196087 		/* ehdr:e_ident */
20675088Sab196087 		{ cmd_e_ident, cpl_e_ident, name_e_ident,
20685088Sab196087 		    /* MSG_INTL(MSG_DESC_E_IDENT) */
20695088Sab196087 		    ELFEDIT_I18NHDL(MSG_DESC_E_IDENT),
20705088Sab196087 		    /* MSG_INTL(MSG_HELP_E_IDENT) */
20715088Sab196087 		    ELFEDIT_I18NHDL(MSG_HELP_E_IDENT),
20725088Sab196087 		    opt_std, arg_e_ident },
20735088Sab196087 
20745088Sab196087 		/* ehdr:e_type */
20755088Sab196087 		{ cmd_e_type, cpl_e_type, name_e_type,
20765088Sab196087 		    /* MSG_INTL(MSG_DESC_E_TYPE) */
20775088Sab196087 		    ELFEDIT_I18NHDL(MSG_DESC_E_TYPE),
20785088Sab196087 		    /* MSG_INTL(MSG_HELP_E_TYPE) */
20795088Sab196087 		    ELFEDIT_I18NHDL(MSG_HELP_E_TYPE),
20805088Sab196087 		    opt_std, arg_e_type },
20815088Sab196087 
20825088Sab196087 		/* ehdr:e_machine */
20835088Sab196087 		{ cmd_e_machine, cpl_e_machine, name_e_machine,
20845088Sab196087 		    /* MSG_INTL(MSG_DESC_E_MACHINE) */
20855088Sab196087 		    ELFEDIT_I18NHDL(MSG_DESC_E_MACHINE),
20865088Sab196087 		    /* MSG_INTL(MSG_HELP_E_MACHINE) */
20875088Sab196087 		    ELFEDIT_I18NHDL(MSG_HELP_E_MACHINE),
20885088Sab196087 		    opt_std, arg_e_machine },
20895088Sab196087 
20905088Sab196087 		/* ehdr:e_version */
20915088Sab196087 		{ cmd_e_version, cpl_e_version, name_e_version,
20925088Sab196087 		    /* MSG_INTL(MSG_DESC_E_VERSION) */
20935088Sab196087 		    ELFEDIT_I18NHDL(MSG_DESC_E_VERSION),
20945088Sab196087 		    /* MSG_INTL(MSG_HELP_E_VERSION) */
20955088Sab196087 		    ELFEDIT_I18NHDL(MSG_HELP_E_VERSION),
20965088Sab196087 		    opt_std, arg_e_version },
20975088Sab196087 
20985088Sab196087 		/* ehdr:e_entry */
20995088Sab196087 		{ cmd_e_entry, NULL, name_e_entry,
21005088Sab196087 		    /* MSG_INTL(MSG_DESC_E_ENTRY) */
21015088Sab196087 		    ELFEDIT_I18NHDL(MSG_DESC_E_ENTRY),
21025088Sab196087 		    /* MSG_INTL(MSG_HELP_E_ENTRY) */
21035088Sab196087 		    ELFEDIT_I18NHDL(MSG_HELP_E_ENTRY),
21045088Sab196087 		    opt_std, arg_e_entry },
21055088Sab196087 
21065088Sab196087 		/* ehdr:e_phoff */
21075088Sab196087 		{ cmd_e_phoff, NULL, name_e_phoff,
21085088Sab196087 		    /* MSG_INTL(MSG_DESC_E_PHOFF) */
21095088Sab196087 		    ELFEDIT_I18NHDL(MSG_DESC_E_PHOFF),
21105088Sab196087 		    /* MSG_INTL(MSG_HELP_E_PHOFF) */
21115088Sab196087 		    ELFEDIT_I18NHDL(MSG_HELP_E_PHOFF),
21125088Sab196087 		    opt_std, arg_e_phoff },
21135088Sab196087 
21145088Sab196087 		/* ehdr:e_shoff */
21155088Sab196087 		{ cmd_e_shoff, NULL, name_e_shoff,
21165088Sab196087 		    /* MSG_INTL(MSG_DESC_E_SHOFF) */
21175088Sab196087 		    ELFEDIT_I18NHDL(MSG_DESC_E_SHOFF),
21185088Sab196087 		    /* MSG_INTL(MSG_HELP_E_SHOFF) */
21195088Sab196087 		    ELFEDIT_I18NHDL(MSG_HELP_E_SHOFF),
21205088Sab196087 		    opt_std, arg_e_shoff },
21215088Sab196087 
21225088Sab196087 		/* ehdr:e_flags */
21235088Sab196087 		{ cmd_e_flags, cpl_e_flags, name_e_flags,
21245088Sab196087 		    /* MSG_INTL(MSG_DESC_E_FLAGS) */
21255088Sab196087 		    ELFEDIT_I18NHDL(MSG_DESC_E_FLAGS),
21265088Sab196087 		    /* MSG_INTL(MSG_HELP_E_FLAGS) */
21275088Sab196087 		    ELFEDIT_I18NHDL(MSG_HELP_E_FLAGS),
21285088Sab196087 		    opt_e_flags, arg_e_flags },
21295088Sab196087 
21305088Sab196087 		/* ehdr:e_ehsize */
21315088Sab196087 		{ cmd_e_ehsize, NULL, name_e_ehsize,
21325088Sab196087 		    /* MSG_INTL(MSG_DESC_E_EHSIZE) */
21335088Sab196087 		    ELFEDIT_I18NHDL(MSG_DESC_E_EHSIZE),
21345088Sab196087 		    /* MSG_INTL(MSG_HELP_E_EHSIZE) */
21355088Sab196087 		    ELFEDIT_I18NHDL(MSG_HELP_E_EHSIZE),
21365088Sab196087 		    opt_std, arg_e_ehsize },
21375088Sab196087 
21385088Sab196087 		/* ehdr:e_phentsize */
21395088Sab196087 		{ cmd_e_phentsize, NULL, name_e_phentsize,
21405088Sab196087 		    /* MSG_INTL(MSG_DESC_E_PHENTSIZE) */
21415088Sab196087 		    ELFEDIT_I18NHDL(MSG_DESC_E_PHENTSIZE),
21425088Sab196087 		    /* MSG_INTL(MSG_HELP_E_PHENTSIZE) */
21435088Sab196087 		    ELFEDIT_I18NHDL(MSG_HELP_E_PHENTSIZE),
21445088Sab196087 		    opt_std, arg_e_phentsize },
21455088Sab196087 
21465088Sab196087 		/* ehdr:e_phnum */
21475088Sab196087 		{ cmd_e_phnum, NULL, name_e_phnum,
21485088Sab196087 		    /* MSG_INTL(MSG_DESC_E_PHNUM) */
21495088Sab196087 		    ELFEDIT_I18NHDL(MSG_DESC_E_PHNUM),
21505088Sab196087 		    /* MSG_INTL(MSG_HELP_E_PHNUM) */
21515088Sab196087 		    ELFEDIT_I18NHDL(MSG_HELP_E_PHNUM),
21525088Sab196087 		    opt_std, arg_e_phnum },
21535088Sab196087 
21545088Sab196087 		/* ehdr:e_shentsize */
21555088Sab196087 		{ cmd_e_shentsize, NULL, name_e_shentsize,
21565088Sab196087 		    /* MSG_INTL(MSG_DESC_E_SHENTSIZE) */
21575088Sab196087 		    ELFEDIT_I18NHDL(MSG_DESC_E_SHENTSIZE),
21585088Sab196087 		    /* MSG_INTL(MSG_HELP_E_SHENTSIZE) */
21595088Sab196087 		    ELFEDIT_I18NHDL(MSG_HELP_E_SHENTSIZE),
21605088Sab196087 		    opt_std, arg_e_shentsize },
21615088Sab196087 
21625088Sab196087 		/* ehdr:e_shnum */
21635088Sab196087 		{ cmd_e_shnum, NULL, name_e_shnum,
21645088Sab196087 		    /* MSG_INTL(MSG_DESC_E_SHNUM) */
21655088Sab196087 		    ELFEDIT_I18NHDL(MSG_DESC_E_SHNUM),
21665088Sab196087 		    /* MSG_INTL(MSG_HELP_E_SHNUM) */
21675088Sab196087 		    ELFEDIT_I18NHDL(MSG_HELP_E_SHNUM),
21685088Sab196087 		    opt_std, arg_e_shnum },
21695088Sab196087 
21705088Sab196087 		/* ehdr:e_shstrndx */
21715088Sab196087 		{ cmd_e_shstrndx, cpl_e_shstrndx, name_e_shstrndx,
21725088Sab196087 		    /* MSG_INTL(MSG_DESC_E_SHSTRNDX) */
21735088Sab196087 		    ELFEDIT_I18NHDL(MSG_DESC_E_SHSTRNDX),
21745088Sab196087 		    /* MSG_INTL(MSG_HELP_E_SHSTRNDX) */
21755088Sab196087 		    ELFEDIT_I18NHDL(MSG_HELP_E_SHSTRNDX),
21765088Sab196087 		    opt_e_shstrndx, arg_e_shstrndx },
21775088Sab196087 
21785088Sab196087 		/* ehdr:ei_mag0 */
21795088Sab196087 		{ cmd_ei_mag0, NULL, name_ei_mag0,
21805088Sab196087 		    /* MSG_INTL(MSG_DESC_EI_MAG0) */
21815088Sab196087 		    ELFEDIT_I18NHDL(MSG_DESC_EI_MAG0),
21825088Sab196087 		    /* MSG_INTL(MSG_HELP_EI_MAG0) */
21835088Sab196087 		    ELFEDIT_I18NHDL(MSG_HELP_EI_MAG0),
21845088Sab196087 		    opt_std, arg_ei_mag0 },
21855088Sab196087 
21865088Sab196087 		/* ehdr:ei_mag1 */
21875088Sab196087 		{ cmd_ei_mag1, NULL, name_ei_mag1,
21885088Sab196087 		    /* MSG_INTL(MSG_DESC_EI_MAG1) */
21895088Sab196087 		    ELFEDIT_I18NHDL(MSG_DESC_EI_MAG1),
21905088Sab196087 		    /* MSG_INTL(MSG_HELP_EI_MAG1) */
21915088Sab196087 		    ELFEDIT_I18NHDL(MSG_HELP_EI_MAG1),
21925088Sab196087 		    opt_std, arg_ei_mag1 },
21935088Sab196087 
21945088Sab196087 		/* ehdr:ei_mag2 */
21955088Sab196087 		{ cmd_ei_mag2, NULL, name_ei_mag2,
21965088Sab196087 		    /* MSG_INTL(MSG_DESC_EI_MAG2) */
21975088Sab196087 		    ELFEDIT_I18NHDL(MSG_DESC_EI_MAG2),
21985088Sab196087 		    /* MSG_INTL(MSG_HELP_EI_MAG2) */
21995088Sab196087 		    ELFEDIT_I18NHDL(MSG_HELP_EI_MAG2),
22005088Sab196087 		    opt_std, arg_ei_mag2 },
22015088Sab196087 
22025088Sab196087 		/* ehdr:ei_mag3 */
22035088Sab196087 		{ cmd_ei_mag3, NULL, name_ei_mag3,
22045088Sab196087 		    /* MSG_INTL(MSG_DESC_EI_MAG3) */
22055088Sab196087 		    ELFEDIT_I18NHDL(MSG_DESC_EI_MAG3),
22065088Sab196087 		    /* MSG_INTL(MSG_HELP_EI_MAG3) */
22075088Sab196087 		    ELFEDIT_I18NHDL(MSG_HELP_EI_MAG3),
22085088Sab196087 		    opt_std, arg_ei_mag3 },
22095088Sab196087 
22105088Sab196087 		/* ehdr:ei_class */
22115088Sab196087 		{ cmd_ei_class, cpl_ei_class, name_ei_class,
22125088Sab196087 		    /* MSG_INTL(MSG_DESC_EI_CLASS) */
22135088Sab196087 		    ELFEDIT_I18NHDL(MSG_DESC_EI_CLASS),
22145088Sab196087 		    /* MSG_INTL(MSG_HELP_EI_CLASS) */
22155088Sab196087 		    ELFEDIT_I18NHDL(MSG_HELP_EI_CLASS),
22165088Sab196087 		    opt_std, arg_ei_class },
22175088Sab196087 
22185088Sab196087 		/* ehdr:ei_data */
22195088Sab196087 		{ cmd_ei_data, cpl_ei_data, name_ei_data,
22205088Sab196087 		    /* MSG_INTL(MSG_DESC_EI_DATA) */
22215088Sab196087 		    ELFEDIT_I18NHDL(MSG_DESC_EI_DATA),
22225088Sab196087 		    /* MSG_INTL(MSG_HELP_EI_DATA) */
22235088Sab196087 		    ELFEDIT_I18NHDL(MSG_HELP_EI_DATA),
22245088Sab196087 		    opt_std, arg_ei_data },
22255088Sab196087 
22265088Sab196087 		/* ehdr:ei_version */
22275088Sab196087 		{ cmd_ei_version, cpl_e_version, name_ei_version,
22285088Sab196087 		    /* MSG_INTL(MSG_DESC_EI_VERSION) */
22295088Sab196087 		    ELFEDIT_I18NHDL(MSG_DESC_EI_VERSION),
22305088Sab196087 		    /* MSG_INTL(MSG_HELP_EI_VERSION) */
22315088Sab196087 		    ELFEDIT_I18NHDL(MSG_HELP_EI_VERSION),
22325088Sab196087 		    opt_std, arg_e_version },
22335088Sab196087 
22345088Sab196087 		/* ehdr:ei_osabi */
22355088Sab196087 		{ cmd_ei_osabi, cpl_ei_osabi, name_ei_osabi,
22365088Sab196087 		    /* MSG_INTL(MSG_DESC_EI_OSABI) */
22375088Sab196087 		    ELFEDIT_I18NHDL(MSG_DESC_EI_OSABI),
22385088Sab196087 		    /* MSG_INTL(MSG_HELP_EI_OSABI) */
22395088Sab196087 		    ELFEDIT_I18NHDL(MSG_HELP_EI_OSABI),
22405088Sab196087 		    opt_std, arg_ei_osabi },
22415088Sab196087 
22425088Sab196087 		/* ehdr:ei_abiversion */
2243*9273SAli.Bahrami@Sun.COM 		{ cmd_ei_abiversion, cpl_ei_abiversion, name_ei_abiversion,
22445088Sab196087 		    /* MSG_INTL(MSG_DESC_EI_ABIVERSION) */
22455088Sab196087 		    ELFEDIT_I18NHDL(MSG_DESC_EI_ABIVERSION),
22465088Sab196087 		    /* MSG_INTL(MSG_HELP_EI_ABIVERSION) */
22475088Sab196087 		    ELFEDIT_I18NHDL(MSG_HELP_EI_ABIVERSION),
22485088Sab196087 		    opt_std, arg_ei_abiversion },
22495088Sab196087 
22505088Sab196087 		{ NULL }
22515088Sab196087 	};
22525088Sab196087 
22535088Sab196087 	static elfedit_module_t module = {
22545088Sab196087 	    ELFEDIT_VER_CURRENT, MSG_ORIG(MSG_MOD_NAME),
22555088Sab196087 	    /* MSG_INTL(MSG_MOD_DESC) */
22565088Sab196087 	    ELFEDIT_I18NHDL(MSG_MOD_DESC),
22575088Sab196087 	    cmds, mod_i18nhdl_to_str };
22585088Sab196087 
22595088Sab196087 	return (&module);
22605088Sab196087 }
2261