xref: /onnv-gate/usr/src/cmd/sgs/elfedit/modules/common/ehdr.c (revision 5088:26c540f30cd3)
1*5088Sab196087 /*
2*5088Sab196087  * CDDL HEADER START
3*5088Sab196087  *
4*5088Sab196087  * The contents of this file are subject to the terms of the
5*5088Sab196087  * Common Development and Distribution License (the "License").
6*5088Sab196087  * You may not use this file except in compliance with the License.
7*5088Sab196087  *
8*5088Sab196087  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*5088Sab196087  * or http://www.opensolaris.org/os/licensing.
10*5088Sab196087  * See the License for the specific language governing permissions
11*5088Sab196087  * and limitations under the License.
12*5088Sab196087  *
13*5088Sab196087  * When distributing Covered Code, include this CDDL HEADER in each
14*5088Sab196087  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*5088Sab196087  * If applicable, add the following below this CDDL HEADER, with the
16*5088Sab196087  * fields enclosed by brackets "[]" replaced with your own identifying
17*5088Sab196087  * information: Portions Copyright [yyyy] [name of copyright owner]
18*5088Sab196087  *
19*5088Sab196087  * CDDL HEADER END
20*5088Sab196087  */
21*5088Sab196087 
22*5088Sab196087 /*
23*5088Sab196087  * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
24*5088Sab196087  * Use is subject to license terms.
25*5088Sab196087  */
26*5088Sab196087 #pragma ident	"%Z%%M%	%I%	%E% SMI"
27*5088Sab196087 
28*5088Sab196087 #include	<stdio.h>
29*5088Sab196087 #include	<ctype.h>
30*5088Sab196087 #include	<machdep.h>
31*5088Sab196087 #include	<elfedit.h>
32*5088Sab196087 #include	<sys/elf_SPARC.h>
33*5088Sab196087 #include	<sys/elf_amd64.h>
34*5088Sab196087 #include	<strings.h>
35*5088Sab196087 #include	<conv.h>
36*5088Sab196087 #include	<debug.h>
37*5088Sab196087 #include	<ehdr_msg.h>
38*5088Sab196087 
39*5088Sab196087 
40*5088Sab196087 
41*5088Sab196087 
42*5088Sab196087 #define	MAXNDXSIZE	10
43*5088Sab196087 
44*5088Sab196087 
45*5088Sab196087 
46*5088Sab196087 
47*5088Sab196087 /*
48*5088Sab196087  * This module handles changes to the ELF header
49*5088Sab196087  */
50*5088Sab196087 
51*5088Sab196087 
52*5088Sab196087 
53*5088Sab196087 /*
54*5088Sab196087  * This module uses shared code for several of the commands.
55*5088Sab196087  * It is sometimes necessary to know which specific command
56*5088Sab196087  * is active.
57*5088Sab196087  */
58*5088Sab196087 typedef enum {
59*5088Sab196087 	/* Dump command, used as module default to display ELF header */
60*5088Sab196087 	EHDR_CMD_T_DUMP =		0,	/* ehdr:dump */
61*5088Sab196087 
62*5088Sab196087 	/* Commands that correspond directly to ELF header fields */
63*5088Sab196087 	EHDR_CMD_T_E_IDENT =		1,	/* ehdr:e_ident */
64*5088Sab196087 	EHDR_CMD_T_E_TYPE =		2,	/* ehdr:e_type */
65*5088Sab196087 	EHDR_CMD_T_E_MACHINE =		3,	/* ehdr:e_machine */
66*5088Sab196087 	EHDR_CMD_T_E_VERSION =		4,	/* ehdr:e_version */
67*5088Sab196087 	EHDR_CMD_T_E_ENTRY =		5,	/* ehdr:e_entry */
68*5088Sab196087 	EHDR_CMD_T_E_PHOFF =		6,	/* ehdr:e_phoff */
69*5088Sab196087 	EHDR_CMD_T_E_SHOFF =		7,	/* ehdr:e_shoff */
70*5088Sab196087 	EHDR_CMD_T_E_FLAGS =		8,	/* ehdr:e_flags */
71*5088Sab196087 	EHDR_CMD_T_E_EHSIZE =		9,	/* ehdr:e_ehsize */
72*5088Sab196087 	EHDR_CMD_T_E_PHENTSIZE =	10,	/* ehdr:e_phentsize */
73*5088Sab196087 	EHDR_CMD_T_E_PHNUM =		11,	/* ehdr:e_phnum */
74*5088Sab196087 	EHDR_CMD_T_E_SHENTSIZE =	12,	/* ehdr:e_shentsize */
75*5088Sab196087 	EHDR_CMD_T_E_SHNUM =		13,	/* ehdr:e_shnum */
76*5088Sab196087 	EHDR_CMD_T_E_SHSTRNDX =		14,	/* ehdr:e_shstrndx */
77*5088Sab196087 
78*5088Sab196087 	/* Commands that correspond to the e_ident[] array in ELF hdr */
79*5088Sab196087 	EHDR_CMD_T_EI_MAG0 =		15,	/* ehdr:ei_mag0 */
80*5088Sab196087 	EHDR_CMD_T_EI_MAG1 =		16,	/* ehdr:ei_mag1 */
81*5088Sab196087 	EHDR_CMD_T_EI_MAG2 =		17,	/* ehdr:ei_mag2 */
82*5088Sab196087 	EHDR_CMD_T_EI_MAG3 =		18,	/* ehdr:ei_mag3 */
83*5088Sab196087 	EHDR_CMD_T_EI_CLASS =		19,	/* ehdr:ei_class */
84*5088Sab196087 	EHDR_CMD_T_EI_DATA =		20,	/* ehdr:ei_data */
85*5088Sab196087 	EHDR_CMD_T_EI_VERSION =		21,	/* ehdr:ei_version */
86*5088Sab196087 	EHDR_CMD_T_EI_OSABI =		22,	/* ehdr:ei_osabi */
87*5088Sab196087 	EHDR_CMD_T_EI_ABIVERSION =	23	/* ehdr:ei_abiversion */
88*5088Sab196087 } EHDR_CMD_T;
89*5088Sab196087 
90*5088Sab196087 
91*5088Sab196087 
92*5088Sab196087 
93*5088Sab196087 
94*5088Sab196087 
95*5088Sab196087 #ifndef _ELF64
96*5088Sab196087 /*
97*5088Sab196087  * We supply this function for the msg module
98*5088Sab196087  */
99*5088Sab196087 const char *
100*5088Sab196087 _ehdr_msg(Msg mid)
101*5088Sab196087 {
102*5088Sab196087 	return (gettext(MSG_ORIG(mid)));
103*5088Sab196087 }
104*5088Sab196087 #endif
105*5088Sab196087 
106*5088Sab196087 
107*5088Sab196087 /*
108*5088Sab196087  * This function is supplied to elfedit through our elfedit_module_t
109*5088Sab196087  * definition. It translates the opaque elfedit_i18nhdl_t handles
110*5088Sab196087  * in our module interface into the actual strings for elfedit to
111*5088Sab196087  * use.
112*5088Sab196087  *
113*5088Sab196087  * note:
114*5088Sab196087  *	This module uses Msg codes for its i18n handle type.
115*5088Sab196087  *	So the translation is simply to use MSG_INTL() to turn
116*5088Sab196087  *	it into a string and return it.
117*5088Sab196087  */
118*5088Sab196087 static const char *
119*5088Sab196087 mod_i18nhdl_to_str(elfedit_i18nhdl_t hdl)
120*5088Sab196087 {
121*5088Sab196087 	Msg msg = (Msg)hdl;
122*5088Sab196087 
123*5088Sab196087 	return (MSG_INTL(msg));
124*5088Sab196087 }
125*5088Sab196087 
126*5088Sab196087 
127*5088Sab196087 
128*5088Sab196087 /*
129*5088Sab196087  * The ehdr_opt_t enum specifies a bit value for every optional
130*5088Sab196087  * argument allowed by a command in this module.
131*5088Sab196087  */
132*5088Sab196087 typedef enum {
133*5088Sab196087 	EHDR_OPT_F_AND =	1,	/* -and: AND (&) values to dest */
134*5088Sab196087 	EHDR_OPT_F_CMP =	2,	/* -cmp: Complement (~) values */
135*5088Sab196087 	EHDR_OPT_F_OR =		4,	/* -or: OR (|) values to dest */
136*5088Sab196087 	EHDR_OPT_F_SHNDX =	8,	/* -shndx: sec argument is index of */
137*5088Sab196087 					/*	section, not name */
138*5088Sab196087 	EHDR_OPT_F_SHTYP =	16	/* -shtyp: sec argument is type of */
139*5088Sab196087 					/*	section, not name */
140*5088Sab196087 } ehdr_opt_t;
141*5088Sab196087 
142*5088Sab196087 
143*5088Sab196087 /*
144*5088Sab196087  * A variable of type ARGSTATE is used by each command to maintain
145*5088Sab196087  * information about the arguments and related things. It is
146*5088Sab196087  * initialized by process_args(), and used by the other routines.
147*5088Sab196087  */
148*5088Sab196087 typedef struct {
149*5088Sab196087 	elfedit_obj_state_t	*obj_state;
150*5088Sab196087 	ehdr_opt_t		optmask;   	/* Mask of options used */
151*5088Sab196087 	int			argc;		/* # of plain arguments */
152*5088Sab196087 	const char		**argv;		/* Plain arguments */
153*5088Sab196087 } ARGSTATE;
154*5088Sab196087 
155*5088Sab196087 
156*5088Sab196087 
157*5088Sab196087 /*
158*5088Sab196087  * Standard argument processing for ehdr module
159*5088Sab196087  *
160*5088Sab196087  * entry
161*5088Sab196087  *	obj_state, argc, argv - Standard command arguments
162*5088Sab196087  *	argstate - Address of ARGSTATE block to be initialized
163*5088Sab196087  *
164*5088Sab196087  * exit:
165*5088Sab196087  *	On success, *argstate is initialized. On error,
166*5088Sab196087  *	an error is issued and this routine does not return.
167*5088Sab196087  */
168*5088Sab196087 static void
169*5088Sab196087 process_args(elfedit_obj_state_t *obj_state, int argc, const char *argv[],
170*5088Sab196087     ARGSTATE *argstate)
171*5088Sab196087 {
172*5088Sab196087 	elfedit_getopt_state_t	getopt_state;
173*5088Sab196087 	elfedit_getopt_ret_t	*getopt_ret;
174*5088Sab196087 
175*5088Sab196087 	bzero(argstate, sizeof (*argstate));
176*5088Sab196087 	argstate->obj_state = obj_state;
177*5088Sab196087 
178*5088Sab196087 	elfedit_getopt_init(&getopt_state, &argc, &argv);
179*5088Sab196087 	/* Add each new option to the options mask */
180*5088Sab196087 	while ((getopt_ret = elfedit_getopt(&getopt_state)) != NULL)
181*5088Sab196087 		argstate->optmask |= getopt_ret->gor_idmask;
182*5088Sab196087 
183*5088Sab196087 	/* If there may be an arbitrary amount of output, use a pager */
184*5088Sab196087 	if (argc == 0)
185*5088Sab196087 		elfedit_pager_init();
186*5088Sab196087 
187*5088Sab196087 	/* Return the updated values of argc/argv */
188*5088Sab196087 	argstate->argc = argc;
189*5088Sab196087 	argstate->argv = argv;
190*5088Sab196087 }
191*5088Sab196087 
192*5088Sab196087 
193*5088Sab196087 
194*5088Sab196087 
195*5088Sab196087 
196*5088Sab196087 
197*5088Sab196087 /*
198*5088Sab196087  * Format the given magic number byte into a buffer
199*5088Sab196087  *
200*5088Sab196087  * entry:
201*5088Sab196087  *	value - Value of the magic value byte given by
202*5088Sab196087  *		ehdr->ei_ident[EI_MAG?]
203*5088Sab196087  */
204*5088Sab196087 static const char *
205*5088Sab196087 conv_magic_value(int value)
206*5088Sab196087 {
207*5088Sab196087 	/*
208*5088Sab196087 	 * This routine can be called twice within a single C statement,
209*5088Sab196087 	 * so we use alternating buffers on each call to allow this
210*5088Sab196087 	 * without requiring the caller to supply a buffer (the size of
211*5088Sab196087 	 * which they don't know).
212*5088Sab196087 	 */
213*5088Sab196087 	static char buf1[20];
214*5088Sab196087 	static char buf2[20];
215*5088Sab196087 	static char *buf;
216*5088Sab196087 
217*5088Sab196087 	/* Switch buffers */
218*5088Sab196087 	buf = (buf == buf1) ? buf2 : buf1;
219*5088Sab196087 
220*5088Sab196087 	if (isprint(value))
221*5088Sab196087 		(void) snprintf(buf, sizeof (buf1),
222*5088Sab196087 		    MSG_ORIG(MSG_FMT_HEXNUM_QCHR), value, value);
223*5088Sab196087 	else
224*5088Sab196087 		(void) snprintf(buf, sizeof (buf1),
225*5088Sab196087 		    MSG_ORIG(MSG_FMT_HEXNUM), value);
226*5088Sab196087 	return (buf);
227*5088Sab196087 }
228*5088Sab196087 
229*5088Sab196087 
230*5088Sab196087 
231*5088Sab196087 /*
232*5088Sab196087  * Print ELF header values, taking the calling command, and output style
233*5088Sab196087  * into account.
234*5088Sab196087  *
235*5088Sab196087  * entry:
236*5088Sab196087  *	cmd - EHDR_CMD_T_* value giving identify of caller
237*5088Sab196087  *	e_ident_ndx - Ignored unless cmd is EHDR_CMD_T_E_IDENT. In IDENT
238*5088Sab196087  *		case, index of item in e_ident[] array to display, or
239*5088Sab196087  *		-1 to display the entire array.
240*5088Sab196087  *	autoprint - If True, output is only produced if the elfedit
241*5088Sab196087  *		autoprint flag is set. If False, output is always produced.
242*5088Sab196087  *	argstate - Argument state block
243*5088Sab196087  */
244*5088Sab196087 static void
245*5088Sab196087 print_ehdr(EHDR_CMD_T cmd, int e_ident_ndx, int autoprint,
246*5088Sab196087     ARGSTATE *argstate)
247*5088Sab196087 {
248*5088Sab196087 	elfedit_outstyle_t	outstyle;
249*5088Sab196087 	Conv_fmt_flags_t	flags_fmt_flags = 0;
250*5088Sab196087 	Ehdr		*ehdr;
251*5088Sab196087 	int		c;
252*5088Sab196087 	Conv_inv_buf_t	inv_buf;
253*5088Sab196087 
254*5088Sab196087 	if (autoprint && ((elfedit_flags() & ELFEDIT_F_AUTOPRINT) == 0))
255*5088Sab196087 		return;
256*5088Sab196087 
257*5088Sab196087 	/*
258*5088Sab196087 	 * Pick an output style. ehdr:dump is required to use the default
259*5088Sab196087 	 * style. The other commands use the current output style.
260*5088Sab196087 	 */
261*5088Sab196087 	if (cmd == EHDR_CMD_T_DUMP) {
262*5088Sab196087 		outstyle = ELFEDIT_OUTSTYLE_DEFAULT;
263*5088Sab196087 	} else {
264*5088Sab196087 		outstyle = elfedit_outstyle();
265*5088Sab196087 
266*5088Sab196087 		/*
267*5088Sab196087 		 * When the caller specifies the simple output style,
268*5088Sab196087 		 * omit the brackets from around the values.
269*5088Sab196087 		 */
270*5088Sab196087 		if (outstyle == ELFEDIT_OUTSTYLE_SIMPLE)
271*5088Sab196087 			flags_fmt_flags = CONV_FMT_NOBKT;
272*5088Sab196087 
273*5088Sab196087 		/*
274*5088Sab196087 		 * For things that show a single header item, switch
275*5088Sab196087 		 * from default to simple mode.
276*5088Sab196087 		 */
277*5088Sab196087 		if ((outstyle == ELFEDIT_OUTSTYLE_DEFAULT) &&
278*5088Sab196087 		    ((cmd != EHDR_CMD_T_E_IDENT) || (e_ident_ndx != -1)))
279*5088Sab196087 			outstyle = ELFEDIT_OUTSTYLE_SIMPLE;
280*5088Sab196087 	}
281*5088Sab196087 
282*5088Sab196087 	ehdr = argstate->obj_state->os_ehdr;
283*5088Sab196087 
284*5088Sab196087 	/*
285*5088Sab196087 	 * If doing default output, use elfdump style where we
286*5088Sab196087 	 * show the full ELF header. In this case, the command
287*5088Sab196087 	 * that called us doesn't matter. This can only happen
288*5088Sab196087 	 * from ehdr:dump or ehdr:e_ident/
289*5088Sab196087 	 */
290*5088Sab196087 	if (outstyle == ELFEDIT_OUTSTYLE_DEFAULT) {
291*5088Sab196087 		const char *ndx, *value;
292*5088Sab196087 		char ndx_buf[64], value_buf[20];
293*5088Sab196087 		int i;
294*5088Sab196087 
295*5088Sab196087 		if (cmd == EHDR_CMD_T_DUMP) {
296*5088Sab196087 			Elf_ehdr(NULL, ehdr,
297*5088Sab196087 			    argstate->obj_state->os_secarr[0].sec_shdr);
298*5088Sab196087 			elfedit_printf(MSG_ORIG(MSG_STR_NL));
299*5088Sab196087 		}
300*5088Sab196087 
301*5088Sab196087 		/*
302*5088Sab196087 		 * Elf_ehdr() does not display all of e_ident[], so we
303*5088Sab196087 		 * augment by displaying the entire array separately.
304*5088Sab196087 		 */
305*5088Sab196087 		elfedit_printf(MSG_ORIG(MSG_STR_EIDENT_HDR));
306*5088Sab196087 
307*5088Sab196087 		for (i = 0; i < EI_NIDENT; i++) {
308*5088Sab196087 			ndx = value = NULL;
309*5088Sab196087 
310*5088Sab196087 			switch (i) {
311*5088Sab196087 			case EI_MAG0:
312*5088Sab196087 			case EI_MAG1:
313*5088Sab196087 			case EI_MAG2:
314*5088Sab196087 			case EI_MAG3:
315*5088Sab196087 				ndx = elfedit_atoconst_value_to_str(
316*5088Sab196087 				    ELFEDIT_CONST_EI, i, 1);
317*5088Sab196087 				value = conv_magic_value(ehdr->e_ident[i]);
318*5088Sab196087 				break;
319*5088Sab196087 			case EI_CLASS:
320*5088Sab196087 				ndx = elfedit_atoconst_value_to_str(
321*5088Sab196087 				    ELFEDIT_CONST_EI, EI_CLASS, 1);
322*5088Sab196087 				value = conv_ehdr_class(ehdr->e_ident[EI_CLASS],
323*5088Sab196087 				    0, &inv_buf);
324*5088Sab196087 				break;
325*5088Sab196087 			case EI_DATA:
326*5088Sab196087 				ndx = elfedit_atoconst_value_to_str(
327*5088Sab196087 				    ELFEDIT_CONST_EI, EI_DATA, 1);
328*5088Sab196087 				value = conv_ehdr_data(ehdr->e_ident[EI_DATA],
329*5088Sab196087 				    0, &inv_buf);
330*5088Sab196087 				break;
331*5088Sab196087 			case EI_VERSION:
332*5088Sab196087 				ndx = elfedit_atoconst_value_to_str(
333*5088Sab196087 				    ELFEDIT_CONST_EI, EI_VERSION, 1);
334*5088Sab196087 				value = conv_ehdr_vers(
335*5088Sab196087 				    ehdr->e_ident[EI_VERSION], 0, &inv_buf);
336*5088Sab196087 				break;
337*5088Sab196087 			case EI_OSABI:
338*5088Sab196087 				ndx = elfedit_atoconst_value_to_str(
339*5088Sab196087 				    ELFEDIT_CONST_EI, EI_OSABI, 1);
340*5088Sab196087 				value = conv_ehdr_osabi(ehdr->e_ident[EI_OSABI],
341*5088Sab196087 				    0, &inv_buf);
342*5088Sab196087 				break;
343*5088Sab196087 			case EI_ABIVERSION:
344*5088Sab196087 				ndx = elfedit_atoconst_value_to_str(
345*5088Sab196087 				    ELFEDIT_CONST_EI, EI_ABIVERSION, 1);
346*5088Sab196087 				value = value_buf;
347*5088Sab196087 				(void) snprintf(value_buf, sizeof (value_buf),
348*5088Sab196087 				    MSG_ORIG(MSG_FMT_HEXNUM), ehdr->e_ident[i]);
349*5088Sab196087 				break;
350*5088Sab196087 			default:
351*5088Sab196087 				value = value_buf;
352*5088Sab196087 				(void) snprintf(value_buf, sizeof (value_buf),
353*5088Sab196087 				    MSG_ORIG(MSG_FMT_HEXNUM), ehdr->e_ident[i]);
354*5088Sab196087 				break;
355*5088Sab196087 			}
356*5088Sab196087 
357*5088Sab196087 			if (ndx == NULL)
358*5088Sab196087 				(void) snprintf(ndx_buf, sizeof (ndx_buf),
359*5088Sab196087 				    MSG_ORIG(MSG_FMT_BKTINT), i);
360*5088Sab196087 			else
361*5088Sab196087 				(void) snprintf(ndx_buf, sizeof (ndx_buf),
362*5088Sab196087 				    MSG_ORIG(MSG_FMT_BKTSTR), ndx);
363*5088Sab196087 			elfedit_printf(MSG_ORIG(MSG_FMT_EI_ELT),
364*5088Sab196087 			    ndx_buf, value);
365*5088Sab196087 		}
366*5088Sab196087 		return;
367*5088Sab196087 	}
368*5088Sab196087 
369*5088Sab196087 
370*5088Sab196087 	switch (cmd) {
371*5088Sab196087 	case EHDR_CMD_T_E_IDENT:
372*5088Sab196087 		{
373*5088Sab196087 			int		i, cnt;
374*5088Sab196087 
375*5088Sab196087 			/* Show one element, or the entire thing? */
376*5088Sab196087 			if (e_ident_ndx == -1) {
377*5088Sab196087 				i = 0;
378*5088Sab196087 				cnt = EI_NIDENT;
379*5088Sab196087 			} else {
380*5088Sab196087 				i = e_ident_ndx;
381*5088Sab196087 				cnt = 1;
382*5088Sab196087 			}
383*5088Sab196087 
384*5088Sab196087 			for (; cnt-- > 0; i++) {
385*5088Sab196087 				/*
386*5088Sab196087 				 * If using numeric style, or there is
387*5088Sab196087 				 * no conversion routine for this item,
388*5088Sab196087 				 * print a simple hex value.
389*5088Sab196087 				 */
390*5088Sab196087 				if ((outstyle == ELFEDIT_OUTSTYLE_NUM) ||
391*5088Sab196087 				    (i >= EI_ABIVERSION)) {
392*5088Sab196087 					elfedit_printf(
393*5088Sab196087 					    MSG_ORIG(MSG_FMT_HEXNUMNL),
394*5088Sab196087 					    ehdr->e_ident[i]);
395*5088Sab196087 					continue;
396*5088Sab196087 				}
397*5088Sab196087 
398*5088Sab196087 				/* Handle special cases in simple mode */
399*5088Sab196087 				switch (i) {
400*5088Sab196087 				case EI_MAG0:
401*5088Sab196087 				case EI_MAG1:
402*5088Sab196087 				case EI_MAG2:
403*5088Sab196087 				case EI_MAG3:
404*5088Sab196087 					elfedit_printf(MSG_ORIG(MSG_FMT_STRNL),
405*5088Sab196087 					    conv_magic_value(ehdr->e_ident[i]));
406*5088Sab196087 					continue;
407*5088Sab196087 				case EI_CLASS:
408*5088Sab196087 					elfedit_printf(MSG_ORIG(MSG_FMT_STRNL),
409*5088Sab196087 					    conv_ehdr_class(
410*5088Sab196087 					    ehdr->e_ident[EI_CLASS], 0,
411*5088Sab196087 					    &inv_buf));
412*5088Sab196087 					continue;
413*5088Sab196087 				case EI_DATA:
414*5088Sab196087 					elfedit_printf(MSG_ORIG(MSG_FMT_STRNL),
415*5088Sab196087 					    conv_ehdr_data(
416*5088Sab196087 					    ehdr->e_ident[EI_DATA], 0,
417*5088Sab196087 					    &inv_buf));
418*5088Sab196087 					continue;
419*5088Sab196087 				case EI_VERSION:
420*5088Sab196087 					elfedit_printf(MSG_ORIG(MSG_FMT_STRNL),
421*5088Sab196087 					    conv_ehdr_vers(
422*5088Sab196087 					    ehdr->e_ident[EI_VERSION], 0,
423*5088Sab196087 					    &inv_buf));
424*5088Sab196087 					continue;
425*5088Sab196087 				case EI_OSABI:
426*5088Sab196087 					elfedit_printf(MSG_ORIG(MSG_FMT_STRNL),
427*5088Sab196087 					    conv_ehdr_osabi(
428*5088Sab196087 					    ehdr->e_ident[EI_OSABI], 0,
429*5088Sab196087 					    &inv_buf));
430*5088Sab196087 					continue;
431*5088Sab196087 				}
432*5088Sab196087 			}
433*5088Sab196087 		}
434*5088Sab196087 		return;
435*5088Sab196087 
436*5088Sab196087 	case EHDR_CMD_T_E_TYPE:
437*5088Sab196087 		if (outstyle == ELFEDIT_OUTSTYLE_SIMPLE)
438*5088Sab196087 			elfedit_printf(MSG_ORIG(MSG_FMT_STRNL),
439*5088Sab196087 			    conv_ehdr_type(ehdr->e_type, 0, &inv_buf));
440*5088Sab196087 		else
441*5088Sab196087 			elfedit_printf(MSG_ORIG(MSG_FMT_DECNUMNL),
442*5088Sab196087 			    ehdr->e_type);
443*5088Sab196087 		return;
444*5088Sab196087 
445*5088Sab196087 	case EHDR_CMD_T_E_MACHINE:
446*5088Sab196087 		if (outstyle == ELFEDIT_OUTSTYLE_SIMPLE) {
447*5088Sab196087 			elfedit_printf(MSG_ORIG(MSG_FMT_STRNL),
448*5088Sab196087 			    conv_ehdr_mach(ehdr->e_machine, 0, &inv_buf));
449*5088Sab196087 		} else {
450*5088Sab196087 			elfedit_printf(MSG_ORIG(MSG_FMT_DECNUMNL),
451*5088Sab196087 			    EC_WORD(ehdr->e_machine));
452*5088Sab196087 		}
453*5088Sab196087 		return;
454*5088Sab196087 
455*5088Sab196087 	case EHDR_CMD_T_E_VERSION:
456*5088Sab196087 		if (outstyle == ELFEDIT_OUTSTYLE_SIMPLE)
457*5088Sab196087 			elfedit_printf(MSG_ORIG(MSG_FMT_STRNL),
458*5088Sab196087 			    conv_ehdr_vers(ehdr->e_version, 0, &inv_buf));
459*5088Sab196087 		else
460*5088Sab196087 			elfedit_printf(MSG_ORIG(MSG_FMT_DECNUMNL),
461*5088Sab196087 			    ehdr->e_version);
462*5088Sab196087 		return;
463*5088Sab196087 
464*5088Sab196087 	case EHDR_CMD_T_E_ENTRY:
465*5088Sab196087 		elfedit_printf(MSG_ORIG(MSG_FMT_HEXNUMNL),
466*5088Sab196087 		    EC_WORD(ehdr->e_entry));
467*5088Sab196087 		return;
468*5088Sab196087 
469*5088Sab196087 	case EHDR_CMD_T_E_PHOFF:
470*5088Sab196087 		elfedit_printf(MSG_ORIG(MSG_FMT_HEXNUMNL),
471*5088Sab196087 		    EC_WORD(ehdr->e_phoff));
472*5088Sab196087 		return;
473*5088Sab196087 
474*5088Sab196087 	case EHDR_CMD_T_E_SHOFF:
475*5088Sab196087 		elfedit_printf(MSG_ORIG(MSG_FMT_HEXNUMNL),
476*5088Sab196087 		    EC_WORD(ehdr->e_shoff));
477*5088Sab196087 		return;
478*5088Sab196087 
479*5088Sab196087 	case EHDR_CMD_T_E_FLAGS:
480*5088Sab196087 		if (outstyle == ELFEDIT_OUTSTYLE_SIMPLE) {
481*5088Sab196087 			Conv_ehdr_flags_buf_t	flags_buf;
482*5088Sab196087 
483*5088Sab196087 			elfedit_printf(MSG_ORIG(MSG_FMT_STRNL),
484*5088Sab196087 			    conv_ehdr_flags(ehdr->e_machine, ehdr->e_flags,
485*5088Sab196087 			    flags_fmt_flags, &flags_buf));
486*5088Sab196087 		} else {
487*5088Sab196087 			elfedit_printf(MSG_ORIG(MSG_FMT_HEXNUMNL),
488*5088Sab196087 			    ehdr->e_flags);
489*5088Sab196087 		}
490*5088Sab196087 		return;
491*5088Sab196087 
492*5088Sab196087 	case EHDR_CMD_T_E_EHSIZE:
493*5088Sab196087 		elfedit_printf(MSG_ORIG(MSG_FMT_DECNUMNL),
494*5088Sab196087 		    EC_WORD(ehdr->e_ehsize));
495*5088Sab196087 		return;
496*5088Sab196087 
497*5088Sab196087 	case EHDR_CMD_T_E_PHENTSIZE:
498*5088Sab196087 		elfedit_printf(MSG_ORIG(MSG_FMT_DECNUMNL),
499*5088Sab196087 		    EC_WORD(ehdr->e_phentsize));
500*5088Sab196087 		return;
501*5088Sab196087 
502*5088Sab196087 	case EHDR_CMD_T_E_PHNUM:
503*5088Sab196087 		{
504*5088Sab196087 			Word num = ehdr->e_phnum;
505*5088Sab196087 
506*5088Sab196087 			/*
507*5088Sab196087 			 * If using extended indexes, fetch the real
508*5088Sab196087 			 * value from shdr[0].sh_info
509*5088Sab196087 			 */
510*5088Sab196087 			if (num == PN_XNUM)
511*5088Sab196087 				num = argstate->obj_state->
512*5088Sab196087 				    os_secarr[0].sec_shdr->sh_info;
513*5088Sab196087 
514*5088Sab196087 			elfedit_printf(MSG_ORIG(MSG_FMT_DECNUMNL),
515*5088Sab196087 			    EC_WORD(num));
516*5088Sab196087 		}
517*5088Sab196087 		return;
518*5088Sab196087 
519*5088Sab196087 	case EHDR_CMD_T_E_SHENTSIZE:
520*5088Sab196087 		elfedit_printf(MSG_ORIG(MSG_FMT_DECNUMNL),
521*5088Sab196087 		    EC_WORD(ehdr->e_shentsize));
522*5088Sab196087 		return;
523*5088Sab196087 
524*5088Sab196087 	case EHDR_CMD_T_E_SHNUM:
525*5088Sab196087 		{
526*5088Sab196087 			Word num = ehdr->e_shnum;
527*5088Sab196087 
528*5088Sab196087 			/*
529*5088Sab196087 			 * If using extended indexes, fetch the real
530*5088Sab196087 			 * value from shdr[0].sh_size
531*5088Sab196087 			 */
532*5088Sab196087 			if (num == 0)
533*5088Sab196087 				num = argstate->obj_state->
534*5088Sab196087 				    os_secarr[0].sec_shdr->sh_size;
535*5088Sab196087 
536*5088Sab196087 			elfedit_printf(MSG_ORIG(MSG_FMT_DECNUMNL),
537*5088Sab196087 			    EC_WORD(num));
538*5088Sab196087 		}
539*5088Sab196087 		return;
540*5088Sab196087 
541*5088Sab196087 	case EHDR_CMD_T_E_SHSTRNDX:
542*5088Sab196087 		{
543*5088Sab196087 			Word num = ehdr->e_shstrndx;
544*5088Sab196087 
545*5088Sab196087 			/*
546*5088Sab196087 			 * If using extended indexes, fetch the real
547*5088Sab196087 			 * value from shdr[0].sh_link
548*5088Sab196087 			 */
549*5088Sab196087 			if (num == SHN_XINDEX)
550*5088Sab196087 				num = argstate->obj_state->
551*5088Sab196087 				    os_secarr[0].sec_shdr->sh_link;
552*5088Sab196087 
553*5088Sab196087 			elfedit_printf(MSG_ORIG(MSG_FMT_DECNUMNL),
554*5088Sab196087 			    EC_WORD(num));
555*5088Sab196087 		}
556*5088Sab196087 		return;
557*5088Sab196087 
558*5088Sab196087 	case EHDR_CMD_T_EI_MAG0:
559*5088Sab196087 	case EHDR_CMD_T_EI_MAG1:
560*5088Sab196087 	case EHDR_CMD_T_EI_MAG2:
561*5088Sab196087 	case EHDR_CMD_T_EI_MAG3:
562*5088Sab196087 		/* This depends on EHDR_CMD_T_EI_MAG[0-3] being contiguous */
563*5088Sab196087 		c = ehdr->e_ident[cmd - EHDR_CMD_T_EI_MAG0];
564*5088Sab196087 		if (outstyle == ELFEDIT_OUTSTYLE_SIMPLE)
565*5088Sab196087 			elfedit_printf(MSG_ORIG(MSG_FMT_STRNL),
566*5088Sab196087 			    conv_magic_value(c));
567*5088Sab196087 		else
568*5088Sab196087 			elfedit_printf(MSG_ORIG(MSG_FMT_HEXNUMNL), c);
569*5088Sab196087 		return;
570*5088Sab196087 
571*5088Sab196087 	case EHDR_CMD_T_EI_CLASS:
572*5088Sab196087 		c = ehdr->e_ident[EI_CLASS];
573*5088Sab196087 		if (outstyle == ELFEDIT_OUTSTYLE_SIMPLE)
574*5088Sab196087 			elfedit_printf(MSG_ORIG(MSG_FMT_STRNL),
575*5088Sab196087 			    conv_ehdr_class(c, 0, &inv_buf));
576*5088Sab196087 		else
577*5088Sab196087 			elfedit_printf(MSG_ORIG(MSG_FMT_HEXNUMNL), c);
578*5088Sab196087 		return;
579*5088Sab196087 
580*5088Sab196087 	case EHDR_CMD_T_EI_DATA:
581*5088Sab196087 		c = ehdr->e_ident[EI_DATA];
582*5088Sab196087 		if (outstyle == ELFEDIT_OUTSTYLE_SIMPLE)
583*5088Sab196087 			elfedit_printf(MSG_ORIG(MSG_FMT_STRNL),
584*5088Sab196087 			    conv_ehdr_data(c, 0, &inv_buf));
585*5088Sab196087 		else
586*5088Sab196087 			elfedit_printf(MSG_ORIG(MSG_FMT_HEXNUMNL), c);
587*5088Sab196087 		return;
588*5088Sab196087 
589*5088Sab196087 	case EHDR_CMD_T_EI_VERSION:
590*5088Sab196087 		c = ehdr->e_ident[EI_VERSION];
591*5088Sab196087 		if (outstyle == ELFEDIT_OUTSTYLE_SIMPLE)
592*5088Sab196087 			elfedit_printf(MSG_ORIG(MSG_FMT_STRNL),
593*5088Sab196087 			    conv_ehdr_vers(c, 0, &inv_buf));
594*5088Sab196087 		else
595*5088Sab196087 			elfedit_printf(MSG_ORIG(MSG_FMT_HEXNUMNL), c);
596*5088Sab196087 		return;
597*5088Sab196087 
598*5088Sab196087 	case EHDR_CMD_T_EI_OSABI:
599*5088Sab196087 		c = ehdr->e_ident[EI_OSABI];
600*5088Sab196087 		if (outstyle == ELFEDIT_OUTSTYLE_SIMPLE) {
601*5088Sab196087 			elfedit_printf(MSG_ORIG(MSG_FMT_STRNL),
602*5088Sab196087 			    conv_ehdr_osabi(c, 0, &inv_buf));
603*5088Sab196087 		} else {
604*5088Sab196087 			elfedit_printf(MSG_ORIG(MSG_FMT_HEXNUMNL),
605*5088Sab196087 			    EC_WORD(c));
606*5088Sab196087 		}
607*5088Sab196087 		return;
608*5088Sab196087 
609*5088Sab196087 	case EHDR_CMD_T_EI_ABIVERSION:
610*5088Sab196087 		elfedit_printf(MSG_ORIG(MSG_FMT_HEXNUMNL),
611*5088Sab196087 		    EC_WORD(ehdr->e_ident[EI_ABIVERSION]));
612*5088Sab196087 		return;
613*5088Sab196087 	}
614*5088Sab196087 }
615*5088Sab196087 
616*5088Sab196087 
617*5088Sab196087 /*
618*5088Sab196087  * Common body for the ehdr: module commands. These commands
619*5088Sab196087  * share a large amount of common behavior, so it is convenient
620*5088Sab196087  * to centralize things and use the cmd argument to handle the
621*5088Sab196087  * small differences.
622*5088Sab196087  *
623*5088Sab196087  * entry:
624*5088Sab196087  *	cmd - One of the EHDR_CMD_T_* constants listed above, specifying
625*5088Sab196087  *		which command to implement.
626*5088Sab196087  *	obj_state, argc, argv - Standard command arguments
627*5088Sab196087  */
628*5088Sab196087 static elfedit_cmdret_t
629*5088Sab196087 cmd_body(EHDR_CMD_T cmd, elfedit_obj_state_t *obj_state,
630*5088Sab196087     int argc, const char *argv[])
631*5088Sab196087 {
632*5088Sab196087 	/*
633*5088Sab196087 	 * When a call comes in for ehdr:e_ident[ndx], and the
634*5088Sab196087 	 * specified element is one that we have a special command
635*5088Sab196087 	 * for, then we revector to that special command instead
636*5088Sab196087 	 * of using the generic ehdr:e_ident processing. This array,
637*5088Sab196087 	 * which is indexed by the e_ident[] index value is used
638*5088Sab196087 	 * to decide if that is the case. If the resulting value
639*5088Sab196087 	 * is EHDR_CMD_T_E_IDENT, then the generic processing is
640*5088Sab196087 	 * used. Otherwise, we revector to the specified command.
641*5088Sab196087 	 */
642*5088Sab196087 	static const int e_ident_revector[16] = {
643*5088Sab196087 		EHDR_CMD_T_EI_MAG0,		/* 0: EI_MAG0 */
644*5088Sab196087 		EHDR_CMD_T_EI_MAG1,		/* 1: EI_MAG1 */
645*5088Sab196087 		EHDR_CMD_T_EI_MAG2,		/* 2: EI_MAG2 */
646*5088Sab196087 		EHDR_CMD_T_EI_MAG3,		/* 3: EI_MAG3 */
647*5088Sab196087 		EHDR_CMD_T_EI_CLASS,		/* 4: EI_CLASS */
648*5088Sab196087 		EHDR_CMD_T_EI_DATA,		/* 5: EI_DATA */
649*5088Sab196087 		EHDR_CMD_T_EI_VERSION,		/* 6: EI_VERSION */
650*5088Sab196087 		EHDR_CMD_T_EI_OSABI,		/* 7: EI_OSABI */
651*5088Sab196087 		EHDR_CMD_T_EI_ABIVERSION,	/* 8: EI_ABIVERSION */
652*5088Sab196087 		EHDR_CMD_T_E_IDENT,		/* 9: generic */
653*5088Sab196087 		EHDR_CMD_T_E_IDENT,		/* 10: generic */
654*5088Sab196087 		EHDR_CMD_T_E_IDENT,		/* 11: generic */
655*5088Sab196087 		EHDR_CMD_T_E_IDENT,		/* 12: generic */
656*5088Sab196087 		EHDR_CMD_T_E_IDENT,		/* 13: generic */
657*5088Sab196087 		EHDR_CMD_T_E_IDENT,		/* 14: generic */
658*5088Sab196087 		EHDR_CMD_T_E_IDENT,		/* 15: generic */
659*5088Sab196087 	};
660*5088Sab196087 
661*5088Sab196087 
662*5088Sab196087 	ARGSTATE		argstate;
663*5088Sab196087 	Ehdr			*ehdr;
664*5088Sab196087 	elfedit_cmdret_t	ret = ELFEDIT_CMDRET_NONE;
665*5088Sab196087 	int			e_ident_ndx = -1;
666*5088Sab196087 	Conv_inv_buf_t		inv_buf1, inv_buf2;
667*5088Sab196087 
668*5088Sab196087 	/* Process the optional arguments */
669*5088Sab196087 	process_args(obj_state, argc, argv, &argstate);
670*5088Sab196087 
671*5088Sab196087 	/* Check number of arguments */
672*5088Sab196087 	switch (cmd) {
673*5088Sab196087 	case EHDR_CMD_T_DUMP:
674*5088Sab196087 		/* ehdr:dump does not accept arguments */
675*5088Sab196087 		if (argstate.argc > 0)
676*5088Sab196087 			elfedit_command_usage();
677*5088Sab196087 		break;
678*5088Sab196087 	case EHDR_CMD_T_E_IDENT:
679*5088Sab196087 		/*
680*5088Sab196087 		 * ehdr:e_ident accepts 1 or 2 arguments, the first
681*5088Sab196087 		 * being the index into the array, and the second being
682*5088Sab196087 		 * the value. If there are arguments, then process the
683*5088Sab196087 		 * index, and remove it from the argument list.
684*5088Sab196087 		 */
685*5088Sab196087 		if (argstate.argc > 0) {
686*5088Sab196087 			if (argstate.argc > 2)
687*5088Sab196087 				elfedit_command_usage();
688*5088Sab196087 			e_ident_ndx = (int)
689*5088Sab196087 			    elfedit_atoconst_range(argstate.argv[0],
690*5088Sab196087 			    MSG_ORIG(MSG_STR_INDEX), 0, EI_NIDENT - 1,
691*5088Sab196087 			    ELFEDIT_CONST_EI);
692*5088Sab196087 			argstate.argc--;
693*5088Sab196087 			argstate.argv++;
694*5088Sab196087 
695*5088Sab196087 			/*
696*5088Sab196087 			 * If the index is for one of the e_ident elements
697*5088Sab196087 			 * that we have a special command for, then switch
698*5088Sab196087 			 * to that command. e_ident_revector[] returns
699*5088Sab196087 			 * EHDR_CMD_T_E_IDENT in the cases where such a command
700*5088Sab196087 			 * does not exist, in which case we'll continue with the
701*5088Sab196087 			 * generic code.
702*5088Sab196087 			 */
703*5088Sab196087 			cmd = e_ident_revector[e_ident_ndx];
704*5088Sab196087 		}
705*5088Sab196087 		break;
706*5088Sab196087 	case EHDR_CMD_T_E_FLAGS:
707*5088Sab196087 		/* ehdr:e_flags accepts an arbitrary number of arguments */
708*5088Sab196087 		break;
709*5088Sab196087 	default:
710*5088Sab196087 		/* The remaining commands accept a single optional argument */
711*5088Sab196087 		if (argstate.argc > 1)
712*5088Sab196087 			elfedit_command_usage();
713*5088Sab196087 		break;
714*5088Sab196087 	}
715*5088Sab196087 
716*5088Sab196087 	/* If there are no arguments, dump the ELF header and return */
717*5088Sab196087 	if (argstate.argc == 0) {
718*5088Sab196087 		print_ehdr(cmd, e_ident_ndx, 0, &argstate);
719*5088Sab196087 		return (ELFEDIT_CMDRET_NONE);
720*5088Sab196087 	}
721*5088Sab196087 
722*5088Sab196087 	ehdr = obj_state->os_ehdr;
723*5088Sab196087 	switch (cmd) {
724*5088Sab196087 		/*
725*5088Sab196087 		 * EHDR_CMD_T_DUMP can't get here: It never has an
726*5088Sab196087 		 * argument, and is handled above.
727*5088Sab196087 		 */
728*5088Sab196087 
729*5088Sab196087 	case EHDR_CMD_T_E_IDENT:
730*5088Sab196087 		{
731*5088Sab196087 			/*
732*5088Sab196087 			 * Only those e_ident[] elements for which we
733*5088Sab196087 			 * don't have a specialized command come here.
734*5088Sab196087 			 * The argument is a value to be set in
735*5088Sab196087 			 * e_ident[e_ident_ndx].
736*5088Sab196087 			 */
737*5088Sab196087 			uchar_t value = (uchar_t)
738*5088Sab196087 			    elfedit_atoui_range(argstate.argv[0],
739*5088Sab196087 			    MSG_ORIG(MSG_STR_VALUE), 0, 255, NULL);
740*5088Sab196087 
741*5088Sab196087 			if (ehdr->e_ident[e_ident_ndx] == value) {
742*5088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
743*5088Sab196087 				    MSG_INTL(MSG_DEBUG_EI_D_X_OK),
744*5088Sab196087 				    e_ident_ndx, EC_WORD(value));
745*5088Sab196087 			} else {
746*5088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
747*5088Sab196087 				    MSG_INTL(MSG_DEBUG_EI_D_X_CHG),
748*5088Sab196087 				    e_ident_ndx, ehdr->e_ident[e_ident_ndx],
749*5088Sab196087 				    value);
750*5088Sab196087 				ret = ELFEDIT_CMDRET_MOD;
751*5088Sab196087 				ehdr->e_ident[e_ident_ndx] = value;
752*5088Sab196087 			}
753*5088Sab196087 		}
754*5088Sab196087 		break;
755*5088Sab196087 
756*5088Sab196087 	case EHDR_CMD_T_E_TYPE:
757*5088Sab196087 		{
758*5088Sab196087 			/* The argument gives the object type */
759*5088Sab196087 			Half type = (Half) elfedit_atoconst(argstate.argv[0],
760*5088Sab196087 			    ELFEDIT_CONST_ET);
761*5088Sab196087 			const char *name = MSG_ORIG(MSG_CMD_E_TYPE);
762*5088Sab196087 
763*5088Sab196087 			if (ehdr->e_type == type) {
764*5088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
765*5088Sab196087 				    MSG_INTL(MSG_DEBUG_E_S_OK), name,
766*5088Sab196087 				    conv_ehdr_type(ehdr->e_type, 0, &inv_buf1));
767*5088Sab196087 			} else {
768*5088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
769*5088Sab196087 				    MSG_INTL(MSG_DEBUG_E_S_CHG), name,
770*5088Sab196087 				    conv_ehdr_type(ehdr->e_type, 0, &inv_buf1),
771*5088Sab196087 				    conv_ehdr_type(type, 0, &inv_buf2));
772*5088Sab196087 				ret = ELFEDIT_CMDRET_MOD;
773*5088Sab196087 				ehdr->e_type = type;
774*5088Sab196087 			}
775*5088Sab196087 		}
776*5088Sab196087 		break;
777*5088Sab196087 
778*5088Sab196087 	case EHDR_CMD_T_E_MACHINE:
779*5088Sab196087 		{
780*5088Sab196087 			/* The argument gives the machine code */
781*5088Sab196087 			Half mach = (Half) elfedit_atoconst(argstate.argv[0],
782*5088Sab196087 			    ELFEDIT_CONST_EM);
783*5088Sab196087 			const char *name = MSG_ORIG(MSG_CMD_E_MACHINE);
784*5088Sab196087 
785*5088Sab196087 			if (ehdr->e_machine == mach) {
786*5088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
787*5088Sab196087 				    MSG_INTL(MSG_DEBUG_E_S_OK), name,
788*5088Sab196087 				    conv_ehdr_mach(ehdr->e_machine, 0,
789*5088Sab196087 				    &inv_buf1));
790*5088Sab196087 			} else {
791*5088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
792*5088Sab196087 				    MSG_INTL(MSG_DEBUG_E_S_CHG), name,
793*5088Sab196087 				    conv_ehdr_mach(ehdr->e_machine, 0,
794*5088Sab196087 				    &inv_buf1),
795*5088Sab196087 				    conv_ehdr_mach(mach, 0, &inv_buf2));
796*5088Sab196087 				ret = ELFEDIT_CMDRET_MOD;
797*5088Sab196087 				ehdr->e_machine = mach;
798*5088Sab196087 			}
799*5088Sab196087 		}
800*5088Sab196087 		break;
801*5088Sab196087 
802*5088Sab196087 	case EHDR_CMD_T_E_VERSION:
803*5088Sab196087 		{
804*5088Sab196087 			/* The argument gives the version */
805*5088Sab196087 			Word ver = (Word) elfedit_atoconst(argstate.argv[0],
806*5088Sab196087 			    ELFEDIT_CONST_EV);
807*5088Sab196087 			const char *name = MSG_ORIG(MSG_CMD_E_VERSION);
808*5088Sab196087 
809*5088Sab196087 			if (ehdr->e_version == ver) {
810*5088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
811*5088Sab196087 				    MSG_INTL(MSG_DEBUG_E_S_OK), name,
812*5088Sab196087 				    conv_ehdr_vers(ehdr->e_version, 0,
813*5088Sab196087 				    &inv_buf1));
814*5088Sab196087 			} else {
815*5088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
816*5088Sab196087 				    MSG_INTL(MSG_DEBUG_E_S_CHG), name,
817*5088Sab196087 				    conv_ehdr_vers(ehdr->e_version, 0,
818*5088Sab196087 				    &inv_buf1),
819*5088Sab196087 				    conv_ehdr_vers(ver, 0, &inv_buf2));
820*5088Sab196087 				ret = ELFEDIT_CMDRET_MOD;
821*5088Sab196087 				ehdr->e_version = ver;
822*5088Sab196087 			}
823*5088Sab196087 		}
824*5088Sab196087 		break;
825*5088Sab196087 
826*5088Sab196087 	case EHDR_CMD_T_E_ENTRY:
827*5088Sab196087 		{
828*5088Sab196087 			/* The argument gives the entry address */
829*5088Sab196087 			Addr entry = (Addr)
830*5088Sab196087 			    elfedit_atoui(argstate.argv[0], NULL);
831*5088Sab196087 			const char *name = MSG_ORIG(MSG_CMD_E_ENTRY);
832*5088Sab196087 
833*5088Sab196087 			if (ehdr->e_entry == entry) {
834*5088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
835*5088Sab196087 				    MSG_INTL(MSG_DEBUG_E_LLX_OK), name,
836*5088Sab196087 				    EC_ADDR(ehdr->e_entry));
837*5088Sab196087 			} else {
838*5088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
839*5088Sab196087 				    MSG_INTL(MSG_DEBUG_E_LLX_CHG), name,
840*5088Sab196087 				    EC_ADDR(ehdr->e_entry), EC_ADDR(entry));
841*5088Sab196087 				ret = ELFEDIT_CMDRET_MOD;
842*5088Sab196087 				ehdr->e_entry = entry;
843*5088Sab196087 			}
844*5088Sab196087 		}
845*5088Sab196087 		break;
846*5088Sab196087 
847*5088Sab196087 	case EHDR_CMD_T_E_PHOFF:
848*5088Sab196087 		{
849*5088Sab196087 			/* The argument gives the program header offset */
850*5088Sab196087 			Off off = (Off) elfedit_atoui(argstate.argv[0],
851*5088Sab196087 			    NULL);
852*5088Sab196087 			const char *name = MSG_ORIG(MSG_CMD_E_PHOFF);
853*5088Sab196087 
854*5088Sab196087 			if (ehdr->e_phoff == off) {
855*5088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
856*5088Sab196087 				    MSG_INTL(MSG_DEBUG_E_LLX_OK), name,
857*5088Sab196087 				    EC_OFF(ehdr->e_phoff));
858*5088Sab196087 			} else {
859*5088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
860*5088Sab196087 				    MSG_INTL(MSG_DEBUG_E_LLX_CHG), name,
861*5088Sab196087 				    EC_OFF(ehdr->e_phoff), EC_OFF(off));
862*5088Sab196087 				ret = ELFEDIT_CMDRET_MOD;
863*5088Sab196087 				ehdr->e_phoff = off;
864*5088Sab196087 			}
865*5088Sab196087 		}
866*5088Sab196087 		break;
867*5088Sab196087 
868*5088Sab196087 	case EHDR_CMD_T_E_SHOFF:
869*5088Sab196087 		{
870*5088Sab196087 			/* The argument gives the section header offset */
871*5088Sab196087 			Off off = (Off) elfedit_atoui(argstate.argv[0],
872*5088Sab196087 			    NULL);
873*5088Sab196087 			const char *name = MSG_ORIG(MSG_CMD_E_SHOFF);
874*5088Sab196087 
875*5088Sab196087 			if (ehdr->e_shoff == off) {
876*5088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
877*5088Sab196087 				    MSG_INTL(MSG_DEBUG_E_LLX_OK), name,
878*5088Sab196087 				    EC_OFF(ehdr->e_shoff));
879*5088Sab196087 			} else {
880*5088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
881*5088Sab196087 				    MSG_INTL(MSG_DEBUG_E_LLX_CHG), name,
882*5088Sab196087 				    EC_OFF(ehdr->e_shoff), EC_OFF(off));
883*5088Sab196087 				ret = ELFEDIT_CMDRET_MOD;
884*5088Sab196087 				ehdr->e_shoff = off;
885*5088Sab196087 			}
886*5088Sab196087 		}
887*5088Sab196087 		break;
888*5088Sab196087 
889*5088Sab196087 	case EHDR_CMD_T_E_FLAGS:
890*5088Sab196087 		{
891*5088Sab196087 			Conv_ehdr_flags_buf_t flags_buf1, flags_buf2;
892*5088Sab196087 			const char *name = MSG_ORIG(MSG_CMD_E_FLAGS);
893*5088Sab196087 			Word flags = 0;
894*5088Sab196087 			int i;
895*5088Sab196087 
896*5088Sab196087 			/* Collect the arguments */
897*5088Sab196087 			for (i = 0; i < argstate.argc; i++)
898*5088Sab196087 				flags |= (Word)
899*5088Sab196087 				    elfedit_atoconst(argstate.argv[i],
900*5088Sab196087 				    ELFEDIT_CONST_EF);
901*5088Sab196087 
902*5088Sab196087 			/* Complement the value? */
903*5088Sab196087 			if (argstate.optmask & EHDR_OPT_F_CMP)
904*5088Sab196087 				flags = ~flags;
905*5088Sab196087 
906*5088Sab196087 			/* Perform any requested bit operations */
907*5088Sab196087 			if (argstate.optmask & EHDR_OPT_F_AND)
908*5088Sab196087 				flags &= ehdr->e_flags;
909*5088Sab196087 			else if (argstate.optmask & EHDR_OPT_F_OR)
910*5088Sab196087 				flags |= ehdr->e_flags;
911*5088Sab196087 
912*5088Sab196087 			/* Set the value */
913*5088Sab196087 			if (ehdr->e_flags == flags) {
914*5088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
915*5088Sab196087 				    MSG_INTL(MSG_DEBUG_E_S_OK), name,
916*5088Sab196087 				    conv_ehdr_flags(ehdr->e_machine,
917*5088Sab196087 				    ehdr->e_flags, 0, &flags_buf1));
918*5088Sab196087 			} else {
919*5088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
920*5088Sab196087 				    MSG_INTL(MSG_DEBUG_E_S_CHG), name,
921*5088Sab196087 				    conv_ehdr_flags(ehdr->e_machine,
922*5088Sab196087 				    ehdr->e_flags, 0, &flags_buf1),
923*5088Sab196087 				    conv_ehdr_flags(ehdr->e_machine,
924*5088Sab196087 				    flags, 0, &flags_buf2));
925*5088Sab196087 				ret = ELFEDIT_CMDRET_MOD;
926*5088Sab196087 				ehdr->e_flags = flags;
927*5088Sab196087 			}
928*5088Sab196087 		}
929*5088Sab196087 		break;
930*5088Sab196087 
931*5088Sab196087 	case EHDR_CMD_T_E_EHSIZE:
932*5088Sab196087 		{
933*5088Sab196087 			/* The argument gives the ELF header size */
934*5088Sab196087 			Half ehsize = (Half) elfedit_atoui(argstate.argv[0],
935*5088Sab196087 			    NULL);
936*5088Sab196087 			const char *name = MSG_ORIG(MSG_CMD_E_EHSIZE);
937*5088Sab196087 
938*5088Sab196087 			if (ehdr->e_ehsize == ehsize) {
939*5088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
940*5088Sab196087 				    MSG_INTL(MSG_DEBUG_E_D_OK), name,
941*5088Sab196087 				    EC_WORD(ehdr->e_ehsize));
942*5088Sab196087 			} else {
943*5088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
944*5088Sab196087 				    MSG_INTL(MSG_DEBUG_E_D_CHG), name,
945*5088Sab196087 				    EC_WORD(ehdr->e_ehsize), EC_WORD(ehsize));
946*5088Sab196087 				ret = ELFEDIT_CMDRET_MOD;
947*5088Sab196087 				ehdr->e_ehsize = ehsize;
948*5088Sab196087 			}
949*5088Sab196087 		}
950*5088Sab196087 		break;
951*5088Sab196087 
952*5088Sab196087 	case EHDR_CMD_T_E_PHENTSIZE:
953*5088Sab196087 		{
954*5088Sab196087 			/*
955*5088Sab196087 			 * The argument gives the size of a program
956*5088Sab196087 			 * header element.
957*5088Sab196087 			 */
958*5088Sab196087 			Half phentsize = (Half) elfedit_atoui(argstate.argv[0],
959*5088Sab196087 			    NULL);
960*5088Sab196087 			const char *name = MSG_ORIG(MSG_CMD_E_PHENTSIZE);
961*5088Sab196087 
962*5088Sab196087 			if (ehdr->e_phentsize == phentsize) {
963*5088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
964*5088Sab196087 				    MSG_INTL(MSG_DEBUG_E_D_OK), name,
965*5088Sab196087 				    EC_WORD(ehdr->e_phentsize));
966*5088Sab196087 			} else {
967*5088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
968*5088Sab196087 				    MSG_INTL(MSG_DEBUG_E_D_CHG), name,
969*5088Sab196087 				    EC_WORD(ehdr->e_phentsize),
970*5088Sab196087 				    EC_WORD(phentsize));
971*5088Sab196087 				ret = ELFEDIT_CMDRET_MOD;
972*5088Sab196087 				ehdr->e_phentsize = phentsize;
973*5088Sab196087 			}
974*5088Sab196087 		}
975*5088Sab196087 		break;
976*5088Sab196087 
977*5088Sab196087 	case EHDR_CMD_T_E_PHNUM:
978*5088Sab196087 		{
979*5088Sab196087 			/* The argument gives the number of program headers */
980*5088Sab196087 			Word phnum = (Word) elfedit_atoui(argstate.argv[0],
981*5088Sab196087 			    NULL);
982*5088Sab196087 			const char *name = MSG_ORIG(MSG_CMD_E_PHNUM);
983*5088Sab196087 			elfedit_section_t *sec0 = &obj_state->os_secarr[0];
984*5088Sab196087 			Shdr *shdr0 = sec0->sec_shdr;
985*5088Sab196087 			Half e_phnum;
986*5088Sab196087 			Word sh_info;
987*5088Sab196087 
988*5088Sab196087 			if (phnum >= PN_XNUM) {
989*5088Sab196087 				e_phnum = PN_XNUM;
990*5088Sab196087 				sh_info = phnum;
991*5088Sab196087 			} else {
992*5088Sab196087 				e_phnum = phnum;
993*5088Sab196087 				sh_info = 0;
994*5088Sab196087 			}
995*5088Sab196087 
996*5088Sab196087 			if (ehdr->e_phnum == e_phnum) {
997*5088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
998*5088Sab196087 				    MSG_INTL(MSG_DEBUG_E_D_OK), name,
999*5088Sab196087 				    EC_WORD(ehdr->e_phnum));
1000*5088Sab196087 			} else {
1001*5088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
1002*5088Sab196087 				    MSG_INTL(MSG_DEBUG_E_D_CHG), name,
1003*5088Sab196087 				    EC_WORD(ehdr->e_phnum), e_phnum);
1004*5088Sab196087 				ret = ELFEDIT_CMDRET_MOD;
1005*5088Sab196087 				ehdr->e_phnum = e_phnum;
1006*5088Sab196087 			}
1007*5088Sab196087 			if (shdr0->sh_info == sh_info) {
1008*5088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
1009*5088Sab196087 				    MSG_INTL(MSG_DEBUG_SHDR0_D_OK),
1010*5088Sab196087 				    MSG_ORIG(MSG_STR_SH_INFO),
1011*5088Sab196087 				    EC_WORD(shdr0->sh_info));
1012*5088Sab196087 			} else {
1013*5088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
1014*5088Sab196087 				    MSG_INTL(MSG_DEBUG_SHDR0_D_CHG),
1015*5088Sab196087 				    MSG_ORIG(MSG_STR_SH_INFO),
1016*5088Sab196087 				    EC_WORD(shdr0->sh_info), sh_info);
1017*5088Sab196087 				ret = ELFEDIT_CMDRET_MOD;
1018*5088Sab196087 				shdr0->sh_info = sh_info;
1019*5088Sab196087 				elfedit_modified_shdr(sec0);
1020*5088Sab196087 			}
1021*5088Sab196087 		}
1022*5088Sab196087 		break;
1023*5088Sab196087 
1024*5088Sab196087 	case EHDR_CMD_T_E_SHENTSIZE:
1025*5088Sab196087 		{
1026*5088Sab196087 			/*
1027*5088Sab196087 			 * The argument gives the size of a program
1028*5088Sab196087 			 * header element.
1029*5088Sab196087 			 */
1030*5088Sab196087 			Half shentsize = (Half) elfedit_atoui(argstate.argv[0],
1031*5088Sab196087 			    NULL);
1032*5088Sab196087 			const char *name = MSG_ORIG(MSG_CMD_E_SHENTSIZE);
1033*5088Sab196087 
1034*5088Sab196087 			if (ehdr->e_shentsize == shentsize) {
1035*5088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
1036*5088Sab196087 				    MSG_INTL(MSG_DEBUG_E_D_OK), name,
1037*5088Sab196087 				    EC_WORD(ehdr->e_shentsize));
1038*5088Sab196087 			} else {
1039*5088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
1040*5088Sab196087 				    MSG_INTL(MSG_DEBUG_E_D_CHG), name,
1041*5088Sab196087 				    EC_WORD(ehdr->e_shentsize),
1042*5088Sab196087 				    EC_WORD(shentsize));
1043*5088Sab196087 				ret = ELFEDIT_CMDRET_MOD;
1044*5088Sab196087 				ehdr->e_shentsize = shentsize;
1045*5088Sab196087 			}
1046*5088Sab196087 		}
1047*5088Sab196087 		break;
1048*5088Sab196087 
1049*5088Sab196087 	case EHDR_CMD_T_E_SHNUM:
1050*5088Sab196087 		{
1051*5088Sab196087 			/* The argument gives the number of section headers */
1052*5088Sab196087 			Word shnum = (Word) elfedit_atoui(argstate.argv[0],
1053*5088Sab196087 			    NULL);
1054*5088Sab196087 			const char *name = MSG_ORIG(MSG_CMD_E_SHNUM);
1055*5088Sab196087 			elfedit_section_t *sec0 = &obj_state->os_secarr[0];
1056*5088Sab196087 			Shdr *shdr0 = sec0->sec_shdr;
1057*5088Sab196087 			Half e_shnum;
1058*5088Sab196087 			Word sh_size;
1059*5088Sab196087 
1060*5088Sab196087 			if (shnum >= SHN_LORESERVE) {
1061*5088Sab196087 				e_shnum = 0;
1062*5088Sab196087 				sh_size = shnum;
1063*5088Sab196087 			} else {
1064*5088Sab196087 				e_shnum = shnum;
1065*5088Sab196087 				sh_size = 0;
1066*5088Sab196087 			}
1067*5088Sab196087 
1068*5088Sab196087 			if (ehdr->e_shnum == e_shnum) {
1069*5088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
1070*5088Sab196087 				    MSG_INTL(MSG_DEBUG_E_D_OK), name,
1071*5088Sab196087 				    EC_WORD(ehdr->e_shnum));
1072*5088Sab196087 			} else {
1073*5088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
1074*5088Sab196087 				    MSG_INTL(MSG_DEBUG_E_D_CHG), name,
1075*5088Sab196087 				    EC_WORD(ehdr->e_shnum), e_shnum);
1076*5088Sab196087 				ret = ELFEDIT_CMDRET_MOD;
1077*5088Sab196087 				ehdr->e_shnum = e_shnum;
1078*5088Sab196087 			}
1079*5088Sab196087 			if (shdr0->sh_size == sh_size) {
1080*5088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
1081*5088Sab196087 				    MSG_INTL(MSG_DEBUG_SHDR0_D_OK),
1082*5088Sab196087 				    MSG_ORIG(MSG_STR_SH_SIZE),
1083*5088Sab196087 				    EC_WORD(shdr0->sh_size));
1084*5088Sab196087 			} else {
1085*5088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
1086*5088Sab196087 				    MSG_INTL(MSG_DEBUG_SHDR0_D_CHG),
1087*5088Sab196087 				    MSG_ORIG(MSG_STR_SH_SIZE),
1088*5088Sab196087 				    EC_WORD(shdr0->sh_size), sh_size);
1089*5088Sab196087 				ret = ELFEDIT_CMDRET_MOD;
1090*5088Sab196087 				shdr0->sh_size = sh_size;
1091*5088Sab196087 				elfedit_modified_shdr(sec0);
1092*5088Sab196087 			}
1093*5088Sab196087 		}
1094*5088Sab196087 		break;
1095*5088Sab196087 
1096*5088Sab196087 	case EHDR_CMD_T_E_SHSTRNDX:
1097*5088Sab196087 		{
1098*5088Sab196087 			const char *name = MSG_ORIG(MSG_CMD_E_SHSTRNDX);
1099*5088Sab196087 			Word shstrndx;
1100*5088Sab196087 			elfedit_section_t *sec0 = &obj_state->os_secarr[0];
1101*5088Sab196087 			Shdr *shdr0 = sec0->sec_shdr;
1102*5088Sab196087 			Half e_shstrndx;
1103*5088Sab196087 			Word sh_link;
1104*5088Sab196087 
1105*5088Sab196087 			/*
1106*5088Sab196087 			 * By default, sec argument is name of section.
1107*5088Sab196087 			 * If -shndx is used, it is a numeric index, and
1108*5088Sab196087 			 * if -shtyp is used, it is a section type.
1109*5088Sab196087 			 */
1110*5088Sab196087 			if (argstate.optmask & EHDR_OPT_F_SHNDX)
1111*5088Sab196087 				shstrndx = elfedit_atoshndx(argstate.argv[0],
1112*5088Sab196087 				    obj_state->os_shnum);
1113*5088Sab196087 			else if (argstate.optmask & EHDR_OPT_F_SHTYP)
1114*5088Sab196087 				shstrndx = elfedit_type_to_shndx(obj_state,
1115*5088Sab196087 				    elfedit_atoconst(argstate.argv[0],
1116*5088Sab196087 				    ELFEDIT_CONST_SHT));
1117*5088Sab196087 			else
1118*5088Sab196087 				shstrndx = elfedit_name_to_shndx(obj_state,
1119*5088Sab196087 				    argstate.argv[0]);
1120*5088Sab196087 
1121*5088Sab196087 			/* Warn if the section isn't a string table */
1122*5088Sab196087 			if ((shstrndx >= obj_state->os_shnum) ||
1123*5088Sab196087 			    ((shstrndx >= SHN_LORESERVE) &&
1124*5088Sab196087 			    (shstrndx <= SHN_HIRESERVE)) ||
1125*5088Sab196087 			    (obj_state->os_secarr[shstrndx].sec_shdr->sh_type !=
1126*5088Sab196087 			    SHT_STRTAB))
1127*5088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
1128*5088Sab196087 				    MSG_INTL(MSG_DEBUG_NOTSTRTAB), name,
1129*5088Sab196087 				    EC_WORD(shstrndx));
1130*5088Sab196087 
1131*5088Sab196087 			if (shstrndx >= SHN_LORESERVE) {
1132*5088Sab196087 				e_shstrndx = SHN_XINDEX;
1133*5088Sab196087 				sh_link = shstrndx;
1134*5088Sab196087 			} else {
1135*5088Sab196087 				e_shstrndx = shstrndx;
1136*5088Sab196087 				sh_link = 0;
1137*5088Sab196087 			}
1138*5088Sab196087 
1139*5088Sab196087 			if (ehdr->e_shstrndx == e_shstrndx) {
1140*5088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
1141*5088Sab196087 				    MSG_INTL(MSG_DEBUG_E_D_OK), name,
1142*5088Sab196087 				    EC_WORD(ehdr->e_shstrndx));
1143*5088Sab196087 			} else {
1144*5088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
1145*5088Sab196087 				    MSG_INTL(MSG_DEBUG_E_D_CHG), name,
1146*5088Sab196087 				    EC_WORD(ehdr->e_shstrndx), e_shstrndx);
1147*5088Sab196087 				ret = ELFEDIT_CMDRET_MOD;
1148*5088Sab196087 				ehdr->e_shstrndx = e_shstrndx;
1149*5088Sab196087 			}
1150*5088Sab196087 			if (shdr0->sh_link == sh_link) {
1151*5088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
1152*5088Sab196087 				    MSG_INTL(MSG_DEBUG_SHDR0_D_OK),
1153*5088Sab196087 				    MSG_ORIG(MSG_STR_SH_LINK),
1154*5088Sab196087 				    EC_WORD(shdr0->sh_link));
1155*5088Sab196087 			} else {
1156*5088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
1157*5088Sab196087 				    MSG_INTL(MSG_DEBUG_SHDR0_D_CHG),
1158*5088Sab196087 				    MSG_ORIG(MSG_STR_SH_LINK),
1159*5088Sab196087 				    EC_WORD(shdr0->sh_link), sh_link);
1160*5088Sab196087 				ret = ELFEDIT_CMDRET_MOD;
1161*5088Sab196087 				shdr0->sh_link = sh_link;
1162*5088Sab196087 				elfedit_modified_shdr(sec0);
1163*5088Sab196087 			}
1164*5088Sab196087 		}
1165*5088Sab196087 		break;
1166*5088Sab196087 
1167*5088Sab196087 	case EHDR_CMD_T_EI_MAG0:
1168*5088Sab196087 	case EHDR_CMD_T_EI_MAG1:
1169*5088Sab196087 	case EHDR_CMD_T_EI_MAG2:
1170*5088Sab196087 	case EHDR_CMD_T_EI_MAG3:
1171*5088Sab196087 		{
1172*5088Sab196087 			/*
1173*5088Sab196087 			 * This depends on EHDR_CMD_T_EI_MAG[0-3]
1174*5088Sab196087 			 * being contiguous
1175*5088Sab196087 			 */
1176*5088Sab196087 			int ei_ndx = (cmd - EHDR_CMD_T_EI_MAG0) + EI_MAG0;
1177*5088Sab196087 
1178*5088Sab196087 			/* The argument gives the magic number byte */
1179*5088Sab196087 			int mag = (int)elfedit_atoui_range(argstate.argv[0],
1180*5088Sab196087 			    MSG_ORIG(MSG_STR_VALUE), 0, 255, NULL);
1181*5088Sab196087 
1182*5088Sab196087 			if (ehdr->e_ident[ei_ndx] == mag) {
1183*5088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
1184*5088Sab196087 				    MSG_INTL(MSG_DEBUG_EI_S_S_OK),
1185*5088Sab196087 				    elfedit_atoconst_value_to_str(
1186*5088Sab196087 				    ELFEDIT_CONST_EI, ei_ndx, 1),
1187*5088Sab196087 				    conv_magic_value(ehdr->e_ident[ei_ndx]));
1188*5088Sab196087 			} else {
1189*5088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
1190*5088Sab196087 				    MSG_INTL(MSG_DEBUG_EI_S_S_CHG),
1191*5088Sab196087 				    elfedit_atoconst_value_to_str(
1192*5088Sab196087 				    ELFEDIT_CONST_EI, ei_ndx, 1),
1193*5088Sab196087 				    conv_magic_value(ehdr->e_ident[ei_ndx]),
1194*5088Sab196087 				    conv_magic_value(mag));
1195*5088Sab196087 				ret = ELFEDIT_CMDRET_MOD;
1196*5088Sab196087 				ehdr->e_ident[ei_ndx] = mag;
1197*5088Sab196087 			}
1198*5088Sab196087 		}
1199*5088Sab196087 		break;
1200*5088Sab196087 
1201*5088Sab196087 	case EHDR_CMD_T_EI_CLASS:
1202*5088Sab196087 		{
1203*5088Sab196087 			/* The argument gives the ELFCLASS value */
1204*5088Sab196087 			int class = (int)elfedit_atoconst_range(
1205*5088Sab196087 			    argstate.argv[0], MSG_ORIG(MSG_STR_VALUE), 0, 255,
1206*5088Sab196087 			    ELFEDIT_CONST_ELFCLASS);
1207*5088Sab196087 			const char *name = elfedit_atoconst_value_to_str(
1208*5088Sab196087 			    ELFEDIT_CONST_EI, EI_CLASS, 1);
1209*5088Sab196087 
1210*5088Sab196087 			if (ehdr->e_ident[EI_CLASS] == class) {
1211*5088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
1212*5088Sab196087 				    MSG_INTL(MSG_DEBUG_EI_S_S_OK), name,
1213*5088Sab196087 				    conv_ehdr_class(class, 0, &inv_buf1));
1214*5088Sab196087 			} else {
1215*5088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
1216*5088Sab196087 				    MSG_INTL(MSG_DEBUG_EI_S_S_CHG), name,
1217*5088Sab196087 				    conv_ehdr_class(ehdr->e_ident[EI_CLASS],
1218*5088Sab196087 				    0, &inv_buf1),
1219*5088Sab196087 				    conv_ehdr_class(class, 0, &inv_buf2));
1220*5088Sab196087 				ret = ELFEDIT_CMDRET_MOD;
1221*5088Sab196087 				ehdr->e_ident[EI_CLASS] = class;
1222*5088Sab196087 			}
1223*5088Sab196087 		}
1224*5088Sab196087 		break;
1225*5088Sab196087 
1226*5088Sab196087 	case EHDR_CMD_T_EI_DATA:
1227*5088Sab196087 		{
1228*5088Sab196087 			/* The argument gives the ELFDATA value */
1229*5088Sab196087 			int data = (int)elfedit_atoconst_range(argstate.argv[0],
1230*5088Sab196087 			    MSG_ORIG(MSG_STR_VALUE), 0, 255,
1231*5088Sab196087 			    ELFEDIT_CONST_ELFDATA);
1232*5088Sab196087 			const char *name = elfedit_atoconst_value_to_str(
1233*5088Sab196087 			    ELFEDIT_CONST_EI, EI_DATA, 1);
1234*5088Sab196087 
1235*5088Sab196087 			if (ehdr->e_ident[EI_DATA] == data) {
1236*5088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
1237*5088Sab196087 				    MSG_INTL(MSG_DEBUG_EI_S_S_OK), name,
1238*5088Sab196087 				    conv_ehdr_data(data, 0, &inv_buf1));
1239*5088Sab196087 			} else {
1240*5088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
1241*5088Sab196087 				    MSG_INTL(MSG_DEBUG_EI_S_S_CHG), name,
1242*5088Sab196087 				    conv_ehdr_data(ehdr->e_ident[EI_DATA],
1243*5088Sab196087 				    0, &inv_buf1),
1244*5088Sab196087 				    conv_ehdr_data(data, 0, &inv_buf2));
1245*5088Sab196087 				ret = ELFEDIT_CMDRET_MOD;
1246*5088Sab196087 				ehdr->e_ident[EI_DATA] = data;
1247*5088Sab196087 			}
1248*5088Sab196087 		}
1249*5088Sab196087 		break;
1250*5088Sab196087 
1251*5088Sab196087 	case EHDR_CMD_T_EI_VERSION:
1252*5088Sab196087 		{
1253*5088Sab196087 			/* The argument gives the version */
1254*5088Sab196087 			int ver = (int)elfedit_atoconst_range(argstate.argv[0],
1255*5088Sab196087 			    MSG_ORIG(MSG_STR_VALUE), 0, 255, ELFEDIT_CONST_EV);
1256*5088Sab196087 			const char *name = elfedit_atoconst_value_to_str(
1257*5088Sab196087 			    ELFEDIT_CONST_EI, EI_VERSION, 1);
1258*5088Sab196087 
1259*5088Sab196087 			if (ehdr->e_ident[EI_VERSION] == ver) {
1260*5088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
1261*5088Sab196087 				    MSG_INTL(MSG_DEBUG_EI_S_S_OK), name,
1262*5088Sab196087 				    conv_ehdr_vers(ver, 0, &inv_buf1));
1263*5088Sab196087 			} else {
1264*5088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
1265*5088Sab196087 				    MSG_INTL(MSG_DEBUG_EI_S_S_CHG), name,
1266*5088Sab196087 				    conv_ehdr_vers(ehdr->e_ident[EI_VERSION],
1267*5088Sab196087 				    0, &inv_buf1),
1268*5088Sab196087 				    conv_ehdr_vers(ver, 0, &inv_buf2));
1269*5088Sab196087 				ret = ELFEDIT_CMDRET_MOD;
1270*5088Sab196087 				ehdr->e_ident[EI_VERSION] = ver;
1271*5088Sab196087 			}
1272*5088Sab196087 		}
1273*5088Sab196087 		break;
1274*5088Sab196087 
1275*5088Sab196087 	case EHDR_CMD_T_EI_OSABI:
1276*5088Sab196087 		{
1277*5088Sab196087 			/* The argument gives the ABI code */
1278*5088Sab196087 			int osabi = (int)elfedit_atoconst_range(
1279*5088Sab196087 			    argstate.argv[0], MSG_ORIG(MSG_STR_VALUE), 0, 255,
1280*5088Sab196087 			    ELFEDIT_CONST_ELFOSABI);
1281*5088Sab196087 			const char *name = elfedit_atoconst_value_to_str(
1282*5088Sab196087 			    ELFEDIT_CONST_EI, EI_OSABI, 1);
1283*5088Sab196087 
1284*5088Sab196087 			if (ehdr->e_ident[EI_OSABI] == osabi) {
1285*5088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
1286*5088Sab196087 				    MSG_INTL(MSG_DEBUG_EI_S_S_OK), name,
1287*5088Sab196087 				    conv_ehdr_osabi(osabi, 0, &inv_buf1));
1288*5088Sab196087 			} else {
1289*5088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
1290*5088Sab196087 				    MSG_INTL(MSG_DEBUG_EI_S_S_CHG), name,
1291*5088Sab196087 				    conv_ehdr_osabi(ehdr->e_ident[EI_OSABI],
1292*5088Sab196087 				    0, &inv_buf1),
1293*5088Sab196087 				    conv_ehdr_osabi(osabi, 0, &inv_buf2));
1294*5088Sab196087 				ret = ELFEDIT_CMDRET_MOD;
1295*5088Sab196087 				ehdr->e_ident[EI_OSABI] = osabi;
1296*5088Sab196087 			}
1297*5088Sab196087 		}
1298*5088Sab196087 		break;
1299*5088Sab196087 
1300*5088Sab196087 	case EHDR_CMD_T_EI_ABIVERSION:
1301*5088Sab196087 		{
1302*5088Sab196087 			/* The argument gives the ABI version  */
1303*5088Sab196087 			int abiver = (int)elfedit_atoui_range(argstate.argv[0],
1304*5088Sab196087 			    MSG_ORIG(MSG_STR_VALUE), 0, 255, NULL);
1305*5088Sab196087 			const char *name = elfedit_atoconst_value_to_str(
1306*5088Sab196087 			    ELFEDIT_CONST_EI, EI_ABIVERSION, 1);
1307*5088Sab196087 
1308*5088Sab196087 			if (ehdr->e_ident[EI_ABIVERSION] == abiver) {
1309*5088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
1310*5088Sab196087 				    MSG_INTL(MSG_DEBUG_EI_S_X_OK), name,
1311*5088Sab196087 				    EC_WORD(abiver));
1312*5088Sab196087 			} else {
1313*5088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
1314*5088Sab196087 				    MSG_INTL(MSG_DEBUG_EI_S_X_CHG), name,
1315*5088Sab196087 				    EC_WORD(ehdr->e_ident[EI_ABIVERSION]),
1316*5088Sab196087 				    EC_WORD(abiver));
1317*5088Sab196087 				ret = ELFEDIT_CMDRET_MOD;
1318*5088Sab196087 				ehdr->e_ident[EI_ABIVERSION] = abiver;
1319*5088Sab196087 			}
1320*5088Sab196087 		}
1321*5088Sab196087 		break;
1322*5088Sab196087 	}
1323*5088Sab196087 
1324*5088Sab196087 	/*
1325*5088Sab196087 	 * If we modified the ELF header, tell libelf.
1326*5088Sab196087 	 */
1327*5088Sab196087 	if (ret == ELFEDIT_CMDRET_MOD)
1328*5088Sab196087 		elfedit_modified_ehdr(obj_state);
1329*5088Sab196087 
1330*5088Sab196087 	/* Do autoprint */
1331*5088Sab196087 	print_ehdr(cmd, e_ident_ndx, 1, &argstate);
1332*5088Sab196087 
1333*5088Sab196087 	return (ret);
1334*5088Sab196087 }
1335*5088Sab196087 
1336*5088Sab196087 
1337*5088Sab196087 
1338*5088Sab196087 
1339*5088Sab196087 /*
1340*5088Sab196087  * Command completion functions for the various commands
1341*5088Sab196087  */
1342*5088Sab196087 
1343*5088Sab196087 /*ARGSUSED*/
1344*5088Sab196087 static void
1345*5088Sab196087 cpl_e_ident(elfedit_obj_state_t *obj_state, void *cpldata, int argc,
1346*5088Sab196087     const char *argv[], int num_opt)
1347*5088Sab196087 {
1348*5088Sab196087 	elfedit_atoui_t	ndx;
1349*5088Sab196087 
1350*5088Sab196087 	/*
1351*5088Sab196087 	 * This command doesn't accept options, so num_opt should be
1352*5088Sab196087 	 * 0. This is a defensive measure, in case that should change.
1353*5088Sab196087 	 */
1354*5088Sab196087 	argc -= num_opt;
1355*5088Sab196087 	argv += num_opt;
1356*5088Sab196087 
1357*5088Sab196087 	if (argc == 1) {
1358*5088Sab196087 		elfedit_cpl_atoconst(cpldata, ELFEDIT_CONST_EI);
1359*5088Sab196087 		return;
1360*5088Sab196087 	}
1361*5088Sab196087 
1362*5088Sab196087 	if (argc != 2)
1363*5088Sab196087 		return;
1364*5088Sab196087 
1365*5088Sab196087 	/*
1366*5088Sab196087 	 * In order to offer up the right completion strings for
1367*5088Sab196087 	 * the value, we need to know what index was given for
1368*5088Sab196087 	 * the first argument. If we don't recognize the index,
1369*5088Sab196087 	 * we want to return quietly without issuing an error,
1370*5088Sab196087 	 * so we use elfedit_atoui_range2(), which returns
1371*5088Sab196087 	 * a success/failure result and does not throw any errors.
1372*5088Sab196087 	 */
1373*5088Sab196087 	if (elfedit_atoconst_range2(argv[0], 0, EI_NIDENT - 1,
1374*5088Sab196087 	    ELFEDIT_CONST_EI, &ndx) == 0)
1375*5088Sab196087 		return;
1376*5088Sab196087 	switch (ndx) {
1377*5088Sab196087 	case EI_CLASS:
1378*5088Sab196087 		elfedit_cpl_atoconst(cpldata, ELFEDIT_CONST_ELFCLASS);
1379*5088Sab196087 		break;
1380*5088Sab196087 	case EI_DATA:
1381*5088Sab196087 		elfedit_cpl_atoconst(cpldata, ELFEDIT_CONST_ELFDATA);
1382*5088Sab196087 		break;
1383*5088Sab196087 	case EI_VERSION:
1384*5088Sab196087 		elfedit_cpl_atoconst(cpldata, ELFEDIT_CONST_EV);
1385*5088Sab196087 		break;
1386*5088Sab196087 	case EI_OSABI:
1387*5088Sab196087 		elfedit_cpl_atoconst(cpldata, ELFEDIT_CONST_ELFOSABI);
1388*5088Sab196087 		break;
1389*5088Sab196087 	}
1390*5088Sab196087 }
1391*5088Sab196087 
1392*5088Sab196087 /*ARGSUSED*/
1393*5088Sab196087 static void
1394*5088Sab196087 cpl_e_type(elfedit_obj_state_t *obj_state, void *cpldata, int argc,
1395*5088Sab196087     const char *argv[], int num_opt)
1396*5088Sab196087 {
1397*5088Sab196087 	/*
1398*5088Sab196087 	 * This command doesn't accept options, so num_opt should be
1399*5088Sab196087 	 * 0. This is a defensive measure, in case that should change.
1400*5088Sab196087 	 */
1401*5088Sab196087 	argc -= num_opt;
1402*5088Sab196087 	argv += num_opt;
1403*5088Sab196087 
1404*5088Sab196087 	if (argc == 1)
1405*5088Sab196087 		elfedit_cpl_atoconst(cpldata, ELFEDIT_CONST_ET);
1406*5088Sab196087 }
1407*5088Sab196087 
1408*5088Sab196087 /*ARGSUSED*/
1409*5088Sab196087 static void
1410*5088Sab196087 cpl_e_machine(elfedit_obj_state_t *obj_state, void *cpldata, int argc,
1411*5088Sab196087     const char *argv[], int num_opt)
1412*5088Sab196087 {
1413*5088Sab196087 	/*
1414*5088Sab196087 	 * This command doesn't accept options, so num_opt should be
1415*5088Sab196087 	 * 0. This is a defensive measure, in case that should change.
1416*5088Sab196087 	 */
1417*5088Sab196087 	argc -= num_opt;
1418*5088Sab196087 	argv += num_opt;
1419*5088Sab196087 
1420*5088Sab196087 	if (argc == 1)
1421*5088Sab196087 		elfedit_cpl_atoconst(cpldata, ELFEDIT_CONST_EM);
1422*5088Sab196087 }
1423*5088Sab196087 
1424*5088Sab196087 /*ARGSUSED*/
1425*5088Sab196087 static void
1426*5088Sab196087 cpl_e_version(elfedit_obj_state_t *obj_state, void *cpldata, int argc,
1427*5088Sab196087     const char *argv[], int num_opt)
1428*5088Sab196087 {
1429*5088Sab196087 	/*
1430*5088Sab196087 	 * This command doesn't accept options, so num_opt should be
1431*5088Sab196087 	 * 0. This is a defensive measure, in case that should change.
1432*5088Sab196087 	 */
1433*5088Sab196087 	argc -= num_opt;
1434*5088Sab196087 	argv += num_opt;
1435*5088Sab196087 
1436*5088Sab196087 	if (argc == 1)
1437*5088Sab196087 		elfedit_cpl_atoconst(cpldata, ELFEDIT_CONST_EV);
1438*5088Sab196087 }
1439*5088Sab196087 
1440*5088Sab196087 /*ARGSUSED*/
1441*5088Sab196087 static void
1442*5088Sab196087 cpl_e_flags(elfedit_obj_state_t *obj_state, void *cpldata, int argc,
1443*5088Sab196087     const char *argv[], int num_opt)
1444*5088Sab196087 {
1445*5088Sab196087 	/* This routine allows multiple flags to be specified */
1446*5088Sab196087 	elfedit_cpl_atoconst(cpldata, ELFEDIT_CONST_EF);
1447*5088Sab196087 }
1448*5088Sab196087 
1449*5088Sab196087 /*ARGSUSED*/
1450*5088Sab196087 static void
1451*5088Sab196087 cpl_e_shstrndx(elfedit_obj_state_t *obj_state, void *cpldata, int argc,
1452*5088Sab196087     const char *argv[], int num_opt)
1453*5088Sab196087 {
1454*5088Sab196087 	enum { NAME, INDEX, TYPE } op;
1455*5088Sab196087 	Word ndx;
1456*5088Sab196087 
1457*5088Sab196087 	/*
1458*5088Sab196087 	 * The plainargument can be a section name, index, or
1459*5088Sab196087 	 * type, based on the options used. All have completions.
1460*5088Sab196087 	 */
1461*5088Sab196087 	if (argc != (num_opt + 1))
1462*5088Sab196087 		return;
1463*5088Sab196087 
1464*5088Sab196087 	op = NAME;
1465*5088Sab196087 	for (ndx = 0; ndx < num_opt; ndx++) {
1466*5088Sab196087 		if (strcmp(argv[ndx], MSG_ORIG(MSG_STR_MINUS_SHNDX)) == 0)
1467*5088Sab196087 			op = INDEX;
1468*5088Sab196087 		else if (strcmp(argv[ndx], MSG_ORIG(MSG_STR_MINUS_SHTYP)) == 0)
1469*5088Sab196087 			op = TYPE;
1470*5088Sab196087 	}
1471*5088Sab196087 
1472*5088Sab196087 	if (obj_state == NULL) {	/* No object available */
1473*5088Sab196087 		if (op == TYPE)
1474*5088Sab196087 			elfedit_cpl_atoconst(cpldata, ELFEDIT_CONST_SHT);
1475*5088Sab196087 		return;
1476*5088Sab196087 	}
1477*5088Sab196087 
1478*5088Sab196087 	/*
1479*5088Sab196087 	 * Loop over the sections and supply command completion
1480*5088Sab196087 	 * for the string tables in the file.
1481*5088Sab196087 	 */
1482*5088Sab196087 	for (ndx = 0; ndx < obj_state->os_shnum; ndx++) {
1483*5088Sab196087 		elfedit_section_t *sec = &obj_state->os_secarr[ndx];
1484*5088Sab196087 
1485*5088Sab196087 		if (sec->sec_shdr->sh_type != SHT_STRTAB)
1486*5088Sab196087 			continue;
1487*5088Sab196087 
1488*5088Sab196087 		switch (op) {
1489*5088Sab196087 		case NAME:
1490*5088Sab196087 			elfedit_cpl_match(cpldata, sec->sec_name, 0);
1491*5088Sab196087 			break;
1492*5088Sab196087 		case INDEX:
1493*5088Sab196087 			{
1494*5088Sab196087 				char index[MAXNDXSIZE];
1495*5088Sab196087 
1496*5088Sab196087 				(void) snprintf(index, sizeof (index),
1497*5088Sab196087 				    MSG_ORIG(MSG_FMT_WORDVAL),
1498*5088Sab196087 				    ndx);
1499*5088Sab196087 				elfedit_cpl_match(cpldata, index, 1);
1500*5088Sab196087 			}
1501*5088Sab196087 			break;
1502*5088Sab196087 		case TYPE:
1503*5088Sab196087 			elfedit_cpl_atoconst(cpldata, ELFEDIT_CONST_SHT_STRTAB);
1504*5088Sab196087 			break;
1505*5088Sab196087 		}
1506*5088Sab196087 	}
1507*5088Sab196087 }
1508*5088Sab196087 
1509*5088Sab196087 /*ARGSUSED*/
1510*5088Sab196087 static void
1511*5088Sab196087 cpl_ei_class(elfedit_obj_state_t *obj_state, void *cpldata, int argc,
1512*5088Sab196087     const char *argv[], int num_opt)
1513*5088Sab196087 {
1514*5088Sab196087 	/*
1515*5088Sab196087 	 * This command doesn't accept options, so num_opt should be
1516*5088Sab196087 	 * 0. This is a defensive measure, in case that should change.
1517*5088Sab196087 	 */
1518*5088Sab196087 	argc -= num_opt;
1519*5088Sab196087 	argv += num_opt;
1520*5088Sab196087 
1521*5088Sab196087 	if (argc == 1)
1522*5088Sab196087 		elfedit_cpl_atoconst(cpldata, ELFEDIT_CONST_ELFCLASS);
1523*5088Sab196087 }
1524*5088Sab196087 
1525*5088Sab196087 /*ARGSUSED*/
1526*5088Sab196087 static void
1527*5088Sab196087 cpl_ei_data(elfedit_obj_state_t *obj_state, void *cpldata, int argc,
1528*5088Sab196087     const char *argv[], int num_opt)
1529*5088Sab196087 {
1530*5088Sab196087 	/*
1531*5088Sab196087 	 * This command doesn't accept options, so num_opt should be
1532*5088Sab196087 	 * 0. This is a defensive measure, in case that should change.
1533*5088Sab196087 	 */
1534*5088Sab196087 	argc -= num_opt;
1535*5088Sab196087 	argv += num_opt;
1536*5088Sab196087 
1537*5088Sab196087 	if (argc == 1)
1538*5088Sab196087 		elfedit_cpl_atoconst(cpldata, ELFEDIT_CONST_ELFDATA);
1539*5088Sab196087 }
1540*5088Sab196087 
1541*5088Sab196087 /*ARGSUSED*/
1542*5088Sab196087 static void
1543*5088Sab196087 cpl_ei_osabi(elfedit_obj_state_t *obj_state, void *cpldata, int argc,
1544*5088Sab196087     const char *argv[], int num_opt)
1545*5088Sab196087 {
1546*5088Sab196087 	/*
1547*5088Sab196087 	 * This command doesn't accept options, so num_opt should be
1548*5088Sab196087 	 * 0. This is a defensive measure, in case that should change.
1549*5088Sab196087 	 */
1550*5088Sab196087 	argc -= num_opt;
1551*5088Sab196087 	argv += num_opt;
1552*5088Sab196087 
1553*5088Sab196087 	if (argc == 1)
1554*5088Sab196087 		elfedit_cpl_atoconst(cpldata, ELFEDIT_CONST_ELFOSABI);
1555*5088Sab196087 }
1556*5088Sab196087 
1557*5088Sab196087 
1558*5088Sab196087 
1559*5088Sab196087 
1560*5088Sab196087 /*
1561*5088Sab196087  * Implementation functions for the commands
1562*5088Sab196087  */
1563*5088Sab196087 static elfedit_cmdret_t
1564*5088Sab196087 cmd_dump(elfedit_obj_state_t *obj_state, int argc, const char *argv[])
1565*5088Sab196087 {
1566*5088Sab196087 	return (cmd_body(EHDR_CMD_T_DUMP, obj_state, argc, argv));
1567*5088Sab196087 }
1568*5088Sab196087 
1569*5088Sab196087 
1570*5088Sab196087 static elfedit_cmdret_t
1571*5088Sab196087 cmd_e_ident(elfedit_obj_state_t *obj_state, int argc, const char *argv[])
1572*5088Sab196087 {
1573*5088Sab196087 	return (cmd_body(EHDR_CMD_T_E_IDENT, obj_state, argc, argv));
1574*5088Sab196087 }
1575*5088Sab196087 
1576*5088Sab196087 
1577*5088Sab196087 static elfedit_cmdret_t
1578*5088Sab196087 cmd_e_type(elfedit_obj_state_t *obj_state, int argc, const char *argv[])
1579*5088Sab196087 {
1580*5088Sab196087 	return (cmd_body(EHDR_CMD_T_E_TYPE, obj_state, argc, argv));
1581*5088Sab196087 }
1582*5088Sab196087 
1583*5088Sab196087 
1584*5088Sab196087 static elfedit_cmdret_t
1585*5088Sab196087 cmd_e_machine(elfedit_obj_state_t *obj_state, int argc, const char *argv[])
1586*5088Sab196087 {
1587*5088Sab196087 	return (cmd_body(EHDR_CMD_T_E_MACHINE, obj_state, argc, argv));
1588*5088Sab196087 }
1589*5088Sab196087 
1590*5088Sab196087 
1591*5088Sab196087 static elfedit_cmdret_t
1592*5088Sab196087 cmd_e_version(elfedit_obj_state_t *obj_state, int argc, const char *argv[])
1593*5088Sab196087 {
1594*5088Sab196087 	return (cmd_body(EHDR_CMD_T_E_VERSION, obj_state, argc, argv));
1595*5088Sab196087 }
1596*5088Sab196087 
1597*5088Sab196087 
1598*5088Sab196087 static elfedit_cmdret_t
1599*5088Sab196087 cmd_e_entry(elfedit_obj_state_t *obj_state, int argc, const char *argv[])
1600*5088Sab196087 {
1601*5088Sab196087 	return (cmd_body(EHDR_CMD_T_E_ENTRY, obj_state, argc, argv));
1602*5088Sab196087 }
1603*5088Sab196087 
1604*5088Sab196087 
1605*5088Sab196087 static elfedit_cmdret_t
1606*5088Sab196087 cmd_e_phoff(elfedit_obj_state_t *obj_state, int argc, const char *argv[])
1607*5088Sab196087 {
1608*5088Sab196087 	return (cmd_body(EHDR_CMD_T_E_PHOFF, obj_state, argc, argv));
1609*5088Sab196087 }
1610*5088Sab196087 
1611*5088Sab196087 
1612*5088Sab196087 static elfedit_cmdret_t
1613*5088Sab196087 cmd_e_shoff(elfedit_obj_state_t *obj_state, int argc, const char *argv[])
1614*5088Sab196087 {
1615*5088Sab196087 	return (cmd_body(EHDR_CMD_T_E_SHOFF, obj_state, argc, argv));
1616*5088Sab196087 }
1617*5088Sab196087 
1618*5088Sab196087 
1619*5088Sab196087 static elfedit_cmdret_t
1620*5088Sab196087 cmd_e_flags(elfedit_obj_state_t *obj_state, int argc, const char *argv[])
1621*5088Sab196087 {
1622*5088Sab196087 	return (cmd_body(EHDR_CMD_T_E_FLAGS, obj_state, argc, argv));
1623*5088Sab196087 }
1624*5088Sab196087 
1625*5088Sab196087 
1626*5088Sab196087 static elfedit_cmdret_t
1627*5088Sab196087 cmd_e_ehsize(elfedit_obj_state_t *obj_state, int argc, const char *argv[])
1628*5088Sab196087 {
1629*5088Sab196087 	return (cmd_body(EHDR_CMD_T_E_EHSIZE, obj_state, argc, argv));
1630*5088Sab196087 }
1631*5088Sab196087 
1632*5088Sab196087 
1633*5088Sab196087 static elfedit_cmdret_t
1634*5088Sab196087 cmd_e_phentsize(elfedit_obj_state_t *obj_state, int argc, const char *argv[])
1635*5088Sab196087 {
1636*5088Sab196087 	return (cmd_body(EHDR_CMD_T_E_PHENTSIZE, obj_state, argc, argv));
1637*5088Sab196087 }
1638*5088Sab196087 
1639*5088Sab196087 
1640*5088Sab196087 static elfedit_cmdret_t
1641*5088Sab196087 cmd_e_phnum(elfedit_obj_state_t *obj_state, int argc, const char *argv[])
1642*5088Sab196087 {
1643*5088Sab196087 	return (cmd_body(EHDR_CMD_T_E_PHNUM, obj_state, argc, argv));
1644*5088Sab196087 }
1645*5088Sab196087 
1646*5088Sab196087 
1647*5088Sab196087 static elfedit_cmdret_t
1648*5088Sab196087 cmd_e_shentsize(elfedit_obj_state_t *obj_state, int argc, const char *argv[])
1649*5088Sab196087 {
1650*5088Sab196087 	return (cmd_body(EHDR_CMD_T_E_SHENTSIZE, obj_state, argc, argv));
1651*5088Sab196087 }
1652*5088Sab196087 
1653*5088Sab196087 
1654*5088Sab196087 static elfedit_cmdret_t
1655*5088Sab196087 cmd_e_shnum(elfedit_obj_state_t *obj_state, int argc, const char *argv[])
1656*5088Sab196087 {
1657*5088Sab196087 	return (cmd_body(EHDR_CMD_T_E_SHNUM, obj_state, argc, argv));
1658*5088Sab196087 }
1659*5088Sab196087 
1660*5088Sab196087 
1661*5088Sab196087 static elfedit_cmdret_t
1662*5088Sab196087 cmd_e_shstrndx(elfedit_obj_state_t *obj_state, int argc, const char *argv[])
1663*5088Sab196087 {
1664*5088Sab196087 	return (cmd_body(EHDR_CMD_T_E_SHSTRNDX, obj_state, argc, argv));
1665*5088Sab196087 }
1666*5088Sab196087 
1667*5088Sab196087 
1668*5088Sab196087 static elfedit_cmdret_t
1669*5088Sab196087 cmd_ei_mag0(elfedit_obj_state_t *obj_state, int argc, const char *argv[])
1670*5088Sab196087 {
1671*5088Sab196087 	return (cmd_body(EHDR_CMD_T_EI_MAG0, obj_state, argc, argv));
1672*5088Sab196087 }
1673*5088Sab196087 
1674*5088Sab196087 
1675*5088Sab196087 static elfedit_cmdret_t
1676*5088Sab196087 cmd_ei_mag1(elfedit_obj_state_t *obj_state, int argc, const char *argv[])
1677*5088Sab196087 {
1678*5088Sab196087 	return (cmd_body(EHDR_CMD_T_EI_MAG1, obj_state, argc, argv));
1679*5088Sab196087 }
1680*5088Sab196087 
1681*5088Sab196087 
1682*5088Sab196087 static elfedit_cmdret_t
1683*5088Sab196087 cmd_ei_mag2(elfedit_obj_state_t *obj_state, int argc, const char *argv[])
1684*5088Sab196087 {
1685*5088Sab196087 	return (cmd_body(EHDR_CMD_T_EI_MAG2, obj_state, argc, argv));
1686*5088Sab196087 }
1687*5088Sab196087 
1688*5088Sab196087 
1689*5088Sab196087 static elfedit_cmdret_t
1690*5088Sab196087 cmd_ei_mag3(elfedit_obj_state_t *obj_state, int argc, const char *argv[])
1691*5088Sab196087 {
1692*5088Sab196087 	return (cmd_body(EHDR_CMD_T_EI_MAG3, obj_state, argc, argv));
1693*5088Sab196087 }
1694*5088Sab196087 
1695*5088Sab196087 
1696*5088Sab196087 static elfedit_cmdret_t
1697*5088Sab196087 cmd_ei_class(elfedit_obj_state_t *obj_state, int argc, const char *argv[])
1698*5088Sab196087 {
1699*5088Sab196087 	return (cmd_body(EHDR_CMD_T_EI_CLASS, obj_state, argc, argv));
1700*5088Sab196087 }
1701*5088Sab196087 
1702*5088Sab196087 
1703*5088Sab196087 static elfedit_cmdret_t
1704*5088Sab196087 cmd_ei_data(elfedit_obj_state_t *obj_state, int argc, const char *argv[])
1705*5088Sab196087 {
1706*5088Sab196087 	return (cmd_body(EHDR_CMD_T_EI_DATA, obj_state, argc, argv));
1707*5088Sab196087 }
1708*5088Sab196087 
1709*5088Sab196087 
1710*5088Sab196087 static elfedit_cmdret_t
1711*5088Sab196087 cmd_ei_version(elfedit_obj_state_t *obj_state, int argc, const char *argv[])
1712*5088Sab196087 {
1713*5088Sab196087 	return (cmd_body(EHDR_CMD_T_EI_VERSION, obj_state, argc, argv));
1714*5088Sab196087 }
1715*5088Sab196087 
1716*5088Sab196087 
1717*5088Sab196087 static elfedit_cmdret_t
1718*5088Sab196087 cmd_ei_osabi(elfedit_obj_state_t *obj_state, int argc, const char *argv[])
1719*5088Sab196087 {
1720*5088Sab196087 	return (cmd_body(EHDR_CMD_T_EI_OSABI, obj_state, argc, argv));
1721*5088Sab196087 }
1722*5088Sab196087 
1723*5088Sab196087 
1724*5088Sab196087 static elfedit_cmdret_t
1725*5088Sab196087 cmd_ei_abiversion(elfedit_obj_state_t *obj_state, int argc, const char *argv[])
1726*5088Sab196087 {
1727*5088Sab196087 	return (cmd_body(EHDR_CMD_T_EI_ABIVERSION, obj_state, argc, argv));
1728*5088Sab196087 }
1729*5088Sab196087 
1730*5088Sab196087 
1731*5088Sab196087 
1732*5088Sab196087 
1733*5088Sab196087 /*ARGSUSED*/
1734*5088Sab196087 elfedit_module_t *
1735*5088Sab196087 elfedit_init(elfedit_module_version_t version)
1736*5088Sab196087 {
1737*5088Sab196087 	/* Many of the commands only accept -o */
1738*5088Sab196087 	static elfedit_cmd_optarg_t opt_std[] = {
1739*5088Sab196087 		{ ELFEDIT_STDOA_OPT_O, NULL,
1740*5088Sab196087 		    ELFEDIT_CMDOA_F_INHERIT, 0, 0 },
1741*5088Sab196087 		{ NULL }
1742*5088Sab196087 	};
1743*5088Sab196087 
1744*5088Sab196087 
1745*5088Sab196087 	/* ehdr:dump */
1746*5088Sab196087 	static const char *name_dump[] = {
1747*5088Sab196087 	    MSG_ORIG(MSG_CMD_DUMP),
1748*5088Sab196087 	    MSG_ORIG(MSG_STR_EMPTY),	/* "" makes this the default command */
1749*5088Sab196087 	    NULL
1750*5088Sab196087 	};
1751*5088Sab196087 
1752*5088Sab196087 	/* ehdr:e_ident */
1753*5088Sab196087 	static const char *name_e_ident[] = {
1754*5088Sab196087 		MSG_ORIG(MSG_CMD_E_IDENT), NULL };
1755*5088Sab196087 	static elfedit_cmd_optarg_t arg_e_ident[] = {
1756*5088Sab196087 		{ MSG_ORIG(MSG_STR_INDEX),
1757*5088Sab196087 		    /* MSG_INTL(MSG_ARGDESC_E_IDENT_NDX) */
1758*5088Sab196087 		    ELFEDIT_I18NHDL(MSG_ARGDESC_E_IDENT_NDX),
1759*5088Sab196087 		    ELFEDIT_CMDOA_F_OPT, 0 },
1760*5088Sab196087 		{ MSG_ORIG(MSG_STR_VALUE),
1761*5088Sab196087 		    /* MSG_INTL(MSG_ARGDESC_E_IDENT_VALUE) */
1762*5088Sab196087 		    ELFEDIT_I18NHDL(MSG_ARGDESC_E_IDENT_VALUE),
1763*5088Sab196087 		    ELFEDIT_CMDOA_F_OPT, 0 },
1764*5088Sab196087 		{ NULL }
1765*5088Sab196087 	};
1766*5088Sab196087 
1767*5088Sab196087 	/* ehdr:e_type */
1768*5088Sab196087 	static const char *name_e_type[] = {
1769*5088Sab196087 		MSG_ORIG(MSG_CMD_E_TYPE), NULL };
1770*5088Sab196087 	static elfedit_cmd_optarg_t arg_e_type[] = {
1771*5088Sab196087 		{ MSG_ORIG(MSG_STR_VALUE),
1772*5088Sab196087 		    /* MSG_INTL(MSG_ARGDESC_E_TYPE_VALUE) */
1773*5088Sab196087 		    ELFEDIT_I18NHDL(MSG_ARGDESC_E_TYPE_VALUE),
1774*5088Sab196087 		    ELFEDIT_CMDOA_F_OPT, 0 },
1775*5088Sab196087 		{ NULL }
1776*5088Sab196087 	};
1777*5088Sab196087 
1778*5088Sab196087 	/* ehdr:e_machine */
1779*5088Sab196087 	static const char *name_e_machine[] = {
1780*5088Sab196087 		MSG_ORIG(MSG_CMD_E_MACHINE), NULL };
1781*5088Sab196087 	static elfedit_cmd_optarg_t arg_e_machine[] = {
1782*5088Sab196087 		{ MSG_ORIG(MSG_STR_TYPE),
1783*5088Sab196087 		    /* MSG_INTL(MSG_ARGDESC_E_MACHINE_VALUE) */
1784*5088Sab196087 		    ELFEDIT_I18NHDL(MSG_ARGDESC_E_MACHINE_VALUE),
1785*5088Sab196087 		    ELFEDIT_CMDOA_F_OPT, 0 },
1786*5088Sab196087 		{ NULL }
1787*5088Sab196087 	};
1788*5088Sab196087 
1789*5088Sab196087 	/* ehdr:e_version */
1790*5088Sab196087 	static const char *name_e_version[] = {
1791*5088Sab196087 		MSG_ORIG(MSG_CMD_E_VERSION), NULL };
1792*5088Sab196087 	static elfedit_cmd_optarg_t arg_e_version[] = {
1793*5088Sab196087 		{ MSG_ORIG(MSG_STR_VERSION),
1794*5088Sab196087 		    /* MSG_INTL(MSG_ARGDESC_E_VERSION_VALUE) */
1795*5088Sab196087 		    ELFEDIT_I18NHDL(MSG_ARGDESC_E_VERSION_VALUE),
1796*5088Sab196087 		    ELFEDIT_CMDOA_F_OPT, 0 },
1797*5088Sab196087 		{ NULL }
1798*5088Sab196087 	};
1799*5088Sab196087 
1800*5088Sab196087 	/* ehdr:e_entry */
1801*5088Sab196087 	static const char *name_e_entry[] = {
1802*5088Sab196087 		MSG_ORIG(MSG_CMD_E_ENTRY), NULL };
1803*5088Sab196087 	static elfedit_cmd_optarg_t arg_e_entry[] = {
1804*5088Sab196087 		{ MSG_ORIG(MSG_STR_VALUE),
1805*5088Sab196087 		    /* MSG_INTL(MSG_ARGDESC_E_ENTRY_VALUE) */
1806*5088Sab196087 		    ELFEDIT_I18NHDL(MSG_ARGDESC_E_ENTRY_VALUE),
1807*5088Sab196087 		    ELFEDIT_CMDOA_F_OPT, 0 },
1808*5088Sab196087 		{ NULL }
1809*5088Sab196087 	};
1810*5088Sab196087 
1811*5088Sab196087 	/* ehdr:e_phoff */
1812*5088Sab196087 	static const char *name_e_phoff[] = {
1813*5088Sab196087 		MSG_ORIG(MSG_CMD_E_PHOFF), NULL };
1814*5088Sab196087 	static elfedit_cmd_optarg_t arg_e_phoff[] = {
1815*5088Sab196087 		{ MSG_ORIG(MSG_STR_OFFSET),
1816*5088Sab196087 		    /* MSG_INTL(MSG_ARGDESC_E_PHOFF_VALUE) */
1817*5088Sab196087 		    ELFEDIT_I18NHDL(MSG_ARGDESC_E_PHOFF_VALUE),
1818*5088Sab196087 		    ELFEDIT_CMDOA_F_OPT, 0 },
1819*5088Sab196087 		{ NULL }
1820*5088Sab196087 	};
1821*5088Sab196087 
1822*5088Sab196087 	/* ehdr:e_shoff */
1823*5088Sab196087 	static const char *name_e_shoff[] = {
1824*5088Sab196087 		MSG_ORIG(MSG_CMD_E_SHOFF), NULL };
1825*5088Sab196087 	static elfedit_cmd_optarg_t arg_e_shoff[] = {
1826*5088Sab196087 		{ MSG_ORIG(MSG_STR_OFFSET),
1827*5088Sab196087 		    /* MSG_INTL(MSG_ARGDESC_E_SHOFF_VALUE) */
1828*5088Sab196087 		    ELFEDIT_I18NHDL(MSG_ARGDESC_E_SHOFF_VALUE),
1829*5088Sab196087 		    ELFEDIT_CMDOA_F_OPT, 0 },
1830*5088Sab196087 		{ NULL }
1831*5088Sab196087 	};
1832*5088Sab196087 
1833*5088Sab196087 	/* ehdr:e_flags */
1834*5088Sab196087 	static const char *name_e_flags[] = {
1835*5088Sab196087 		MSG_ORIG(MSG_CMD_E_FLAGS), NULL };
1836*5088Sab196087 	static elfedit_cmd_optarg_t opt_e_flags[] = {
1837*5088Sab196087 		{ ELFEDIT_STDOA_OPT_AND, NULL,
1838*5088Sab196087 		    ELFEDIT_CMDOA_F_INHERIT, EHDR_OPT_F_AND, EHDR_OPT_F_OR },
1839*5088Sab196087 		{ ELFEDIT_STDOA_OPT_CMP, NULL,
1840*5088Sab196087 		    ELFEDIT_CMDOA_F_INHERIT, EHDR_OPT_F_CMP, 0 },
1841*5088Sab196087 		{ ELFEDIT_STDOA_OPT_O, NULL,
1842*5088Sab196087 		    ELFEDIT_CMDOA_F_INHERIT, 0, 0 },
1843*5088Sab196087 		{ ELFEDIT_STDOA_OPT_OR, NULL,
1844*5088Sab196087 		    ELFEDIT_CMDOA_F_INHERIT, EHDR_OPT_F_OR, EHDR_OPT_F_AND },
1845*5088Sab196087 		{ NULL }
1846*5088Sab196087 	};
1847*5088Sab196087 	static elfedit_cmd_optarg_t arg_e_flags[] = {
1848*5088Sab196087 		{ MSG_ORIG(MSG_STR_FLAGVALUE),
1849*5088Sab196087 		    /* MSG_INTL(MSG_ARGDESC_E_FLAGS_VALUE) */
1850*5088Sab196087 		    ELFEDIT_I18NHDL(MSG_ARGDESC_E_FLAGS_VALUE),
1851*5088Sab196087 		    ELFEDIT_CMDOA_F_OPT | ELFEDIT_CMDOA_F_MULT, 0 },
1852*5088Sab196087 		{ NULL }
1853*5088Sab196087 	};
1854*5088Sab196087 
1855*5088Sab196087 	/* ehdr:e_ehsize */
1856*5088Sab196087 	static const char *name_e_ehsize[] = {
1857*5088Sab196087 		MSG_ORIG(MSG_CMD_E_EHSIZE), NULL };
1858*5088Sab196087 	static elfedit_cmd_optarg_t arg_e_ehsize[] = {
1859*5088Sab196087 		{ MSG_ORIG(MSG_STR_VALUE),
1860*5088Sab196087 		    /* MSG_INTL(MSG_ARGDESC_E_EHSIZE_VALUE) */
1861*5088Sab196087 		    ELFEDIT_I18NHDL(MSG_ARGDESC_E_EHSIZE_VALUE),
1862*5088Sab196087 		    ELFEDIT_CMDOA_F_OPT, 0 },
1863*5088Sab196087 		{ NULL }
1864*5088Sab196087 	};
1865*5088Sab196087 
1866*5088Sab196087 	/* ehdr:e_phentsize */
1867*5088Sab196087 	static const char *name_e_phentsize[] = {
1868*5088Sab196087 		MSG_ORIG(MSG_CMD_E_PHENTSIZE), NULL };
1869*5088Sab196087 	static elfedit_cmd_optarg_t arg_e_phentsize[] = {
1870*5088Sab196087 		{ MSG_ORIG(MSG_STR_VALUE),
1871*5088Sab196087 		    /* MSG_INTL(MSG_ARGDESC_E_PHENTSIZE_VALUE) */
1872*5088Sab196087 		    ELFEDIT_I18NHDL(MSG_ARGDESC_E_PHENTSIZE_VALUE),
1873*5088Sab196087 		    ELFEDIT_CMDOA_F_OPT, 0 },
1874*5088Sab196087 		{ NULL }
1875*5088Sab196087 	};
1876*5088Sab196087 
1877*5088Sab196087 	/* ehdr:e_phnum */
1878*5088Sab196087 	static const char *name_e_phnum[] = {
1879*5088Sab196087 		MSG_ORIG(MSG_CMD_E_PHNUM), NULL };
1880*5088Sab196087 	static elfedit_cmd_optarg_t arg_e_phnum[] = {
1881*5088Sab196087 		{ MSG_ORIG(MSG_STR_VALUE),
1882*5088Sab196087 		    /* MSG_INTL(MSG_ARGDESC_E_PHNUM_VALUE) */
1883*5088Sab196087 		    ELFEDIT_I18NHDL(MSG_ARGDESC_E_PHNUM_VALUE),
1884*5088Sab196087 		    ELFEDIT_CMDOA_F_OPT, 0 },
1885*5088Sab196087 		{ NULL }
1886*5088Sab196087 	};
1887*5088Sab196087 
1888*5088Sab196087 	/* ehdr:e_shentsize */
1889*5088Sab196087 	static const char *name_e_shentsize[] = {
1890*5088Sab196087 		MSG_ORIG(MSG_CMD_E_SHENTSIZE), NULL };
1891*5088Sab196087 	static elfedit_cmd_optarg_t arg_e_shentsize[] = {
1892*5088Sab196087 		{ MSG_ORIG(MSG_STR_VALUE),
1893*5088Sab196087 		    /* MSG_INTL(MSG_ARGDESC_E_SHENTSIZE_VALUE) */
1894*5088Sab196087 		    ELFEDIT_I18NHDL(MSG_ARGDESC_E_SHENTSIZE_VALUE),
1895*5088Sab196087 		    ELFEDIT_CMDOA_F_OPT, 0 },
1896*5088Sab196087 		{ NULL }
1897*5088Sab196087 	};
1898*5088Sab196087 
1899*5088Sab196087 	/* ehdr:e_shnum */
1900*5088Sab196087 	static const char *name_e_shnum[] = {
1901*5088Sab196087 		MSG_ORIG(MSG_CMD_E_SHNUM), NULL };
1902*5088Sab196087 	static elfedit_cmd_optarg_t arg_e_shnum[] = {
1903*5088Sab196087 		{ MSG_ORIG(MSG_STR_VALUE),
1904*5088Sab196087 		    /* MSG_INTL(MSG_ARGDESC_E_SHNUM_VALUE) */
1905*5088Sab196087 		    ELFEDIT_I18NHDL(MSG_ARGDESC_E_SHNUM_VALUE),
1906*5088Sab196087 		    ELFEDIT_CMDOA_F_OPT, 0 },
1907*5088Sab196087 		{ NULL }
1908*5088Sab196087 	};
1909*5088Sab196087 
1910*5088Sab196087 	/* ehdr:e_shstrndx */
1911*5088Sab196087 	static const char *name_e_shstrndx[] = {
1912*5088Sab196087 		MSG_ORIG(MSG_CMD_E_SHSTRNDX), NULL };
1913*5088Sab196087 	static elfedit_cmd_optarg_t opt_e_shstrndx[] = {
1914*5088Sab196087 		{ ELFEDIT_STDOA_OPT_O, NULL,
1915*5088Sab196087 		    ELFEDIT_CMDOA_F_INHERIT, 0, 0 },
1916*5088Sab196087 		{ MSG_ORIG(MSG_STR_MINUS_SHNDX),
1917*5088Sab196087 		    /* MSG_INTL(MSG_OPTDESC_SHNDX) */
1918*5088Sab196087 		    ELFEDIT_I18NHDL(MSG_OPTDESC_SHNDX), 0,
1919*5088Sab196087 		    EHDR_OPT_F_SHNDX, EHDR_OPT_F_SHTYP },
1920*5088Sab196087 		{ MSG_ORIG(MSG_STR_MINUS_SHTYP),
1921*5088Sab196087 		    /* MSG_INTL(MSG_OPTDESC_SHTYP) */
1922*5088Sab196087 		    ELFEDIT_I18NHDL(MSG_OPTDESC_SHTYP), 0,
1923*5088Sab196087 		    EHDR_OPT_F_SHTYP, EHDR_OPT_F_SHNDX,  },
1924*5088Sab196087 		{ NULL }
1925*5088Sab196087 	};
1926*5088Sab196087 	static elfedit_cmd_optarg_t arg_e_shstrndx[] = {
1927*5088Sab196087 		{ MSG_ORIG(MSG_STR_SEC),
1928*5088Sab196087 		    /* MSG_INTL(MSG_ARGDESC_E_SHSTRNDX_SEC) */
1929*5088Sab196087 		    ELFEDIT_I18NHDL(MSG_ARGDESC_E_SHSTRNDX_SEC),
1930*5088Sab196087 		    ELFEDIT_CMDOA_F_OPT, 0 },
1931*5088Sab196087 		{ NULL }
1932*5088Sab196087 	};
1933*5088Sab196087 
1934*5088Sab196087 	/* ehdr:ei_mag0 */
1935*5088Sab196087 	static const char *name_ei_mag0[] = {
1936*5088Sab196087 		MSG_ORIG(MSG_CMD_EI_MAG0), NULL };
1937*5088Sab196087 	static elfedit_cmd_optarg_t arg_ei_mag0[] = {
1938*5088Sab196087 		{ MSG_ORIG(MSG_STR_VALUE),
1939*5088Sab196087 		    /* MSG_INTL(MSG_ARGDESC_EI_MAG0_VALUE) */
1940*5088Sab196087 		    ELFEDIT_I18NHDL(MSG_ARGDESC_EI_MAG0_VALUE),
1941*5088Sab196087 		    ELFEDIT_CMDOA_F_OPT, 0 },
1942*5088Sab196087 		{ NULL }
1943*5088Sab196087 	};
1944*5088Sab196087 
1945*5088Sab196087 	/* ehdr:ei_mag1 */
1946*5088Sab196087 	static const char *name_ei_mag1[] = {
1947*5088Sab196087 		MSG_ORIG(MSG_CMD_EI_MAG1), NULL };
1948*5088Sab196087 	static elfedit_cmd_optarg_t arg_ei_mag1[] = {
1949*5088Sab196087 		{ MSG_ORIG(MSG_STR_VALUE),
1950*5088Sab196087 		    /* MSG_INTL(MSG_ARGDESC_EI_MAG1_VALUE) */
1951*5088Sab196087 		    ELFEDIT_I18NHDL(MSG_ARGDESC_EI_MAG1_VALUE),
1952*5088Sab196087 		    ELFEDIT_CMDOA_F_OPT, 0 },
1953*5088Sab196087 		{ NULL }
1954*5088Sab196087 	};
1955*5088Sab196087 
1956*5088Sab196087 	/* ehdr:ei_mag2 */
1957*5088Sab196087 	static const char *name_ei_mag2[] = {
1958*5088Sab196087 		MSG_ORIG(MSG_CMD_EI_MAG2), NULL };
1959*5088Sab196087 	static elfedit_cmd_optarg_t arg_ei_mag2[] = {
1960*5088Sab196087 		{ MSG_ORIG(MSG_STR_VALUE),
1961*5088Sab196087 		    /* MSG_INTL(MSG_ARGDESC_EI_MAG2_VALUE) */
1962*5088Sab196087 		    ELFEDIT_I18NHDL(MSG_ARGDESC_EI_MAG2_VALUE),
1963*5088Sab196087 		    ELFEDIT_CMDOA_F_OPT, 0 },
1964*5088Sab196087 		{ NULL }
1965*5088Sab196087 	};
1966*5088Sab196087 
1967*5088Sab196087 	/* ehdr:ei_mag3 */
1968*5088Sab196087 	static const char *name_ei_mag3[] = {
1969*5088Sab196087 		MSG_ORIG(MSG_CMD_EI_MAG3), NULL };
1970*5088Sab196087 	static elfedit_cmd_optarg_t arg_ei_mag3[] = {
1971*5088Sab196087 		{ MSG_ORIG(MSG_STR_VALUE),
1972*5088Sab196087 		    /* MSG_INTL(MSG_ARGDESC_EI_MAG3_VALUE) */
1973*5088Sab196087 		    ELFEDIT_I18NHDL(MSG_ARGDESC_EI_MAG3_VALUE),
1974*5088Sab196087 		    ELFEDIT_CMDOA_F_OPT, 0 },
1975*5088Sab196087 		{ NULL }
1976*5088Sab196087 	};
1977*5088Sab196087 
1978*5088Sab196087 	/* ehdr:ei_class */
1979*5088Sab196087 	static const char *name_ei_class[] = {
1980*5088Sab196087 		MSG_ORIG(MSG_CMD_EI_CLASS), NULL };
1981*5088Sab196087 	static elfedit_cmd_optarg_t arg_ei_class[] = {
1982*5088Sab196087 		{ MSG_ORIG(MSG_STR_VALUE),
1983*5088Sab196087 		    /* MSG_INTL(MSG_ARGDESC_EI_CLASS_VALUE) */
1984*5088Sab196087 		    ELFEDIT_I18NHDL(MSG_ARGDESC_EI_CLASS_VALUE),
1985*5088Sab196087 		    ELFEDIT_CMDOA_F_OPT, 0 },
1986*5088Sab196087 		{ NULL }
1987*5088Sab196087 	};
1988*5088Sab196087 
1989*5088Sab196087 	/* ehdr:ei_data */
1990*5088Sab196087 	static const char *name_ei_data[] = {
1991*5088Sab196087 		MSG_ORIG(MSG_CMD_EI_DATA), NULL };
1992*5088Sab196087 	static elfedit_cmd_optarg_t arg_ei_data[] = {
1993*5088Sab196087 		{ MSG_ORIG(MSG_STR_VALUE),
1994*5088Sab196087 		    /* MSG_INTL(MSG_ARGDESC_EI_DATA_VALUE) */
1995*5088Sab196087 		    ELFEDIT_I18NHDL(MSG_ARGDESC_EI_DATA_VALUE),
1996*5088Sab196087 		    ELFEDIT_CMDOA_F_OPT, 0 },
1997*5088Sab196087 		{ NULL }
1998*5088Sab196087 	};
1999*5088Sab196087 
2000*5088Sab196087 	/* ehdr:ei_version */
2001*5088Sab196087 	static const char *name_ei_version[] = {
2002*5088Sab196087 		MSG_ORIG(MSG_CMD_EI_VERSION), NULL };
2003*5088Sab196087 	/* Note: arg_e_version is also used for this command */
2004*5088Sab196087 
2005*5088Sab196087 	/* ehdr:ei_osabi */
2006*5088Sab196087 	static const char *name_ei_osabi[] = {
2007*5088Sab196087 		MSG_ORIG(MSG_CMD_EI_OSABI), NULL };
2008*5088Sab196087 	static elfedit_cmd_optarg_t arg_ei_osabi[] = {
2009*5088Sab196087 		{ MSG_ORIG(MSG_STR_VALUE),
2010*5088Sab196087 		    /* MSG_INTL(MSG_ARGDESC_EI_OSABI_VALUE) */
2011*5088Sab196087 		    ELFEDIT_I18NHDL(MSG_ARGDESC_EI_OSABI_VALUE),
2012*5088Sab196087 		    ELFEDIT_CMDOA_F_OPT, 0 },
2013*5088Sab196087 		{ NULL }
2014*5088Sab196087 	};
2015*5088Sab196087 
2016*5088Sab196087 	/* ehdr:ei_abiversion */
2017*5088Sab196087 	static const char *name_ei_abiversion[] = {
2018*5088Sab196087 		MSG_ORIG(MSG_CMD_EI_ABIVERSION), NULL };
2019*5088Sab196087 	static elfedit_cmd_optarg_t arg_ei_abiversion[] = {
2020*5088Sab196087 		{ MSG_ORIG(MSG_STR_VALUE),
2021*5088Sab196087 		    /* MSG_INTL(MSG_ARGDESC_EI_ABIVERSION_VALUE) */
2022*5088Sab196087 		    ELFEDIT_I18NHDL(MSG_ARGDESC_EI_ABIVERSION_VALUE),
2023*5088Sab196087 		    ELFEDIT_CMDOA_F_OPT, 0 },
2024*5088Sab196087 		{ NULL }
2025*5088Sab196087 	};
2026*5088Sab196087 
2027*5088Sab196087 
2028*5088Sab196087 
2029*5088Sab196087 
2030*5088Sab196087 	static elfedit_cmd_t cmds[] = {
2031*5088Sab196087 		/* ehdr:dump */
2032*5088Sab196087 		{ cmd_dump, NULL, name_dump,
2033*5088Sab196087 		    /* MSG_INTL(MSG_DESC_DUMP) */
2034*5088Sab196087 		    ELFEDIT_I18NHDL(MSG_DESC_DUMP),
2035*5088Sab196087 		    /* MSG_INTL(MSG_HELP_DUMP) */
2036*5088Sab196087 		    ELFEDIT_I18NHDL(MSG_HELP_DUMP),
2037*5088Sab196087 		    NULL, NULL },
2038*5088Sab196087 
2039*5088Sab196087 		/* ehdr:e_ident */
2040*5088Sab196087 		{ cmd_e_ident, cpl_e_ident, name_e_ident,
2041*5088Sab196087 		    /* MSG_INTL(MSG_DESC_E_IDENT) */
2042*5088Sab196087 		    ELFEDIT_I18NHDL(MSG_DESC_E_IDENT),
2043*5088Sab196087 		    /* MSG_INTL(MSG_HELP_E_IDENT) */
2044*5088Sab196087 		    ELFEDIT_I18NHDL(MSG_HELP_E_IDENT),
2045*5088Sab196087 		    opt_std, arg_e_ident },
2046*5088Sab196087 
2047*5088Sab196087 		/* ehdr:e_type */
2048*5088Sab196087 		{ cmd_e_type, cpl_e_type, name_e_type,
2049*5088Sab196087 		    /* MSG_INTL(MSG_DESC_E_TYPE) */
2050*5088Sab196087 		    ELFEDIT_I18NHDL(MSG_DESC_E_TYPE),
2051*5088Sab196087 		    /* MSG_INTL(MSG_HELP_E_TYPE) */
2052*5088Sab196087 		    ELFEDIT_I18NHDL(MSG_HELP_E_TYPE),
2053*5088Sab196087 		    opt_std, arg_e_type },
2054*5088Sab196087 
2055*5088Sab196087 		/* ehdr:e_machine */
2056*5088Sab196087 		{ cmd_e_machine, cpl_e_machine, name_e_machine,
2057*5088Sab196087 		    /* MSG_INTL(MSG_DESC_E_MACHINE) */
2058*5088Sab196087 		    ELFEDIT_I18NHDL(MSG_DESC_E_MACHINE),
2059*5088Sab196087 		    /* MSG_INTL(MSG_HELP_E_MACHINE) */
2060*5088Sab196087 		    ELFEDIT_I18NHDL(MSG_HELP_E_MACHINE),
2061*5088Sab196087 		    opt_std, arg_e_machine },
2062*5088Sab196087 
2063*5088Sab196087 		/* ehdr:e_version */
2064*5088Sab196087 		{ cmd_e_version, cpl_e_version, name_e_version,
2065*5088Sab196087 		    /* MSG_INTL(MSG_DESC_E_VERSION) */
2066*5088Sab196087 		    ELFEDIT_I18NHDL(MSG_DESC_E_VERSION),
2067*5088Sab196087 		    /* MSG_INTL(MSG_HELP_E_VERSION) */
2068*5088Sab196087 		    ELFEDIT_I18NHDL(MSG_HELP_E_VERSION),
2069*5088Sab196087 		    opt_std, arg_e_version },
2070*5088Sab196087 
2071*5088Sab196087 		/* ehdr:e_entry */
2072*5088Sab196087 		{ cmd_e_entry, NULL, name_e_entry,
2073*5088Sab196087 		    /* MSG_INTL(MSG_DESC_E_ENTRY) */
2074*5088Sab196087 		    ELFEDIT_I18NHDL(MSG_DESC_E_ENTRY),
2075*5088Sab196087 		    /* MSG_INTL(MSG_HELP_E_ENTRY) */
2076*5088Sab196087 		    ELFEDIT_I18NHDL(MSG_HELP_E_ENTRY),
2077*5088Sab196087 		    opt_std, arg_e_entry },
2078*5088Sab196087 
2079*5088Sab196087 		/* ehdr:e_phoff */
2080*5088Sab196087 		{ cmd_e_phoff, NULL, name_e_phoff,
2081*5088Sab196087 		    /* MSG_INTL(MSG_DESC_E_PHOFF) */
2082*5088Sab196087 		    ELFEDIT_I18NHDL(MSG_DESC_E_PHOFF),
2083*5088Sab196087 		    /* MSG_INTL(MSG_HELP_E_PHOFF) */
2084*5088Sab196087 		    ELFEDIT_I18NHDL(MSG_HELP_E_PHOFF),
2085*5088Sab196087 		    opt_std, arg_e_phoff },
2086*5088Sab196087 
2087*5088Sab196087 		/* ehdr:e_shoff */
2088*5088Sab196087 		{ cmd_e_shoff, NULL, name_e_shoff,
2089*5088Sab196087 		    /* MSG_INTL(MSG_DESC_E_SHOFF) */
2090*5088Sab196087 		    ELFEDIT_I18NHDL(MSG_DESC_E_SHOFF),
2091*5088Sab196087 		    /* MSG_INTL(MSG_HELP_E_SHOFF) */
2092*5088Sab196087 		    ELFEDIT_I18NHDL(MSG_HELP_E_SHOFF),
2093*5088Sab196087 		    opt_std, arg_e_shoff },
2094*5088Sab196087 
2095*5088Sab196087 		/* ehdr:e_flags */
2096*5088Sab196087 		{ cmd_e_flags, cpl_e_flags, name_e_flags,
2097*5088Sab196087 		    /* MSG_INTL(MSG_DESC_E_FLAGS) */
2098*5088Sab196087 		    ELFEDIT_I18NHDL(MSG_DESC_E_FLAGS),
2099*5088Sab196087 		    /* MSG_INTL(MSG_HELP_E_FLAGS) */
2100*5088Sab196087 		    ELFEDIT_I18NHDL(MSG_HELP_E_FLAGS),
2101*5088Sab196087 		    opt_e_flags, arg_e_flags },
2102*5088Sab196087 
2103*5088Sab196087 		/* ehdr:e_ehsize */
2104*5088Sab196087 		{ cmd_e_ehsize, NULL, name_e_ehsize,
2105*5088Sab196087 		    /* MSG_INTL(MSG_DESC_E_EHSIZE) */
2106*5088Sab196087 		    ELFEDIT_I18NHDL(MSG_DESC_E_EHSIZE),
2107*5088Sab196087 		    /* MSG_INTL(MSG_HELP_E_EHSIZE) */
2108*5088Sab196087 		    ELFEDIT_I18NHDL(MSG_HELP_E_EHSIZE),
2109*5088Sab196087 		    opt_std, arg_e_ehsize },
2110*5088Sab196087 
2111*5088Sab196087 		/* ehdr:e_phentsize */
2112*5088Sab196087 		{ cmd_e_phentsize, NULL, name_e_phentsize,
2113*5088Sab196087 		    /* MSG_INTL(MSG_DESC_E_PHENTSIZE) */
2114*5088Sab196087 		    ELFEDIT_I18NHDL(MSG_DESC_E_PHENTSIZE),
2115*5088Sab196087 		    /* MSG_INTL(MSG_HELP_E_PHENTSIZE) */
2116*5088Sab196087 		    ELFEDIT_I18NHDL(MSG_HELP_E_PHENTSIZE),
2117*5088Sab196087 		    opt_std, arg_e_phentsize },
2118*5088Sab196087 
2119*5088Sab196087 		/* ehdr:e_phnum */
2120*5088Sab196087 		{ cmd_e_phnum, NULL, name_e_phnum,
2121*5088Sab196087 		    /* MSG_INTL(MSG_DESC_E_PHNUM) */
2122*5088Sab196087 		    ELFEDIT_I18NHDL(MSG_DESC_E_PHNUM),
2123*5088Sab196087 		    /* MSG_INTL(MSG_HELP_E_PHNUM) */
2124*5088Sab196087 		    ELFEDIT_I18NHDL(MSG_HELP_E_PHNUM),
2125*5088Sab196087 		    opt_std, arg_e_phnum },
2126*5088Sab196087 
2127*5088Sab196087 		/* ehdr:e_shentsize */
2128*5088Sab196087 		{ cmd_e_shentsize, NULL, name_e_shentsize,
2129*5088Sab196087 		    /* MSG_INTL(MSG_DESC_E_SHENTSIZE) */
2130*5088Sab196087 		    ELFEDIT_I18NHDL(MSG_DESC_E_SHENTSIZE),
2131*5088Sab196087 		    /* MSG_INTL(MSG_HELP_E_SHENTSIZE) */
2132*5088Sab196087 		    ELFEDIT_I18NHDL(MSG_HELP_E_SHENTSIZE),
2133*5088Sab196087 		    opt_std, arg_e_shentsize },
2134*5088Sab196087 
2135*5088Sab196087 		/* ehdr:e_shnum */
2136*5088Sab196087 		{ cmd_e_shnum, NULL, name_e_shnum,
2137*5088Sab196087 		    /* MSG_INTL(MSG_DESC_E_SHNUM) */
2138*5088Sab196087 		    ELFEDIT_I18NHDL(MSG_DESC_E_SHNUM),
2139*5088Sab196087 		    /* MSG_INTL(MSG_HELP_E_SHNUM) */
2140*5088Sab196087 		    ELFEDIT_I18NHDL(MSG_HELP_E_SHNUM),
2141*5088Sab196087 		    opt_std, arg_e_shnum },
2142*5088Sab196087 
2143*5088Sab196087 		/* ehdr:e_shstrndx */
2144*5088Sab196087 		{ cmd_e_shstrndx, cpl_e_shstrndx, name_e_shstrndx,
2145*5088Sab196087 		    /* MSG_INTL(MSG_DESC_E_SHSTRNDX) */
2146*5088Sab196087 		    ELFEDIT_I18NHDL(MSG_DESC_E_SHSTRNDX),
2147*5088Sab196087 		    /* MSG_INTL(MSG_HELP_E_SHSTRNDX) */
2148*5088Sab196087 		    ELFEDIT_I18NHDL(MSG_HELP_E_SHSTRNDX),
2149*5088Sab196087 		    opt_e_shstrndx, arg_e_shstrndx },
2150*5088Sab196087 
2151*5088Sab196087 		/* ehdr:ei_mag0 */
2152*5088Sab196087 		{ cmd_ei_mag0, NULL, name_ei_mag0,
2153*5088Sab196087 		    /* MSG_INTL(MSG_DESC_EI_MAG0) */
2154*5088Sab196087 		    ELFEDIT_I18NHDL(MSG_DESC_EI_MAG0),
2155*5088Sab196087 		    /* MSG_INTL(MSG_HELP_EI_MAG0) */
2156*5088Sab196087 		    ELFEDIT_I18NHDL(MSG_HELP_EI_MAG0),
2157*5088Sab196087 		    opt_std, arg_ei_mag0 },
2158*5088Sab196087 
2159*5088Sab196087 		/* ehdr:ei_mag1 */
2160*5088Sab196087 		{ cmd_ei_mag1, NULL, name_ei_mag1,
2161*5088Sab196087 		    /* MSG_INTL(MSG_DESC_EI_MAG1) */
2162*5088Sab196087 		    ELFEDIT_I18NHDL(MSG_DESC_EI_MAG1),
2163*5088Sab196087 		    /* MSG_INTL(MSG_HELP_EI_MAG1) */
2164*5088Sab196087 		    ELFEDIT_I18NHDL(MSG_HELP_EI_MAG1),
2165*5088Sab196087 		    opt_std, arg_ei_mag1 },
2166*5088Sab196087 
2167*5088Sab196087 		/* ehdr:ei_mag2 */
2168*5088Sab196087 		{ cmd_ei_mag2, NULL, name_ei_mag2,
2169*5088Sab196087 		    /* MSG_INTL(MSG_DESC_EI_MAG2) */
2170*5088Sab196087 		    ELFEDIT_I18NHDL(MSG_DESC_EI_MAG2),
2171*5088Sab196087 		    /* MSG_INTL(MSG_HELP_EI_MAG2) */
2172*5088Sab196087 		    ELFEDIT_I18NHDL(MSG_HELP_EI_MAG2),
2173*5088Sab196087 		    opt_std, arg_ei_mag2 },
2174*5088Sab196087 
2175*5088Sab196087 		/* ehdr:ei_mag3 */
2176*5088Sab196087 		{ cmd_ei_mag3, NULL, name_ei_mag3,
2177*5088Sab196087 		    /* MSG_INTL(MSG_DESC_EI_MAG3) */
2178*5088Sab196087 		    ELFEDIT_I18NHDL(MSG_DESC_EI_MAG3),
2179*5088Sab196087 		    /* MSG_INTL(MSG_HELP_EI_MAG3) */
2180*5088Sab196087 		    ELFEDIT_I18NHDL(MSG_HELP_EI_MAG3),
2181*5088Sab196087 		    opt_std, arg_ei_mag3 },
2182*5088Sab196087 
2183*5088Sab196087 		/* ehdr:ei_class */
2184*5088Sab196087 		{ cmd_ei_class, cpl_ei_class, name_ei_class,
2185*5088Sab196087 		    /* MSG_INTL(MSG_DESC_EI_CLASS) */
2186*5088Sab196087 		    ELFEDIT_I18NHDL(MSG_DESC_EI_CLASS),
2187*5088Sab196087 		    /* MSG_INTL(MSG_HELP_EI_CLASS) */
2188*5088Sab196087 		    ELFEDIT_I18NHDL(MSG_HELP_EI_CLASS),
2189*5088Sab196087 		    opt_std, arg_ei_class },
2190*5088Sab196087 
2191*5088Sab196087 		/* ehdr:ei_data */
2192*5088Sab196087 		{ cmd_ei_data, cpl_ei_data, name_ei_data,
2193*5088Sab196087 		    /* MSG_INTL(MSG_DESC_EI_DATA) */
2194*5088Sab196087 		    ELFEDIT_I18NHDL(MSG_DESC_EI_DATA),
2195*5088Sab196087 		    /* MSG_INTL(MSG_HELP_EI_DATA) */
2196*5088Sab196087 		    ELFEDIT_I18NHDL(MSG_HELP_EI_DATA),
2197*5088Sab196087 		    opt_std, arg_ei_data },
2198*5088Sab196087 
2199*5088Sab196087 		/* ehdr:ei_version */
2200*5088Sab196087 		{ cmd_ei_version, cpl_e_version, name_ei_version,
2201*5088Sab196087 		    /* MSG_INTL(MSG_DESC_EI_VERSION) */
2202*5088Sab196087 		    ELFEDIT_I18NHDL(MSG_DESC_EI_VERSION),
2203*5088Sab196087 		    /* MSG_INTL(MSG_HELP_EI_VERSION) */
2204*5088Sab196087 		    ELFEDIT_I18NHDL(MSG_HELP_EI_VERSION),
2205*5088Sab196087 		    opt_std, arg_e_version },
2206*5088Sab196087 
2207*5088Sab196087 		/* ehdr:ei_osabi */
2208*5088Sab196087 		{ cmd_ei_osabi, cpl_ei_osabi, name_ei_osabi,
2209*5088Sab196087 		    /* MSG_INTL(MSG_DESC_EI_OSABI) */
2210*5088Sab196087 		    ELFEDIT_I18NHDL(MSG_DESC_EI_OSABI),
2211*5088Sab196087 		    /* MSG_INTL(MSG_HELP_EI_OSABI) */
2212*5088Sab196087 		    ELFEDIT_I18NHDL(MSG_HELP_EI_OSABI),
2213*5088Sab196087 		    opt_std, arg_ei_osabi },
2214*5088Sab196087 
2215*5088Sab196087 		/* ehdr:ei_abiversion */
2216*5088Sab196087 		{ cmd_ei_abiversion, NULL, name_ei_abiversion,
2217*5088Sab196087 		    /* MSG_INTL(MSG_DESC_EI_ABIVERSION) */
2218*5088Sab196087 		    ELFEDIT_I18NHDL(MSG_DESC_EI_ABIVERSION),
2219*5088Sab196087 		    /* MSG_INTL(MSG_HELP_EI_ABIVERSION) */
2220*5088Sab196087 		    ELFEDIT_I18NHDL(MSG_HELP_EI_ABIVERSION),
2221*5088Sab196087 		    opt_std, arg_ei_abiversion },
2222*5088Sab196087 
2223*5088Sab196087 		{ NULL }
2224*5088Sab196087 	};
2225*5088Sab196087 
2226*5088Sab196087 	static elfedit_module_t module = {
2227*5088Sab196087 	    ELFEDIT_VER_CURRENT, MSG_ORIG(MSG_MOD_NAME),
2228*5088Sab196087 	    /* MSG_INTL(MSG_MOD_DESC) */
2229*5088Sab196087 	    ELFEDIT_I18NHDL(MSG_MOD_DESC),
2230*5088Sab196087 	    cmds, mod_i18nhdl_to_str };
2231*5088Sab196087 
2232*5088Sab196087 	return (&module);
2233*5088Sab196087 }
2234