xref: /onnv-gate/usr/src/cmd/sgs/elfedit/modules/common/shdr.c (revision 9273:9a0603d78ad3)
15088Sab196087 /*
25088Sab196087  * CDDL HEADER START
35088Sab196087  *
45088Sab196087  * The contents of this file are subject to the terms of the
55088Sab196087  * Common Development and Distribution License (the "License").
65088Sab196087  * You may not use this file except in compliance with the License.
75088Sab196087  *
85088Sab196087  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
95088Sab196087  * or http://www.opensolaris.org/os/licensing.
105088Sab196087  * See the License for the specific language governing permissions
115088Sab196087  * and limitations under the License.
125088Sab196087  *
135088Sab196087  * When distributing Covered Code, include this CDDL HEADER in each
145088Sab196087  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
155088Sab196087  * If applicable, add the following below this CDDL HEADER, with the
165088Sab196087  * fields enclosed by brackets "[]" replaced with your own identifying
175088Sab196087  * information: Portions Copyright [yyyy] [name of copyright owner]
185088Sab196087  *
195088Sab196087  * CDDL HEADER END
205088Sab196087  */
215088Sab196087 
225088Sab196087 /*
23*9273SAli.Bahrami@Sun.COM  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
245088Sab196087  * Use is subject to license terms.
255088Sab196087  */
265088Sab196087 
275088Sab196087 #include	<stdio.h>
285088Sab196087 #include	<unistd.h>
295088Sab196087 #include	<elfedit.h>
305088Sab196087 #include	<sys/elf_SPARC.h>
315088Sab196087 #include	<sys/elf_amd64.h>
325088Sab196087 #include	<strings.h>
335088Sab196087 #include	<debug.h>
345088Sab196087 #include	<conv.h>
355088Sab196087 #include	<shdr_msg.h>
365088Sab196087 
375088Sab196087 
385088Sab196087 
395088Sab196087 
405088Sab196087 /*
415088Sab196087  * This module uses shared code for several of the commands.
425088Sab196087  * It is sometimes necessary to know which specific command
435088Sab196087  * is active.
445088Sab196087  */
455088Sab196087 typedef enum {
465088Sab196087 	SHDR_CMD_T_DUMP =		0,	/* shdr:dump */
475088Sab196087 
485088Sab196087 	SHDR_CMD_T_SH_ADDR =		1,	/* shdr:sh_addr */
495088Sab196087 	SHDR_CMD_T_SH_ADDRALIGN =	2,	/* shdr:sh_addralign */
505088Sab196087 	SHDR_CMD_T_SH_ENTSIZE =		3,	/* shdr:sh_entsize */
515088Sab196087 	SHDR_CMD_T_SH_FLAGS =		4,	/* shdr:sh_flags */
525088Sab196087 	SHDR_CMD_T_SH_INFO =		5,	/* shdr:sh_info */
535088Sab196087 	SHDR_CMD_T_SH_LINK =		6,	/* shdr:sh_link */
545088Sab196087 	SHDR_CMD_T_SH_NAME =		7,	/* shdr:sh_name */
555088Sab196087 	SHDR_CMD_T_SH_OFFSET =		8,	/* shdr:sh_offset */
565088Sab196087 	SHDR_CMD_T_SH_SIZE =		9,	/* shdr:sh_size */
575088Sab196087 	SHDR_CMD_T_SH_TYPE =		10	/* shdr:sh_type */
585088Sab196087 } SHDR_CMD_T;
595088Sab196087 
605088Sab196087 
615088Sab196087 
625088Sab196087 #ifndef _ELF64
635088Sab196087 /*
645088Sab196087  * We supply this function for the msg module. Only one copy is needed.
655088Sab196087  */
665088Sab196087 const char *
_shdr_msg(Msg mid)675088Sab196087 _shdr_msg(Msg mid)
685088Sab196087 {
695088Sab196087 	return (gettext(MSG_ORIG(mid)));
705088Sab196087 }
715088Sab196087 
725088Sab196087 #endif
735088Sab196087 
745088Sab196087 
755088Sab196087 
765088Sab196087 /*
775088Sab196087  * This function is supplied to elfedit through our elfedit_module_t
785088Sab196087  * definition. It translates the opaque elfedit_i18nhdl_t handles
795088Sab196087  * in our module interface into the actual strings for elfedit to
805088Sab196087  * use.
815088Sab196087  *
825088Sab196087  * note:
835088Sab196087  *	This module uses Msg codes for its i18n handle type.
845088Sab196087  *	So the translation is simply to use MSG_INTL() to turn
855088Sab196087  *	it into a string and return it.
865088Sab196087  */
875088Sab196087 static const char *
mod_i18nhdl_to_str(elfedit_i18nhdl_t hdl)885088Sab196087 mod_i18nhdl_to_str(elfedit_i18nhdl_t hdl)
895088Sab196087 {
905088Sab196087 	Msg msg = (Msg)hdl;
915088Sab196087 
925088Sab196087 	return (MSG_INTL(msg));
935088Sab196087 }
945088Sab196087 
955088Sab196087 
965088Sab196087 
975088Sab196087 /*
985088Sab196087  * The shdr_opt_t enum specifies a bit value for every optional
995088Sab196087  * argument allowed by a command in this module.
1005088Sab196087  */
1015088Sab196087 typedef enum {
1025088Sab196087 	SHDR_OPT_F_AND =	1,	/* -and: AND (&) values to dest */
1035088Sab196087 	SHDR_OPT_F_CMP =	2,	/* -cmp: Complement (~) values */
1045088Sab196087 	SHDR_OPT_F_NAMOFFSET =	4,	/* -name_offset: Name arg is numeric */
1055088Sab196087 					/*	 ofset rather than string */
1065088Sab196087 	SHDR_OPT_F_OR =		8,	/* -or: OR (|) values to dest */
1075088Sab196087 	SHDR_OPT_F_SHNDX =	16,	/* -shndx: Section by index, not name */
1085892Sab196087 	SHDR_OPT_F_SHTYP =	32,	/* -shtyp: Section by type, not name */
1095892Sab196087 	SHDR_OPT_F_VALUE_SHNAM = 64,	/* -value_shnam: Value of sh_info or */
1105892Sab196087 					/*	sh_link given as section name */
1115892Sab196087 	SHDR_OPT_F_VALUE_SHTYP = 128	/* -value_shtyp: Value of sh_info or */
1125892Sab196087 					/*	sh_link given as section type */
1135088Sab196087 } shdr_opt_t;
1145088Sab196087 
1155088Sab196087 
1165088Sab196087 /*
1175088Sab196087  * A variable of type ARGSTATE is used by each command to maintain
1185088Sab196087  * information about the section headers and related things. It is
1195088Sab196087  * initialized by process_args(), and used by the other routines.
1205088Sab196087  */
1215088Sab196087 typedef struct {
1225088Sab196087 	elfedit_obj_state_t	*obj_state;
1235088Sab196087 	shdr_opt_t		optmask;   	/* Mask of options used */
1245088Sab196087 	int			argc;		/* # of plain arguments */
1255088Sab196087 	const char		**argv;		/* Plain arguments */
1265088Sab196087 } ARGSTATE;
1275088Sab196087 
1285088Sab196087 
1295088Sab196087 
1305088Sab196087 
1315088Sab196087 /*
1325088Sab196087  * Standard argument processing for shdr module
1335088Sab196087  *
1345088Sab196087  * entry
1355088Sab196087  *	obj_state, argc, argv - Standard command arguments
1365088Sab196087  *	optmask - Mask of allowed optional arguments.
1375088Sab196087  *	cmd - SHDR_CMD_T_* value giving identify of caller
1385088Sab196087  *	argstate - Address of ARGSTATE block to be initialized
1395088Sab196087  *
1405088Sab196087  * exit:
1415088Sab196087  *	On success, *argstate is initialized. On error,
1425088Sab196087  *	an error is issued and this routine does not return.
1435088Sab196087  */
1445088Sab196087 static void
process_args(elfedit_obj_state_t * obj_state,int argc,const char * argv[],SHDR_CMD_T cmd,ARGSTATE * argstate)1455088Sab196087 process_args(elfedit_obj_state_t *obj_state, int argc, const char *argv[],
1465088Sab196087     SHDR_CMD_T cmd, ARGSTATE *argstate)
1475088Sab196087 {
1485088Sab196087 	elfedit_getopt_state_t	getopt_state;
1495088Sab196087 	elfedit_getopt_ret_t	*getopt_ret;
1505088Sab196087 
1515088Sab196087 	bzero(argstate, sizeof (*argstate));
1525088Sab196087 	argstate->obj_state = obj_state;
1535088Sab196087 
1545088Sab196087 	elfedit_getopt_init(&getopt_state, &argc, &argv);
1555088Sab196087 
1565088Sab196087 	/* Add each new option to the options mask */
1575088Sab196087 	while ((getopt_ret = elfedit_getopt(&getopt_state)) != NULL)
1585088Sab196087 		argstate->optmask |= getopt_ret->gor_idmask;
1595088Sab196087 
1605088Sab196087 	/* Are the right number of plain arguments present? */
1615088Sab196087 	switch (cmd) {
1625088Sab196087 	case SHDR_CMD_T_DUMP:
1635088Sab196087 		if (argc > 1)
1645088Sab196087 			elfedit_command_usage();
1655088Sab196087 		break;
1665088Sab196087 	case SHDR_CMD_T_SH_FLAGS:
1675088Sab196087 		/* shdr:sh_flags allows an arbitrary number of arguments */
1685088Sab196087 		break;
1695088Sab196087 	default:
1705088Sab196087 		/* The remaining commands accept 2 plain arguments */
1715088Sab196087 		if (argc > 2)
1725088Sab196087 			elfedit_command_usage();
1735088Sab196087 		break;
1745088Sab196087 	}
1755088Sab196087 
1765088Sab196087 	/* If there may be an arbitrary amount of output, use a pager */
1775088Sab196087 	if (argc == 0)
1785088Sab196087 		elfedit_pager_init();
1795088Sab196087 
1805088Sab196087 	/* Return the updated values of argc/argv */
1815088Sab196087 	argstate->argc = argc;
1825088Sab196087 	argstate->argv = argv;
1835088Sab196087 }
1845088Sab196087 
1855088Sab196087 
1865088Sab196087 
1875088Sab196087 /*
188*9273SAli.Bahrami@Sun.COM  * Options for deciding which items print_shdr() displays.
189*9273SAli.Bahrami@Sun.COM  */
190*9273SAli.Bahrami@Sun.COM typedef enum {
191*9273SAli.Bahrami@Sun.COM 	PRINT_SHDR_ALL,		/* Print all shdr[ndx:ndx+cnt-1] */
192*9273SAli.Bahrami@Sun.COM 	PRINT_SHDR_TYPE,	/* Print all shdr[ndx:ndx+cnt-1] with type */
193*9273SAli.Bahrami@Sun.COM 				/*	 of shdr[ndx] */
194*9273SAli.Bahrami@Sun.COM 	PRINT_SHDR_NAME,	/* Print all shdr[ndx:ndx+cnt-1] with name */
195*9273SAli.Bahrami@Sun.COM 				/*	 of shdr[ndx] */
196*9273SAli.Bahrami@Sun.COM } PRINT_SHDR_T;
197*9273SAli.Bahrami@Sun.COM 
198*9273SAli.Bahrami@Sun.COM /*
1995088Sab196087  * Print section header values, taking the calling command, and output style
2005088Sab196087  * into account.
2015088Sab196087  *
2025088Sab196087  * entry:
2035088Sab196087  *	autoprint - If True, output is only produced if the elfedit
2045088Sab196087  *		autoprint flag is set. If False, output is always produced.
2055088Sab196087  *	cmd - SHDR_CMD_T_* value giving identify of caller
2065088Sab196087  *	argstate - State block for section header array
2075088Sab196087  *	ndx - Index of first section to display
2085088Sab196087  *	cnt - Number of sections to display
209*9273SAli.Bahrami@Sun.COM  *	print_type - Specifies which items are shown
2105088Sab196087  */
2115088Sab196087 static void
print_shdr(SHDR_CMD_T cmd,int autoprint,ARGSTATE * argstate,Word ndx,Word cnt,PRINT_SHDR_T print_type)2125088Sab196087 print_shdr(SHDR_CMD_T cmd, int autoprint, ARGSTATE *argstate,
213*9273SAli.Bahrami@Sun.COM     Word ndx, Word cnt, PRINT_SHDR_T print_type)
2145088Sab196087 {
2155088Sab196087 	elfedit_outstyle_t	outstyle;
216*9273SAli.Bahrami@Sun.COM 	Ehdr			*ehdr = argstate->obj_state->os_ehdr;
217*9273SAli.Bahrami@Sun.COM 	uchar_t			osabi = ehdr->e_ident[EI_OSABI];
218*9273SAli.Bahrami@Sun.COM 	Half			mach = ehdr->e_machine;
219*9273SAli.Bahrami@Sun.COM 	elfedit_section_t 	*ref_sec = &argstate->obj_state->os_secarr[ndx];
220*9273SAli.Bahrami@Sun.COM 
2215088Sab196087 
2225088Sab196087 	if ((autoprint && ((elfedit_flags() & ELFEDIT_F_AUTOPRINT) == 0)) ||
2235088Sab196087 	    (cnt == 0))
2245088Sab196087 		return;
2255088Sab196087 
2265088Sab196087 	/*
2275088Sab196087 	 * Pick an output style. shdr:dump is required to use the default
2285088Sab196087 	 * style. The other commands use the current output style.
2295088Sab196087 	 */
2305088Sab196087 	outstyle = (cmd == SHDR_CMD_T_DUMP) ?
2315088Sab196087 	    ELFEDIT_OUTSTYLE_DEFAULT : elfedit_outstyle();
2325088Sab196087 
233*9273SAli.Bahrami@Sun.COM 	for (; cnt--; ndx++) {
234*9273SAli.Bahrami@Sun.COM 		elfedit_section_t *sec = &argstate->obj_state->os_secarr[ndx];
235*9273SAli.Bahrami@Sun.COM 		Shdr *shdr = sec->sec_shdr;
236*9273SAli.Bahrami@Sun.COM 
237*9273SAli.Bahrami@Sun.COM 		switch (print_type) {
238*9273SAli.Bahrami@Sun.COM 		case PRINT_SHDR_TYPE:
239*9273SAli.Bahrami@Sun.COM 			if (shdr->sh_type != ref_sec->sec_shdr->sh_type)
240*9273SAli.Bahrami@Sun.COM 				continue;
241*9273SAli.Bahrami@Sun.COM 			break;
2425088Sab196087 
243*9273SAli.Bahrami@Sun.COM 		case PRINT_SHDR_NAME:
244*9273SAli.Bahrami@Sun.COM 			if (strcmp(sec->sec_name, ref_sec->sec_name) != 0)
245*9273SAli.Bahrami@Sun.COM 				continue;
246*9273SAli.Bahrami@Sun.COM 			break;
247*9273SAli.Bahrami@Sun.COM 		}
2485088Sab196087 
249*9273SAli.Bahrami@Sun.COM 		/*
250*9273SAli.Bahrami@Sun.COM 		 * If doing default output, use elfdump style where we
251*9273SAli.Bahrami@Sun.COM 		 * show all section header attributes. In this case, the
252*9273SAli.Bahrami@Sun.COM 		 * command that called us doesn't matter
253*9273SAli.Bahrami@Sun.COM 		 */
254*9273SAli.Bahrami@Sun.COM 		if (outstyle == ELFEDIT_OUTSTYLE_DEFAULT) {
2555088Sab196087 			elfedit_printf(MSG_ORIG(MSG_STR_NL));
2565088Sab196087 			elfedit_printf(MSG_INTL(MSG_ELF_SHDR), ndx,
2575088Sab196087 			    sec->sec_name);
258*9273SAli.Bahrami@Sun.COM 			Elf_shdr(NULL, osabi, mach, sec->sec_shdr);
259*9273SAli.Bahrami@Sun.COM 			continue;
2605088Sab196087 		}
2615088Sab196087 
262*9273SAli.Bahrami@Sun.COM 		/* Non-default output is handled case by case */
263*9273SAli.Bahrami@Sun.COM 		switch (cmd) {
264*9273SAli.Bahrami@Sun.COM 		case SHDR_CMD_T_SH_ADDR:
2655088Sab196087 			elfedit_printf(MSG_ORIG(MSG_FMT_XWORDHEXNL),
2665088Sab196087 			    EC_XWORD(shdr->sh_addr));
267*9273SAli.Bahrami@Sun.COM 			break;
2685088Sab196087 
269*9273SAli.Bahrami@Sun.COM 		case SHDR_CMD_T_SH_ADDRALIGN:
2705088Sab196087 			elfedit_printf(MSG_ORIG(MSG_FMT_XWORDHEXNL),
2715088Sab196087 			    EC_XWORD(shdr->sh_addralign));
272*9273SAli.Bahrami@Sun.COM 			break;
2735088Sab196087 
274*9273SAli.Bahrami@Sun.COM 		case SHDR_CMD_T_SH_ENTSIZE:
2755088Sab196087 			elfedit_printf(MSG_ORIG(MSG_FMT_XWORDHEXNL),
2765088Sab196087 			    EC_XWORD(shdr->sh_entsize));
277*9273SAli.Bahrami@Sun.COM 			break;
2785088Sab196087 
279*9273SAli.Bahrami@Sun.COM 		case SHDR_CMD_T_SH_FLAGS:
2805088Sab196087 			if (outstyle == ELFEDIT_OUTSTYLE_SIMPLE) {
2815088Sab196087 				Conv_sec_flags_buf_t sec_flags_buf;
2825088Sab196087 
2835088Sab196087 				elfedit_printf(MSG_ORIG(MSG_FMT_STRNL),
284*9273SAli.Bahrami@Sun.COM 				    conv_sec_flags(osabi, mach, shdr->sh_flags,
2855088Sab196087 				    CONV_FMT_NOBKT, &sec_flags_buf));
2865088Sab196087 			} else {
2875088Sab196087 				elfedit_printf(MSG_ORIG(MSG_FMT_XWORDHEXNL),
2885088Sab196087 				    EC_XWORD(shdr->sh_flags));
2895088Sab196087 			}
290*9273SAli.Bahrami@Sun.COM 			break;
2915088Sab196087 
292*9273SAli.Bahrami@Sun.COM 		case SHDR_CMD_T_SH_INFO:
2935088Sab196087 			elfedit_printf(MSG_ORIG(MSG_FMT_WORDVALNL),
2945088Sab196087 			    EC_WORD(shdr->sh_info));
295*9273SAli.Bahrami@Sun.COM 			break;
2965088Sab196087 
297*9273SAli.Bahrami@Sun.COM 		case SHDR_CMD_T_SH_LINK:
2985088Sab196087 			elfedit_printf(MSG_ORIG(MSG_FMT_WORDVALNL),
2995088Sab196087 			    EC_WORD(shdr->sh_link));
300*9273SAli.Bahrami@Sun.COM 			break;
3015088Sab196087 
302*9273SAli.Bahrami@Sun.COM 		case SHDR_CMD_T_SH_NAME:
303*9273SAli.Bahrami@Sun.COM 			/*
304*9273SAli.Bahrami@Sun.COM 			 * In simple output mode, we show the string. In
305*9273SAli.Bahrami@Sun.COM 			 * numeric mode, we show the string table offset.
306*9273SAli.Bahrami@Sun.COM 			 */
3075088Sab196087 			if (outstyle == ELFEDIT_OUTSTYLE_SIMPLE) {
3085088Sab196087 				elfedit_printf(MSG_ORIG(MSG_FMT_STRNL),
309*9273SAli.Bahrami@Sun.COM 				    sec->sec_name);
3105088Sab196087 			} else {
3115088Sab196087 				elfedit_printf(MSG_ORIG(MSG_FMT_WORDVALNL),
312*9273SAli.Bahrami@Sun.COM 				    EC_WORD(shdr->sh_name));
3135088Sab196087 			}
314*9273SAli.Bahrami@Sun.COM 			break;
3155088Sab196087 
316*9273SAli.Bahrami@Sun.COM 		case SHDR_CMD_T_SH_OFFSET:
3175088Sab196087 			elfedit_printf(MSG_ORIG(MSG_FMT_XWORDHEXNL),
3185088Sab196087 			    EC_XWORD(shdr->sh_offset));
319*9273SAli.Bahrami@Sun.COM 			break;
3205088Sab196087 
321*9273SAli.Bahrami@Sun.COM 		case SHDR_CMD_T_SH_SIZE:
3225088Sab196087 			elfedit_printf(MSG_ORIG(MSG_FMT_XWORDHEXNL),
3235088Sab196087 			    EC_XWORD(shdr->sh_size));
324*9273SAli.Bahrami@Sun.COM 			break;
3255088Sab196087 
326*9273SAli.Bahrami@Sun.COM 		case SHDR_CMD_T_SH_TYPE:
3275088Sab196087 			if (outstyle == ELFEDIT_OUTSTYLE_SIMPLE) {
328*9273SAli.Bahrami@Sun.COM 				Conv_inv_buf_t inv_buf;
3295088Sab196087 
3305088Sab196087 				elfedit_printf(MSG_ORIG(MSG_FMT_STRNL),
331*9273SAli.Bahrami@Sun.COM 				    conv_sec_type(osabi, mach, shdr->sh_type, 0,
3325088Sab196087 				    &inv_buf));
3335088Sab196087 			} else {
3345088Sab196087 				elfedit_printf(MSG_ORIG(MSG_FMT_WORDHEXNL),
3355088Sab196087 				    EC_WORD(shdr->sh_type));
3365088Sab196087 			}
337*9273SAli.Bahrami@Sun.COM 			break;
3385088Sab196087 		}
3395088Sab196087 	}
3405088Sab196087 }
3415088Sab196087 
3425088Sab196087 
3435088Sab196087 /*
3445088Sab196087  * Common body for the shdr: module commands. These commands
3455088Sab196087  * share a large amount of common behavior, so it is convenient
3465088Sab196087  * to centralize things and use the cmd argument to handle the
3475088Sab196087  * small differences.
3485088Sab196087  *
3495088Sab196087  * entry:
3505088Sab196087  *	cmd - One of the SHDR_CMD_T_* constants listed above, specifying
3515088Sab196087  *		which command to implement.
3525088Sab196087  *	obj_state, argc, argv - Standard command arguments
3535088Sab196087  */
3545088Sab196087 static elfedit_cmdret_t
cmd_body(SHDR_CMD_T cmd,elfedit_obj_state_t * obj_state,int argc,const char * argv[])3555088Sab196087 cmd_body(SHDR_CMD_T cmd, elfedit_obj_state_t *obj_state,
3565088Sab196087     int argc, const char *argv[])
3575088Sab196087 {
358*9273SAli.Bahrami@Sun.COM 	Ehdr			*ehdr = obj_state->os_ehdr;
359*9273SAli.Bahrami@Sun.COM 	uchar_t			osabi = ehdr->e_ident[EI_OSABI];
360*9273SAli.Bahrami@Sun.COM 	Half			mach = ehdr->e_machine;
3615088Sab196087 	ARGSTATE		argstate;
3625088Sab196087 	Word			ndx;
3635088Sab196087 	elfedit_section_t	*shdr_sec;
3645088Sab196087 	Shdr			*shdr;
3655088Sab196087 	elfedit_cmdret_t	ret = ELFEDIT_CMDRET_NONE;
366*9273SAli.Bahrami@Sun.COM 	PRINT_SHDR_T		print_type;
3675088Sab196087 
3685088Sab196087 	process_args(obj_state, argc, argv, cmd, &argstate);
3695088Sab196087 
3705088Sab196087 	/* If there are no arguments, dump the whole table and return */
3715088Sab196087 	if (argstate.argc == 0) {
372*9273SAli.Bahrami@Sun.COM 		print_shdr(cmd, 0, &argstate, 0, obj_state->os_shnum,
373*9273SAli.Bahrami@Sun.COM 		    PRINT_SHDR_ALL);
3745088Sab196087 		return (ELFEDIT_CMDRET_NONE);
3755088Sab196087 	}
3765088Sab196087 
3775088Sab196087 	/*
3785088Sab196087 	 * The first argument gives the section to use. This can be a
3795088Sab196087 	 * name (default), section index, or section type, depending on
3805088Sab196087 	 * the options used.
3815088Sab196087 	 */
382*9273SAli.Bahrami@Sun.COM 	if (argstate.optmask & SHDR_OPT_F_SHNDX) {
3835088Sab196087 		ndx = elfedit_atoshndx(argstate.argv[0], obj_state->os_shnum);
384*9273SAli.Bahrami@Sun.COM 		print_type = PRINT_SHDR_ALL;
385*9273SAli.Bahrami@Sun.COM 	} else if (argstate.optmask & SHDR_OPT_F_SHTYP) {
3865088Sab196087 		ndx = elfedit_type_to_shndx(obj_state,
3875088Sab196087 		    elfedit_atoconst(argstate.argv[0], ELFEDIT_CONST_SHT));
388*9273SAli.Bahrami@Sun.COM 		print_type = PRINT_SHDR_TYPE;
389*9273SAli.Bahrami@Sun.COM 	} else {
3905088Sab196087 		ndx = elfedit_name_to_shndx(obj_state, argstate.argv[0]);
391*9273SAli.Bahrami@Sun.COM 		print_type = PRINT_SHDR_NAME;
392*9273SAli.Bahrami@Sun.COM 	}
3935088Sab196087 
3945088Sab196087 	/* If there is a single argument, display that item and return */
3955088Sab196087 	if (argstate.argc == 1) {
396*9273SAli.Bahrami@Sun.COM 		Word	cnt;
397*9273SAli.Bahrami@Sun.COM 
398*9273SAli.Bahrami@Sun.COM 		cnt = (print_type == PRINT_SHDR_ALL) ?
399*9273SAli.Bahrami@Sun.COM 		    1 : obj_state->os_shnum - ndx;
400*9273SAli.Bahrami@Sun.COM 		print_shdr(cmd, 0, &argstate, ndx, cnt, print_type);
4015088Sab196087 		return (ELFEDIT_CMDRET_NONE);
4025088Sab196087 	}
4035088Sab196087 
4045088Sab196087 	/*
4055088Sab196087 	 * Section [0] is supposed to be all zero unless extended sections
4065088Sab196087 	 * are in force. Rather than setting extended values directly,
407*9273SAli.Bahrami@Sun.COM 	 * it is expected to be handled by libelf. So, a direct change here
408*9273SAli.Bahrami@Sun.COM 	 * is probably not what was intended.
4095088Sab196087 	 */
4105088Sab196087 	if (ndx == 0)
4115088Sab196087 		elfedit_msg(ELFEDIT_MSG_DEBUG, MSG_INTL(MSG_DEBUG_CHGSHDR0));
4125088Sab196087 
4135088Sab196087 	/* The second value is an integer giving a new value */
4145088Sab196087 	shdr_sec = &obj_state->os_secarr[ndx];
4155088Sab196087 	shdr = shdr_sec->sec_shdr;
4165088Sab196087 	switch (cmd) {
4175088Sab196087 		/*
4185088Sab196087 		 * SHDR_CMD_T_DUMP can't get here: It never has more than
4195088Sab196087 		 * one argument, and is handled above.
4205088Sab196087 		 */
4215088Sab196087 
4225088Sab196087 	case SHDR_CMD_T_SH_ADDR:
4235088Sab196087 		{
4245088Sab196087 			Addr sh_addr = elfedit_atoui(argstate.argv[1], NULL);
4255088Sab196087 
4265088Sab196087 			if (shdr->sh_addr == sh_addr) {
4275088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
4285088Sab196087 				    MSG_INTL(MSG_DEBUG_LLX_OK),
4295088Sab196087 				    ndx, shdr_sec->sec_name,
4305088Sab196087 				    MSG_ORIG(MSG_CMD_SH_ADDR),
4315088Sab196087 				    EC_ADDR(shdr->sh_addr));
4325088Sab196087 			} else {
4335088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
4345088Sab196087 				    MSG_INTL(MSG_DEBUG_LLX_CHG),
4355088Sab196087 				    ndx, shdr_sec->sec_name,
4365088Sab196087 				    MSG_ORIG(MSG_CMD_SH_ADDR),
4375088Sab196087 				    EC_ADDR(shdr->sh_addr), EC_ADDR(sh_addr));
4385088Sab196087 				ret = ELFEDIT_CMDRET_MOD;
4395088Sab196087 				shdr->sh_addr = sh_addr;
4405088Sab196087 			}
4415088Sab196087 		}
4425088Sab196087 		break;
4435088Sab196087 
4445088Sab196087 	case SHDR_CMD_T_SH_ADDRALIGN:
4455088Sab196087 		{
4465088Sab196087 			Xword	sh_addralign;
4475088Sab196087 
4485088Sab196087 			sh_addralign = elfedit_atoui(argstate.argv[1], NULL);
4495088Sab196087 			if (elfedit_bits_set(sh_addralign,
4505088Sab196087 			    sizeof (sh_addralign)) > 1)
4515088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
4525088Sab196087 				    MSG_INTL(MSG_DEBUG_ADDRALIGN),
4535088Sab196087 				    argstate.argv[1]);
4545088Sab196087 			if (shdr->sh_addralign == sh_addralign) {
4555088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
4565088Sab196087 				    MSG_INTL(MSG_DEBUG_LLX_OK),
4575088Sab196087 				    ndx, shdr_sec->sec_name,
4585088Sab196087 				    MSG_ORIG(MSG_CMD_SH_ADDRALIGN),
4595088Sab196087 				    EC_XWORD(shdr->sh_addralign));
4605088Sab196087 			} else {
4615088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
4625088Sab196087 				    MSG_INTL(MSG_DEBUG_LLX_CHG),
4635088Sab196087 				    ndx, shdr_sec->sec_name,
4645088Sab196087 				    MSG_ORIG(MSG_CMD_SH_ADDRALIGN),
4655088Sab196087 				    EC_XWORD(shdr->sh_addralign),
4665088Sab196087 				    EC_XWORD(sh_addralign));
4675088Sab196087 				ret = ELFEDIT_CMDRET_MOD;
4685088Sab196087 				shdr->sh_addralign = sh_addralign;
4695088Sab196087 			}
4705088Sab196087 		}
4715088Sab196087 		break;
4725088Sab196087 
4735088Sab196087 	case SHDR_CMD_T_SH_ENTSIZE:
4745088Sab196087 		{
4755088Sab196087 			Xword sh_entsize;
4765088Sab196087 
4775088Sab196087 			sh_entsize = elfedit_atoui(argstate.argv[1], NULL);
4785088Sab196087 			if (shdr->sh_entsize == sh_entsize) {
4795088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
4805088Sab196087 				    MSG_INTL(MSG_DEBUG_LLX_OK),
4815088Sab196087 				    ndx, shdr_sec->sec_name,
4825088Sab196087 				    MSG_ORIG(MSG_CMD_SH_ENTSIZE),
4835088Sab196087 				    EC_XWORD(shdr->sh_entsize));
4845088Sab196087 			} else {
4855088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
4865088Sab196087 				    MSG_INTL(MSG_DEBUG_LLX_CHG),
4875088Sab196087 				    ndx, shdr_sec->sec_name,
4885088Sab196087 				    MSG_ORIG(MSG_CMD_SH_ENTSIZE),
4895088Sab196087 				    EC_XWORD(shdr->sh_entsize),
4905088Sab196087 				    EC_XWORD(sh_entsize));
4915088Sab196087 				ret = ELFEDIT_CMDRET_MOD;
4925088Sab196087 				shdr->sh_entsize = sh_entsize;
4935088Sab196087 			}
4945088Sab196087 		}
4955088Sab196087 		break;
4965088Sab196087 
4975088Sab196087 	case SHDR_CMD_T_SH_FLAGS:
4985088Sab196087 		{
4995088Sab196087 			Conv_sec_flags_buf_t buf1, buf2;
5005088Sab196087 			Word	sh_flags = 0;
5015088Sab196087 			int	i;
5025088Sab196087 
5035088Sab196087 						/* Collect the flag arguments */
5045088Sab196087 			for (i = 1; i < argstate.argc; i++)
5055088Sab196087 				sh_flags |=
5065088Sab196087 				    (Word) elfedit_atoconst(argstate.argv[i],
5075088Sab196087 				    ELFEDIT_CONST_SHF);
5085088Sab196087 
5095088Sab196087 			/* Complement the value? */
5105088Sab196087 			if (argstate.optmask & SHDR_OPT_F_CMP)
5115088Sab196087 				sh_flags = ~sh_flags;
5125088Sab196087 
5135088Sab196087 			/* Perform any requested bit operations */
5145088Sab196087 			if (argstate.optmask & SHDR_OPT_F_AND)
5155088Sab196087 				sh_flags &= shdr->sh_flags;
5165088Sab196087 			else if (argstate.optmask & SHDR_OPT_F_OR)
5175088Sab196087 				sh_flags |= shdr->sh_flags;
5185088Sab196087 
5195088Sab196087 			/* Set the value */
5205088Sab196087 			if (shdr->sh_flags == sh_flags) {
5215088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
5225088Sab196087 				    MSG_INTL(MSG_DEBUG_S_OK),
5235088Sab196087 				    ndx, shdr_sec->sec_name,
5245088Sab196087 				    MSG_ORIG(MSG_CMD_SH_FLAGS),
525*9273SAli.Bahrami@Sun.COM 				    conv_sec_flags(osabi, mach,
526*9273SAli.Bahrami@Sun.COM 				    shdr->sh_flags, 0, &buf1));
5275088Sab196087 			} else {
5285088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
5295088Sab196087 				    MSG_INTL(MSG_DEBUG_S_CHG),
5305088Sab196087 				    ndx, shdr_sec->sec_name,
5315088Sab196087 				    MSG_ORIG(MSG_CMD_SH_FLAGS),
532*9273SAli.Bahrami@Sun.COM 				    conv_sec_flags(osabi, mach,
533*9273SAli.Bahrami@Sun.COM 				    shdr->sh_flags, 0, &buf1),
534*9273SAli.Bahrami@Sun.COM 				    conv_sec_flags(osabi, mach,
535*9273SAli.Bahrami@Sun.COM 				    sh_flags, 0, &buf2));
5365088Sab196087 				ret = ELFEDIT_CMDRET_MOD;
5375088Sab196087 				shdr->sh_flags = sh_flags;
5385088Sab196087 			}
5395088Sab196087 		}
5405088Sab196087 		break;
5415088Sab196087 
5425088Sab196087 	case SHDR_CMD_T_SH_INFO:
5435088Sab196087 		{
5445892Sab196087 			Word sh_info;
5455892Sab196087 
5465892Sab196087 			if (argstate.optmask & SHDR_OPT_F_VALUE_SHNAM)
5475892Sab196087 				sh_info = elfedit_name_to_shndx(obj_state,
5485892Sab196087 				    argstate.argv[1]);
5495892Sab196087 			else if (argstate.optmask & SHDR_OPT_F_VALUE_SHTYP)
5505892Sab196087 				sh_info = elfedit_type_to_shndx(obj_state,
5515892Sab196087 				    elfedit_atoconst(argstate.argv[1],
5525892Sab196087 				    ELFEDIT_CONST_SHT));
5535892Sab196087 			else
5545892Sab196087 				sh_info = elfedit_atoui(argstate.argv[1], NULL);
5555088Sab196087 
5565088Sab196087 			if (shdr->sh_info == sh_info) {
5575088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
5585088Sab196087 				    MSG_INTL(MSG_DEBUG_D_OK),
5595088Sab196087 				    ndx, shdr_sec->sec_name,
5605088Sab196087 				    MSG_ORIG(MSG_CMD_SH_INFO),
5615088Sab196087 				    EC_WORD(shdr->sh_info));
5625088Sab196087 			} else {
5635088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
5645088Sab196087 				    MSG_INTL(MSG_DEBUG_D_CHG),
5655088Sab196087 				    ndx, shdr_sec->sec_name,
5665088Sab196087 				    MSG_ORIG(MSG_CMD_SH_INFO),
5675088Sab196087 				    EC_WORD(shdr->sh_info), EC_WORD(sh_info));
5685088Sab196087 				ret = ELFEDIT_CMDRET_MOD;
5695088Sab196087 				shdr->sh_info = sh_info;
5705088Sab196087 			}
5715088Sab196087 		}
5725088Sab196087 		break;
5735088Sab196087 
5745088Sab196087 	case SHDR_CMD_T_SH_LINK:
5755088Sab196087 		{
5765892Sab196087 			Word sh_link;
5775892Sab196087 
5785892Sab196087 			if (argstate.optmask & SHDR_OPT_F_VALUE_SHNAM)
5795892Sab196087 				sh_link = elfedit_name_to_shndx(obj_state,
5805892Sab196087 				    argstate.argv[1]);
5815892Sab196087 			else if (argstate.optmask & SHDR_OPT_F_VALUE_SHTYP)
5825892Sab196087 				sh_link = elfedit_type_to_shndx(obj_state,
5835892Sab196087 				    elfedit_atoconst(argstate.argv[1],
5845892Sab196087 				    ELFEDIT_CONST_SHT));
5855892Sab196087 			else
5865892Sab196087 				sh_link = elfedit_atoui(argstate.argv[1], NULL);
5875088Sab196087 
5885088Sab196087 			if (shdr->sh_link == sh_link) {
5895088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
5905088Sab196087 				    MSG_INTL(MSG_DEBUG_D_OK),
5915088Sab196087 				    ndx, shdr_sec->sec_name,
5925088Sab196087 				    MSG_ORIG(MSG_CMD_SH_LINK),
5935088Sab196087 				    EC_WORD(shdr->sh_link));
5945088Sab196087 			} else {
5955088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
5965088Sab196087 				    MSG_INTL(MSG_DEBUG_D_CHG),
5975088Sab196087 				    ndx, shdr_sec->sec_name,
5985088Sab196087 				    MSG_ORIG(MSG_CMD_SH_LINK),
5995088Sab196087 				    EC_WORD(shdr->sh_link), EC_WORD(sh_link));
6005088Sab196087 				ret = ELFEDIT_CMDRET_MOD;
6015088Sab196087 				shdr->sh_link = sh_link;
6025088Sab196087 			}
6035088Sab196087 		}
6045088Sab196087 		break;
6055088Sab196087 
6065088Sab196087 	case SHDR_CMD_T_SH_NAME:
6075088Sab196087 		{
6085088Sab196087 			elfedit_section_t *shstr_sec =
6095088Sab196087 			    &obj_state->os_secarr[obj_state->os_shstrndx];
6105088Sab196087 			Word sh_name;
6115088Sab196087 
6125088Sab196087 			/*
6135088Sab196087 			 * If -name_offset was specified, this is an offset
6145088Sab196087 			 * into the string table. Otherwise it is a string
6155088Sab196087 			 * we need to turn into an offset.
6165088Sab196087 			 */
6175088Sab196087 			sh_name = (argstate.optmask & SHDR_OPT_F_NAMOFFSET) ?
6185088Sab196087 			    elfedit_atoui(argstate.argv[1], NULL) :
6195088Sab196087 			    elfedit_strtab_insert(obj_state,
6205088Sab196087 			    shstr_sec, NULL, argstate.argv[1]);
6215088Sab196087 			if (shdr->sh_name == sh_name) {
6225088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
6235088Sab196087 				    MSG_INTL(MSG_DEBUG_D_OK),
6245088Sab196087 				    ndx, shdr_sec->sec_name,
6255088Sab196087 				    MSG_ORIG(MSG_CMD_SH_NAME),
6265088Sab196087 				    EC_WORD(shdr->sh_name));
6275088Sab196087 			} else {
6285088Sab196087 				/*
6295088Sab196087 				 * The section name is cached, so we must
6305088Sab196087 				 * also update that value. This call will
6315088Sab196087 				 * warn if the offset is out of range, and
6325088Sab196087 				 * will supply a safe string in that case.
6335088Sab196087 				 */
6345088Sab196087 				shdr_sec->sec_name =
6355088Sab196087 				    elfedit_offset_to_str(shstr_sec,
6365088Sab196087 				    sh_name, ELFEDIT_MSG_DEBUG, 1);
6375088Sab196087 
6385088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
6395088Sab196087 				    MSG_INTL(MSG_DEBUG_D_CHG),
6405088Sab196087 				    ndx, shdr_sec->sec_name,
6415088Sab196087 				    MSG_ORIG(MSG_CMD_SH_NAME),
6425088Sab196087 				    EC_WORD(shdr->sh_name), EC_WORD(sh_name));
6435088Sab196087 				ret = ELFEDIT_CMDRET_MOD;
6445088Sab196087 				shdr->sh_name = sh_name;
6455088Sab196087 			}
6465088Sab196087 		}
6475088Sab196087 		break;
6485088Sab196087 
6495088Sab196087 	case SHDR_CMD_T_SH_OFFSET:
6505088Sab196087 		{
6515088Sab196087 			Off sh_offset;
6525088Sab196087 
6535088Sab196087 			sh_offset = elfedit_atoui(argstate.argv[1], NULL);
6545088Sab196087 			if (shdr->sh_offset == sh_offset) {
6555088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
6565088Sab196087 				    MSG_INTL(MSG_DEBUG_LLX_OK),
6575088Sab196087 				    ndx, shdr_sec->sec_name,
6585088Sab196087 				    MSG_ORIG(MSG_CMD_SH_OFFSET),
6595088Sab196087 				    EC_XWORD(shdr->sh_offset));
6605088Sab196087 			} else {
6615088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
6625088Sab196087 				    MSG_INTL(MSG_DEBUG_LLX_CHG),
6635088Sab196087 				    ndx, shdr_sec->sec_name,
6645088Sab196087 				    MSG_ORIG(MSG_CMD_SH_OFFSET),
6655088Sab196087 				    EC_XWORD(shdr->sh_offset),
6665088Sab196087 				    EC_XWORD(sh_offset));
6675088Sab196087 				ret = ELFEDIT_CMDRET_MOD;
6685088Sab196087 				shdr->sh_offset = sh_offset;
6695088Sab196087 			}
6705088Sab196087 		}
6715088Sab196087 		break;
6725088Sab196087 
6735088Sab196087 	case SHDR_CMD_T_SH_SIZE:
6745088Sab196087 		{
6755088Sab196087 			Xword sh_size;
6765088Sab196087 
6775088Sab196087 			sh_size = elfedit_atoui(argstate.argv[1], NULL);
6785088Sab196087 			if (shdr->sh_size == sh_size) {
6795088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
6805088Sab196087 				    MSG_INTL(MSG_DEBUG_LLX_OK),
6815088Sab196087 				    ndx, shdr_sec->sec_name,
6825088Sab196087 				    MSG_ORIG(MSG_CMD_SH_SIZE),
6835088Sab196087 				    EC_XWORD(shdr->sh_size));
6845088Sab196087 			} else {
6855088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
6865088Sab196087 				    MSG_INTL(MSG_DEBUG_LLX_CHG),
6875088Sab196087 				    ndx, shdr_sec->sec_name,
6885088Sab196087 				    MSG_ORIG(MSG_CMD_SH_SIZE),
6895088Sab196087 				    EC_XWORD(shdr->sh_size),
6905088Sab196087 				    EC_XWORD(sh_size));
6915088Sab196087 				ret = ELFEDIT_CMDRET_MOD;
6925088Sab196087 				shdr->sh_size = sh_size;
6935088Sab196087 			}
6945088Sab196087 		}
6955088Sab196087 		break;
6965088Sab196087 
6975088Sab196087 	case SHDR_CMD_T_SH_TYPE:
6985088Sab196087 		{
6995088Sab196087 			Word sh_type = elfedit_atoconst(argstate.argv[1],
7005088Sab196087 			    ELFEDIT_CONST_SHT);
7015088Sab196087 			Conv_inv_buf_t inv_buf1, inv_buf2;
7025088Sab196087 
7035088Sab196087 			if (shdr->sh_type == sh_type) {
7045088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
7055088Sab196087 				    MSG_INTL(MSG_DEBUG_S_OK),
7065088Sab196087 				    ndx, shdr_sec->sec_name,
7075088Sab196087 				    MSG_ORIG(MSG_CMD_SH_TYPE),
708*9273SAli.Bahrami@Sun.COM 				    conv_sec_type(osabi, mach, shdr->sh_type,
7095088Sab196087 				    0, &inv_buf1));
7105088Sab196087 			} else {
7115088Sab196087 				elfedit_msg(ELFEDIT_MSG_DEBUG,
7125088Sab196087 				    MSG_INTL(MSG_DEBUG_S_CHG),
7135088Sab196087 				    ndx, shdr_sec->sec_name,
7145088Sab196087 				    MSG_ORIG(MSG_CMD_SH_TYPE),
715*9273SAli.Bahrami@Sun.COM 				    conv_sec_type(osabi, mach, shdr->sh_type,
716*9273SAli.Bahrami@Sun.COM 				    0, &inv_buf1),
717*9273SAli.Bahrami@Sun.COM 				    conv_sec_type(osabi, mach, sh_type,
718*9273SAli.Bahrami@Sun.COM 				    0, &inv_buf2));
7195088Sab196087 				ret = ELFEDIT_CMDRET_MOD;
7205088Sab196087 				shdr->sh_type = sh_type;
7215088Sab196087 			}
7225088Sab196087 		}
7235088Sab196087 		break;
7245088Sab196087 	}
7255088Sab196087 
7265088Sab196087 	/*
7275088Sab196087 	 * If we modified the section header array, tell libelf.
7285088Sab196087 	 */
7295088Sab196087 	if (ret == ELFEDIT_CMDRET_MOD)
7305088Sab196087 		elfedit_modified_shdr(shdr_sec);
7315088Sab196087 
7325088Sab196087 	/* Do autoprint */
733*9273SAli.Bahrami@Sun.COM 	print_shdr(cmd, 1, &argstate, ndx, 1, PRINT_SHDR_ALL);
7345088Sab196087 
7355088Sab196087 	return (ret);
7365088Sab196087 }
7375088Sab196087 
7385088Sab196087 
7395088Sab196087 
7405088Sab196087 
7415088Sab196087 /*
7425088Sab196087  * Command completion functions for the various commands
7435088Sab196087  */
7445088Sab196087 
7455088Sab196087 /*
7465088Sab196087  * All of the commands accept the same first argument (sec) that
7475088Sab196087  * specifies the section. This argument can be a section name
7485088Sab196087  * (default), section index, or section type, depending on the
7495088Sab196087  * options used. This routine determines which case is current,
7505088Sab196087  * and then supplies completion for the first argument.
7515088Sab196087  */
7525088Sab196087 static void
cpl_1starg_sec(elfedit_obj_state_t * obj_state,void * cpldata,int argc,const char * argv[],int num_opt)7535088Sab196087 cpl_1starg_sec(elfedit_obj_state_t *obj_state, void *cpldata, int argc,
7545088Sab196087     const char *argv[], int num_opt)
7555088Sab196087 {
7565088Sab196087 	elfedit_section_t *sec;
7575088Sab196087 	enum { NAME, INDEX, TYPE } op;
7585088Sab196087 	Word ndx;
7595088Sab196087 
7605088Sab196087 	if (argc != (num_opt + 1))
7615088Sab196087 		return;
7625088Sab196087 
7635088Sab196087 	op = NAME;
7645088Sab196087 	for (ndx = 0; ndx < num_opt; ndx++) {
7655088Sab196087 		if (strcmp(argv[ndx], MSG_ORIG(MSG_STR_MINUS_SHNDX)) == 0)
7665088Sab196087 			op = INDEX;
7675088Sab196087 		else if (strcmp(argv[ndx], MSG_ORIG(MSG_STR_MINUS_SHTYP)) == 0)
7685088Sab196087 			op = TYPE;
7695088Sab196087 	}
7705088Sab196087 
7715088Sab196087 	switch (op) {
7725088Sab196087 	case NAME:
7735088Sab196087 		if (obj_state == NULL)
7745088Sab196087 			break;
7755088Sab196087 		sec = obj_state->os_secarr;
7765088Sab196087 		for (ndx = 0; ndx < obj_state->os_shnum; ndx++, sec++)
7775088Sab196087 			elfedit_cpl_match(cpldata, sec->sec_name, 0);
7785088Sab196087 		break;
7795088Sab196087 
7805088Sab196087 	case INDEX:
7815088Sab196087 		elfedit_cpl_atoconst(cpldata, ELFEDIT_CONST_SHN);
7825088Sab196087 		break;
7835088Sab196087 
7845088Sab196087 	case TYPE:
7855088Sab196087 		elfedit_cpl_atoconst(cpldata, ELFEDIT_CONST_SHT);
7865088Sab196087 		break;
7875088Sab196087 	}
7885088Sab196087 }
7895088Sab196087 
7905088Sab196087 
7915088Sab196087 /*ARGSUSED*/
7925088Sab196087 static void
cpl_sh_flags(elfedit_obj_state_t * obj_state,void * cpldata,int argc,const char * argv[],int num_opt)7935088Sab196087 cpl_sh_flags(elfedit_obj_state_t *obj_state, void *cpldata, int argc,
7945088Sab196087     const char *argv[], int num_opt)
7955088Sab196087 {
7965088Sab196087 	/* Handle -shXXX options */
7975088Sab196087 	cpl_1starg_sec(obj_state, cpldata, argc, argv, num_opt);
7985088Sab196087 
7995088Sab196087 	/* The second and following arguments can be an SHF_ value */
8005088Sab196087 	if (argc >= (num_opt + 2))
8015088Sab196087 		elfedit_cpl_atoconst(cpldata, ELFEDIT_CONST_SHF);
8025088Sab196087 }
8035088Sab196087 
8045892Sab196087 /*
8055892Sab196087  * For shdr:sh_info and shdr:sh_link: The value argument can be an
8065892Sab196087  * integer, section name, or section type.
8075892Sab196087  */
8085892Sab196087 /*ARGSUSED*/
8095892Sab196087 static void
cpl_sh_infolink(elfedit_obj_state_t * obj_state,void * cpldata,int argc,const char * argv[],int num_opt)8105892Sab196087 cpl_sh_infolink(elfedit_obj_state_t *obj_state, void *cpldata, int argc,
8115892Sab196087     const char *argv[], int num_opt)
8125892Sab196087 {
8135892Sab196087 	elfedit_section_t *sec;
8145892Sab196087 	enum { NAME, INTVAL, TYPE } op;
8155892Sab196087 	Word ndx;
8165892Sab196087 
8175892Sab196087 	/* Handle -shXXX options */
8185892Sab196087 	cpl_1starg_sec(obj_state, cpldata, argc, argv, num_opt);
8195892Sab196087 
8205892Sab196087 	if (argc != (num_opt + 2))
8215892Sab196087 		return;
8225892Sab196087 
8235892Sab196087 	op = INTVAL;
8245892Sab196087 	for (ndx = 0; ndx < num_opt; ndx++) {
8255892Sab196087 		if (strcmp(argv[ndx], MSG_ORIG(MSG_STR_MINUS_VALUE_SHNAM)) == 0)
8265892Sab196087 			op = NAME;
8275892Sab196087 		else if (strcmp(argv[ndx],
8285892Sab196087 		    MSG_ORIG(MSG_STR_MINUS_VALUE_SHTYP)) == 0)
8295892Sab196087 			op = TYPE;
8305892Sab196087 	}
8315892Sab196087 
8325892Sab196087 	switch (op) {
8335892Sab196087 	case NAME:
8345892Sab196087 		if (obj_state == NULL)
8355892Sab196087 			break;
8365892Sab196087 		sec = obj_state->os_secarr;
8375892Sab196087 		for (ndx = 0; ndx < obj_state->os_shnum; ndx++, sec++)
8385892Sab196087 			elfedit_cpl_match(cpldata, sec->sec_name, 0);
8395892Sab196087 		break;
8405892Sab196087 
8415892Sab196087 	case TYPE:
8425892Sab196087 		elfedit_cpl_atoconst(cpldata, ELFEDIT_CONST_SHT);
8435892Sab196087 		break;
8445892Sab196087 	}
8455892Sab196087 }
8465892Sab196087 
8475088Sab196087 /*ARGSUSED*/
8485088Sab196087 static void
cpl_sh_type(elfedit_obj_state_t * obj_state,void * cpldata,int argc,const char * argv[],int num_opt)8495088Sab196087 cpl_sh_type(elfedit_obj_state_t *obj_state, void *cpldata, int argc,
8505088Sab196087     const char *argv[], int num_opt)
8515088Sab196087 {
8525088Sab196087 	/* Handle -shXXX options */
8535088Sab196087 	cpl_1starg_sec(obj_state, cpldata, argc, argv, num_opt);
8545088Sab196087 
8555088Sab196087 	/* The second argument can be an SHT_ value */
8565088Sab196087 	if (argc == (num_opt + 2))
8575088Sab196087 		elfedit_cpl_atoconst(cpldata, ELFEDIT_CONST_SHT);
8585088Sab196087 }
8595088Sab196087 
8605088Sab196087 
8615088Sab196087 
8625088Sab196087 /*
8635088Sab196087  * Implementation functions for the commands
8645088Sab196087  */
8655088Sab196087 static elfedit_cmdret_t
cmd_dump(elfedit_obj_state_t * obj_state,int argc,const char * argv[])8665088Sab196087 cmd_dump(elfedit_obj_state_t *obj_state, int argc, const char *argv[])
8675088Sab196087 {
8685088Sab196087 	return (cmd_body(SHDR_CMD_T_DUMP, obj_state, argc, argv));
8695088Sab196087 }
8705088Sab196087 
8715088Sab196087 
8725088Sab196087 static elfedit_cmdret_t
cmd_sh_addr(elfedit_obj_state_t * obj_state,int argc,const char * argv[])8735088Sab196087 cmd_sh_addr(elfedit_obj_state_t *obj_state, int argc, const char *argv[])
8745088Sab196087 {
8755088Sab196087 	return (cmd_body(SHDR_CMD_T_SH_ADDR, obj_state, argc, argv));
8765088Sab196087 }
8775088Sab196087 
8785088Sab196087 
8795088Sab196087 static elfedit_cmdret_t
cmd_sh_addralign(elfedit_obj_state_t * obj_state,int argc,const char * argv[])8805088Sab196087 cmd_sh_addralign(elfedit_obj_state_t *obj_state, int argc, const char *argv[])
8815088Sab196087 {
8825088Sab196087 	return (cmd_body(SHDR_CMD_T_SH_ADDRALIGN, obj_state, argc, argv));
8835088Sab196087 }
8845088Sab196087 
8855088Sab196087 
8865088Sab196087 static elfedit_cmdret_t
cmd_sh_entsize(elfedit_obj_state_t * obj_state,int argc,const char * argv[])8875088Sab196087 cmd_sh_entsize(elfedit_obj_state_t *obj_state, int argc, const char *argv[])
8885088Sab196087 {
8895088Sab196087 	return (cmd_body(SHDR_CMD_T_SH_ENTSIZE, obj_state, argc, argv));
8905088Sab196087 }
8915088Sab196087 
8925088Sab196087 static elfedit_cmdret_t
cmd_sh_flags(elfedit_obj_state_t * obj_state,int argc,const char * argv[])8935088Sab196087 cmd_sh_flags(elfedit_obj_state_t *obj_state, int argc, const char *argv[])
8945088Sab196087 {
8955088Sab196087 	return (cmd_body(SHDR_CMD_T_SH_FLAGS, obj_state, argc, argv));
8965088Sab196087 }
8975088Sab196087 
8985088Sab196087 static elfedit_cmdret_t
cmd_sh_info(elfedit_obj_state_t * obj_state,int argc,const char * argv[])8995088Sab196087 cmd_sh_info(elfedit_obj_state_t *obj_state, int argc, const char *argv[])
9005088Sab196087 {
9015088Sab196087 	return (cmd_body(SHDR_CMD_T_SH_INFO, obj_state, argc, argv));
9025088Sab196087 }
9035088Sab196087 
9045088Sab196087 static elfedit_cmdret_t
cmd_sh_link(elfedit_obj_state_t * obj_state,int argc,const char * argv[])9055088Sab196087 cmd_sh_link(elfedit_obj_state_t *obj_state, int argc, const char *argv[])
9065088Sab196087 {
9075088Sab196087 	return (cmd_body(SHDR_CMD_T_SH_LINK, obj_state, argc, argv));
9085088Sab196087 }
9095088Sab196087 
9105088Sab196087 static elfedit_cmdret_t
cmd_sh_name(elfedit_obj_state_t * obj_state,int argc,const char * argv[])9115088Sab196087 cmd_sh_name(elfedit_obj_state_t *obj_state, int argc, const char *argv[])
9125088Sab196087 {
9135088Sab196087 	return (cmd_body(SHDR_CMD_T_SH_NAME, obj_state, argc, argv));
9145088Sab196087 }
9155088Sab196087 
9165088Sab196087 static elfedit_cmdret_t
cmd_sh_offset(elfedit_obj_state_t * obj_state,int argc,const char * argv[])9175088Sab196087 cmd_sh_offset(elfedit_obj_state_t *obj_state, int argc, const char *argv[])
9185088Sab196087 {
9195088Sab196087 	return (cmd_body(SHDR_CMD_T_SH_OFFSET, obj_state, argc, argv));
9205088Sab196087 }
9215088Sab196087 
9225088Sab196087 static elfedit_cmdret_t
cmd_sh_size(elfedit_obj_state_t * obj_state,int argc,const char * argv[])9235088Sab196087 cmd_sh_size(elfedit_obj_state_t *obj_state, int argc, const char *argv[])
9245088Sab196087 {
9255088Sab196087 	return (cmd_body(SHDR_CMD_T_SH_SIZE, obj_state, argc, argv));
9265088Sab196087 }
9275088Sab196087 
9285088Sab196087 static elfedit_cmdret_t
cmd_sh_type(elfedit_obj_state_t * obj_state,int argc,const char * argv[])9295088Sab196087 cmd_sh_type(elfedit_obj_state_t *obj_state, int argc, const char *argv[])
9305088Sab196087 {
9315088Sab196087 	return (cmd_body(SHDR_CMD_T_SH_TYPE, obj_state, argc, argv));
9325088Sab196087 }
9335088Sab196087 
9345088Sab196087 
9355088Sab196087 
9365088Sab196087 /*ARGSUSED*/
9375088Sab196087 elfedit_module_t *
elfedit_init(elfedit_module_version_t version)9385088Sab196087 elfedit_init(elfedit_module_version_t version)
9395088Sab196087 {
9405088Sab196087 	/* Multiple commands accept only the standard set of options */
9415088Sab196087 	static elfedit_cmd_optarg_t opt_std[] = {
9425088Sab196087 		{ ELFEDIT_STDOA_OPT_O, NULL,
9435088Sab196087 		    ELFEDIT_CMDOA_F_INHERIT, 0, 0 },
9445088Sab196087 		{ MSG_ORIG(MSG_STR_MINUS_SHNDX),
9455088Sab196087 		    /* MSG_INTL(MSG_OPTDESC_SHNDX) */
9465088Sab196087 		    ELFEDIT_I18NHDL(MSG_OPTDESC_SHNDX), 0,
9475088Sab196087 		    SHDR_OPT_F_SHNDX, SHDR_OPT_F_SHTYP },
9485088Sab196087 		{ MSG_ORIG(MSG_STR_MINUS_SHTYP),
9495088Sab196087 		    /* MSG_INTL(MSG_OPTDESC_SHTYP) */
9505088Sab196087 		    ELFEDIT_I18NHDL(MSG_OPTDESC_SHTYP), 0,
9515088Sab196087 		    SHDR_OPT_F_SHTYP, SHDR_OPT_F_SHNDX },
9525088Sab196087 		{ NULL }
9535088Sab196087 	};
9545088Sab196087 
9555892Sab196087 	/*
9565892Sab196087 	 * sh_info and sh_link accept the standard options above,
9575892Sab196087 	 * plus -value_shnam and -value_shtyp.
9585892Sab196087 	 */
9595892Sab196087 	static elfedit_cmd_optarg_t opt_infolink[] = {
9605892Sab196087 		{ ELFEDIT_STDOA_OPT_O, NULL,
9615892Sab196087 		    ELFEDIT_CMDOA_F_INHERIT, 0, 0 },
9625892Sab196087 		{ MSG_ORIG(MSG_STR_MINUS_SHNDX),
9635892Sab196087 		    /* MSG_INTL(MSG_OPTDESC_SHNDX) */
9645892Sab196087 		    ELFEDIT_I18NHDL(MSG_OPTDESC_SHNDX), 0,
9655892Sab196087 		    SHDR_OPT_F_SHNDX, SHDR_OPT_F_SHTYP },
9665892Sab196087 		{ MSG_ORIG(MSG_STR_MINUS_SHTYP),
9675892Sab196087 		    /* MSG_INTL(MSG_OPTDESC_SHTYP) */
9685892Sab196087 		    ELFEDIT_I18NHDL(MSG_OPTDESC_SHTYP), 0,
9695892Sab196087 		    SHDR_OPT_F_SHTYP, SHDR_OPT_F_SHNDX },
9705892Sab196087 		{ MSG_ORIG(MSG_STR_MINUS_VALUE_SHNAM),
9715892Sab196087 		    /* MSG_INTL(MSG_OPTDESC_VALUE_SHNAM) */
9725892Sab196087 		    ELFEDIT_I18NHDL(MSG_OPTDESC_VALUE_SHNAM), 0,
9735892Sab196087 		    SHDR_OPT_F_VALUE_SHNAM, SHDR_OPT_F_VALUE_SHNAM },
9745892Sab196087 		{ MSG_ORIG(MSG_STR_MINUS_VALUE_SHTYP),
9755892Sab196087 		    /* MSG_INTL(MSG_OPTDESC_VALUE_SHTYP) */
9765892Sab196087 		    ELFEDIT_I18NHDL(MSG_OPTDESC_VALUE_SHTYP), 0,
9775892Sab196087 		    SHDR_OPT_F_VALUE_SHTYP, SHDR_OPT_F_VALUE_SHTYP },
9785892Sab196087 		{ NULL }
9795892Sab196087 	};
9805892Sab196087 
9815088Sab196087 	/* shdr:sh_addr */
9825088Sab196087 	static const char *name_sh_addr[] = {
9835088Sab196087 	    MSG_ORIG(MSG_CMD_SH_ADDR), NULL };
9845088Sab196087 	static elfedit_cmd_optarg_t arg_sh_addr[] = {
9855088Sab196087 		{ MSG_ORIG(MSG_STR_SEC),
9865088Sab196087 		    /* MSG_INTL(MSG_A1_SEC) */
9875088Sab196087 		    ELFEDIT_I18NHDL(MSG_A1_SEC),
9885088Sab196087 		    ELFEDIT_CMDOA_F_OPT },
9895088Sab196087 		{ MSG_ORIG(MSG_STR_VALUE),
9905088Sab196087 		    /* MSG_INTL(MSG_A2_DESC_SH_ADDR) */
9915088Sab196087 		    ELFEDIT_I18NHDL(MSG_A2_DESC_SH_ADDR),
9925088Sab196087 		    ELFEDIT_CMDOA_F_OPT },
9935088Sab196087 		{ NULL }
9945088Sab196087 	};
9955088Sab196087 
9965088Sab196087 	/* shdr:dump */
9975088Sab196087 	static const char *name_dump[] = {
9985088Sab196087 	    MSG_ORIG(MSG_CMD_DUMP),
9995088Sab196087 	    MSG_ORIG(MSG_STR_EMPTY),	/* "" makes this the default command */
10005088Sab196087 	    NULL
10015088Sab196087 	};
10025088Sab196087 	static elfedit_cmd_optarg_t opt_dump[] = {
10035088Sab196087 		{ MSG_ORIG(MSG_STR_MINUS_SHNDX),
10045088Sab196087 		    /* MSG_INTL(MSG_OPTDESC_SHNDX) */
10055088Sab196087 		    ELFEDIT_I18NHDL(MSG_OPTDESC_SHNDX), 0,
10065088Sab196087 		    SHDR_OPT_F_SHNDX, SHDR_OPT_F_SHTYP },
10075088Sab196087 		{ MSG_ORIG(MSG_STR_MINUS_SHTYP),
10085088Sab196087 		    /* MSG_INTL(MSG_OPTDESC_SHTYP) */
10095088Sab196087 		    ELFEDIT_I18NHDL(MSG_OPTDESC_SHTYP), 0,
10105088Sab196087 		    SHDR_OPT_F_SHTYP, SHDR_OPT_F_SHNDX },
10115088Sab196087 		{ NULL }
10125088Sab196087 	};
10135088Sab196087 	static elfedit_cmd_optarg_t arg_dump[] = {
10145088Sab196087 		{ MSG_ORIG(MSG_STR_SEC),
10155088Sab196087 		    /* MSG_INTL(MSG_A1_SEC) */
10165088Sab196087 		    ELFEDIT_I18NHDL(MSG_A1_SEC),
10175088Sab196087 		    ELFEDIT_CMDOA_F_OPT },
10185088Sab196087 		{ NULL }
10195088Sab196087 	};
10205088Sab196087 
10215088Sab196087 	/* shdr:sh_addralign */
10225088Sab196087 	static const char *name_sh_addralign[] = {
10235088Sab196087 	    MSG_ORIG(MSG_CMD_SH_ADDRALIGN), NULL };
10245088Sab196087 	static elfedit_cmd_optarg_t arg_sh_addralign[] = {
10255088Sab196087 		{ MSG_ORIG(MSG_STR_SEC),
10265088Sab196087 		    /* MSG_INTL(MSG_A1_SEC) */
10275088Sab196087 		    ELFEDIT_I18NHDL(MSG_A1_SEC),
10285088Sab196087 		    ELFEDIT_CMDOA_F_OPT },
10295088Sab196087 		{ MSG_ORIG(MSG_STR_VALUE),
10305088Sab196087 		    /* MSG_INTL(MSG_A2_DESC_SH_ADDRALIGN) */
10315088Sab196087 		    ELFEDIT_I18NHDL(MSG_A2_DESC_SH_ADDRALIGN),
10325088Sab196087 		    ELFEDIT_CMDOA_F_OPT },
10335088Sab196087 		{ NULL }
10345088Sab196087 	};
10355088Sab196087 
10365088Sab196087 	/* shdr:sh_entsize */
10375088Sab196087 	static const char *name_sh_entsize[] = {
10385088Sab196087 	    MSG_ORIG(MSG_CMD_SH_ENTSIZE), NULL };
10395088Sab196087 	static elfedit_cmd_optarg_t arg_sh_entsize[] = {
10405088Sab196087 		{ MSG_ORIG(MSG_STR_SEC),
10415088Sab196087 		    /* MSG_INTL(MSG_A1_SEC) */
10425088Sab196087 		    ELFEDIT_I18NHDL(MSG_A1_SEC),
10435088Sab196087 		    ELFEDIT_CMDOA_F_OPT },
10445088Sab196087 		{ MSG_ORIG(MSG_STR_VALUE),
10455088Sab196087 		    /* MSG_INTL(MSG_A2_DESC_SH_ENTSIZE) */
10465088Sab196087 		    ELFEDIT_I18NHDL(MSG_A2_DESC_SH_ENTSIZE),
10475088Sab196087 		    ELFEDIT_CMDOA_F_OPT },
10485088Sab196087 		{ NULL }
10495088Sab196087 	};
10505088Sab196087 
10515088Sab196087 	/* shdr:sh_flags */
10525088Sab196087 	static const char *name_sh_flags[] = {
10535088Sab196087 	    MSG_ORIG(MSG_CMD_SH_FLAGS), NULL };
10545088Sab196087 	static elfedit_cmd_optarg_t opt_sh_flags[] = {
10555088Sab196087 		{ ELFEDIT_STDOA_OPT_AND, NULL,
10565088Sab196087 		    ELFEDIT_CMDOA_F_INHERIT, SHDR_OPT_F_AND, SHDR_OPT_F_OR },
10575088Sab196087 		{ ELFEDIT_STDOA_OPT_CMP, NULL,
10585088Sab196087 		    ELFEDIT_CMDOA_F_INHERIT, SHDR_OPT_F_CMP, 0 },
10595088Sab196087 		{ ELFEDIT_STDOA_OPT_O, NULL,
10605088Sab196087 		    ELFEDIT_CMDOA_F_INHERIT, 0, 0 },
10615088Sab196087 		{ ELFEDIT_STDOA_OPT_OR, NULL,
10625088Sab196087 		    ELFEDIT_CMDOA_F_INHERIT, SHDR_OPT_F_OR, SHDR_OPT_F_AND },
10635088Sab196087 		{ MSG_ORIG(MSG_STR_MINUS_SHNDX),
10645088Sab196087 		    /* MSG_INTL(MSG_OPTDESC_SHNDX) */
10655088Sab196087 		    ELFEDIT_I18NHDL(MSG_OPTDESC_SHNDX), 0,
10665088Sab196087 		    SHDR_OPT_F_SHNDX, SHDR_OPT_F_SHTYP },
10675088Sab196087 		{ MSG_ORIG(MSG_STR_MINUS_SHTYP),
10685088Sab196087 		    /* MSG_INTL(MSG_OPTDESC_SHTYP) */
10695088Sab196087 		    ELFEDIT_I18NHDL(MSG_OPTDESC_SHTYP), 0,
10705088Sab196087 		    SHDR_OPT_F_SHTYP, SHDR_OPT_F_SHNDX },
10715088Sab196087 		{ NULL }
10725088Sab196087 	};
10735088Sab196087 	static elfedit_cmd_optarg_t arg_sh_flags[] = {
10745088Sab196087 		{ MSG_ORIG(MSG_STR_SEC),
10755088Sab196087 		    /* MSG_INTL(MSG_A1_SEC) */
10765088Sab196087 		    ELFEDIT_I18NHDL(MSG_A1_SEC),
10775088Sab196087 		    ELFEDIT_CMDOA_F_OPT },
10785088Sab196087 		{ MSG_ORIG(MSG_STR_VALUE),
10795088Sab196087 		    /* MSG_INTL(MSG_A2_DESC_SH_FLAGS) */
10805088Sab196087 		    ELFEDIT_I18NHDL(MSG_A2_DESC_SH_FLAGS),
10815088Sab196087 		    ELFEDIT_CMDOA_F_OPT | ELFEDIT_CMDOA_F_MULT },
10825088Sab196087 		{ NULL }
10835088Sab196087 	};
10845088Sab196087 
10855088Sab196087 	/* shdr:sh_info */
10865088Sab196087 	static const char *name_sh_info[] = {
10875088Sab196087 	    MSG_ORIG(MSG_CMD_SH_INFO), NULL };
10885088Sab196087 	static elfedit_cmd_optarg_t arg_sh_info[] = {
10895088Sab196087 		{ MSG_ORIG(MSG_STR_SEC),
10905088Sab196087 		    /* MSG_INTL(MSG_A1_SEC) */
10915088Sab196087 		    ELFEDIT_I18NHDL(MSG_A1_SEC),
10925088Sab196087 		    ELFEDIT_CMDOA_F_OPT },
10935088Sab196087 		{ MSG_ORIG(MSG_STR_VALUE),
10945088Sab196087 		    /* MSG_INTL(MSG_A2_DESC_SH_INFO) */
10955088Sab196087 		    ELFEDIT_I18NHDL(MSG_A2_DESC_SH_INFO),
10965088Sab196087 		    ELFEDIT_CMDOA_F_OPT },
10975088Sab196087 		{ NULL }
10985088Sab196087 	};
10995088Sab196087 
11005088Sab196087 	/* shdr:sh_link */
11015088Sab196087 	static const char *name_sh_link[] = {
11025088Sab196087 	    MSG_ORIG(MSG_CMD_SH_LINK), NULL };
11035088Sab196087 	static elfedit_cmd_optarg_t arg_sh_link[] = {
11045088Sab196087 		{ MSG_ORIG(MSG_STR_SEC),
11055088Sab196087 		    /* MSG_INTL(MSG_A1_SEC) */
11065088Sab196087 		    ELFEDIT_I18NHDL(MSG_A1_SEC),
11075088Sab196087 		    ELFEDIT_CMDOA_F_OPT },
11085088Sab196087 		{ MSG_ORIG(MSG_STR_VALUE),
11095088Sab196087 		    /* MSG_INTL(MSG_A2_DESC_SH_LINK) */
11105088Sab196087 		    ELFEDIT_I18NHDL(MSG_A2_DESC_SH_LINK),
11115088Sab196087 		    ELFEDIT_CMDOA_F_OPT },
11125088Sab196087 		{ NULL }
11135088Sab196087 	};
11145088Sab196087 
11155088Sab196087 	/* shdr:sh_name */
11165088Sab196087 	static const char *name_sh_name[] = {
11175088Sab196087 	    MSG_ORIG(MSG_CMD_SH_NAME), NULL };
11185088Sab196087 	static elfedit_cmd_optarg_t opt_sh_name[] = {
11195088Sab196087 		{ MSG_ORIG(MSG_STR_MINUS_NAME_OFFSET),
11205088Sab196087 		    /* MSG_INTL(MSG_OPTDESC_NAME_OFFSET) */
11215088Sab196087 		    ELFEDIT_I18NHDL(MSG_OPTDESC_NAME_OFFSET), 0,
11225088Sab196087 		    SHDR_OPT_F_NAMOFFSET, 0 },
11235088Sab196087 		{ ELFEDIT_STDOA_OPT_O, NULL,
11245088Sab196087 		    ELFEDIT_CMDOA_F_INHERIT, 0, 0 },
11255088Sab196087 		{ MSG_ORIG(MSG_STR_MINUS_SHNDX),
11265088Sab196087 		    /* MSG_INTL(MSG_OPTDESC_SHNDX) */
11275088Sab196087 		    ELFEDIT_I18NHDL(MSG_OPTDESC_SHNDX), 0,
11285088Sab196087 		    SHDR_OPT_F_SHNDX, SHDR_OPT_F_SHTYP },
11295088Sab196087 		{ MSG_ORIG(MSG_STR_MINUS_SHTYP),
11305088Sab196087 		    /* MSG_INTL(MSG_OPTDESC_SHTYP) */
11315088Sab196087 		    ELFEDIT_I18NHDL(MSG_OPTDESC_SHTYP), 0,
11325088Sab196087 		    SHDR_OPT_F_SHTYP, SHDR_OPT_F_SHNDX },
11335088Sab196087 		{ NULL }
11345088Sab196087 	};
11355088Sab196087 	static elfedit_cmd_optarg_t arg_sh_name[] = {
11365088Sab196087 		{ MSG_ORIG(MSG_STR_SEC),
11375088Sab196087 		    /* MSG_INTL(MSG_A1_SEC) */
11385088Sab196087 		    ELFEDIT_I18NHDL(MSG_A1_SEC),
11395088Sab196087 		    ELFEDIT_CMDOA_F_OPT },
11405088Sab196087 		{ MSG_ORIG(MSG_STR_NAME),
11415088Sab196087 		    /* MSG_INTL(MSG_A2_DESC_SH_NAME) */
11425088Sab196087 		    ELFEDIT_I18NHDL(MSG_A2_DESC_SH_NAME),
11435088Sab196087 		    ELFEDIT_CMDOA_F_OPT },
11445088Sab196087 		{ NULL }
11455088Sab196087 	};
11465088Sab196087 
11475088Sab196087 	/* shdr:sh_offset */
11485088Sab196087 	static const char *name_sh_offset[] = {
11495088Sab196087 	    MSG_ORIG(MSG_CMD_SH_OFFSET), NULL };
11505088Sab196087 	static elfedit_cmd_optarg_t arg_sh_offset[] = {
11515088Sab196087 		{ MSG_ORIG(MSG_STR_SEC),
11525088Sab196087 		    /* MSG_INTL(MSG_A1_SEC) */
11535088Sab196087 		    ELFEDIT_I18NHDL(MSG_A1_SEC),
11545088Sab196087 		    ELFEDIT_CMDOA_F_OPT },
11555088Sab196087 		{ MSG_ORIG(MSG_STR_VALUE),
11565088Sab196087 		    /* MSG_INTL(MSG_A2_DESC_SH_OFFSET) */
11575088Sab196087 		    ELFEDIT_I18NHDL(MSG_A2_DESC_SH_OFFSET),
11585088Sab196087 		    ELFEDIT_CMDOA_F_OPT },
11595088Sab196087 		{ NULL }
11605088Sab196087 	};
11615088Sab196087 
11625088Sab196087 	/* shdr:sh_size */
11635088Sab196087 	static const char *name_sh_size[] = {
11645088Sab196087 	    MSG_ORIG(MSG_CMD_SH_SIZE), NULL };
11655088Sab196087 	static elfedit_cmd_optarg_t arg_sh_size[] = {
11665088Sab196087 		{ MSG_ORIG(MSG_STR_SEC),
11675088Sab196087 		    /* MSG_INTL(MSG_A1_SEC) */
11685088Sab196087 		    ELFEDIT_I18NHDL(MSG_A1_SEC),
11695088Sab196087 		    ELFEDIT_CMDOA_F_OPT },
11705088Sab196087 		{ MSG_ORIG(MSG_STR_VALUE),
11715088Sab196087 		    /* MSG_INTL(MSG_A2_DESC_SH_SIZE) */
11725088Sab196087 		    ELFEDIT_I18NHDL(MSG_A2_DESC_SH_SIZE),
11735088Sab196087 		    ELFEDIT_CMDOA_F_OPT },
11745088Sab196087 		{ NULL }
11755088Sab196087 	};
11765088Sab196087 
11775088Sab196087 	/* shdr:sh_type */
11785088Sab196087 	static const char *name_sh_type[] = {
11795088Sab196087 	    MSG_ORIG(MSG_CMD_SH_TYPE), NULL };
11805088Sab196087 	static elfedit_cmd_optarg_t arg_sh_type[] = {
11815088Sab196087 		{ MSG_ORIG(MSG_STR_SEC),
11825088Sab196087 		    /* MSG_INTL(MSG_A1_SEC) */
11835088Sab196087 		    ELFEDIT_I18NHDL(MSG_A1_SEC),
11845088Sab196087 		    ELFEDIT_CMDOA_F_OPT },
11855088Sab196087 		{ MSG_ORIG(MSG_STR_VALUE),
11865088Sab196087 		    /* MSG_INTL(MSG_A2_DESC_SH_TYPE) */
11875088Sab196087 		    ELFEDIT_I18NHDL(MSG_A2_DESC_SH_TYPE),
11885088Sab196087 		    ELFEDIT_CMDOA_F_OPT },
11895088Sab196087 		{ NULL }
11905088Sab196087 	};
11915088Sab196087 
11925088Sab196087 	static elfedit_cmd_t cmds[] = {
11935088Sab196087 		/* shdr:dump */
11945088Sab196087 		{ cmd_dump, cpl_1starg_sec, name_dump,
11955088Sab196087 		    /* MSG_INTL(MSG_DESC_DUMP) */
11965088Sab196087 		    ELFEDIT_I18NHDL(MSG_DESC_DUMP),
11975088Sab196087 		    /* MSG_INTL(MSG_HELP_DUMP) */
11985088Sab196087 		    ELFEDIT_I18NHDL(MSG_HELP_DUMP),
11995088Sab196087 		    opt_dump, arg_dump },
12005088Sab196087 
12015088Sab196087 		/* shdr:sh_addr */
12025088Sab196087 		{ cmd_sh_addr, cpl_1starg_sec, name_sh_addr,
12035088Sab196087 		    /* MSG_INTL(MSG_DESC_SH_ADDR) */
12045088Sab196087 		    ELFEDIT_I18NHDL(MSG_DESC_SH_ADDR),
12055088Sab196087 		    /* MSG_INTL(MSG_HELP_SH_ADDR) */
12065088Sab196087 		    ELFEDIT_I18NHDL(MSG_HELP_SH_ADDR),
12075088Sab196087 		    opt_std, arg_sh_addr },
12085088Sab196087 
12095088Sab196087 		/* shdr:sh_addralign */
12105088Sab196087 		{ cmd_sh_addralign, cpl_1starg_sec, name_sh_addralign,
12115088Sab196087 		    /* MSG_INTL(MSG_DESC_SH_ADDRALIGN) */
12125088Sab196087 		    ELFEDIT_I18NHDL(MSG_DESC_SH_ADDRALIGN),
12135088Sab196087 		    /* MSG_INTL(MSG_HELP_SH_ADDRALIGN) */
12145088Sab196087 		    ELFEDIT_I18NHDL(MSG_HELP_SH_ADDRALIGN),
12155088Sab196087 		    opt_std, arg_sh_addralign },
12165088Sab196087 
12175088Sab196087 		/* shdr:sh_entsize */
12185088Sab196087 		{ cmd_sh_entsize, cpl_1starg_sec, name_sh_entsize,
12195088Sab196087 		    /* MSG_INTL(MSG_DESC_SH_ENTSIZE) */
12205088Sab196087 		    ELFEDIT_I18NHDL(MSG_DESC_SH_ENTSIZE),
12215088Sab196087 		    /* MSG_INTL(MSG_HELP_SH_ENTSIZE) */
12225088Sab196087 		    ELFEDIT_I18NHDL(MSG_HELP_SH_ENTSIZE),
12235088Sab196087 		    opt_std, arg_sh_entsize },
12245088Sab196087 
12255088Sab196087 		/* shdr:sh_flags */
12265088Sab196087 		{ cmd_sh_flags, cpl_sh_flags, name_sh_flags,
12275088Sab196087 		    /* MSG_INTL(MSG_DESC_SH_FLAGS) */
12285088Sab196087 		    ELFEDIT_I18NHDL(MSG_DESC_SH_FLAGS),
12295088Sab196087 		    /* MSG_INTL(MSG_HELP_SH_FLAGS) */
12305088Sab196087 		    ELFEDIT_I18NHDL(MSG_HELP_SH_FLAGS),
12315088Sab196087 		    opt_sh_flags, arg_sh_flags },
12325088Sab196087 
12335088Sab196087 		/* shdr:sh_info */
12345892Sab196087 		{ cmd_sh_info, cpl_sh_infolink, name_sh_info,
12355088Sab196087 		    /* MSG_INTL(MSG_DESC_SH_INFO) */
12365088Sab196087 		    ELFEDIT_I18NHDL(MSG_DESC_SH_INFO),
12375088Sab196087 		    /* MSG_INTL(MSG_HELP_SH_INFO) */
12385088Sab196087 		    ELFEDIT_I18NHDL(MSG_HELP_SH_INFO),
12395892Sab196087 		    opt_infolink, arg_sh_info },
12405088Sab196087 
12415088Sab196087 		/* shdr:sh_link */
12425892Sab196087 		{ cmd_sh_link, cpl_sh_infolink, name_sh_link,
12435088Sab196087 		    /* MSG_INTL(MSG_DESC_SH_LINK) */
12445088Sab196087 		    ELFEDIT_I18NHDL(MSG_DESC_SH_LINK),
12455088Sab196087 		    /* MSG_INTL(MSG_HELP_SH_LINK) */
12465088Sab196087 		    ELFEDIT_I18NHDL(MSG_HELP_SH_LINK),
12475892Sab196087 		    opt_infolink, arg_sh_link },
12485088Sab196087 
12495088Sab196087 		/* shdr:sh_name */
12505088Sab196087 		{ cmd_sh_name, cpl_1starg_sec, name_sh_name,
12515088Sab196087 		    /* MSG_INTL(MSG_DESC_SH_NAME) */
12525088Sab196087 		    ELFEDIT_I18NHDL(MSG_DESC_SH_NAME),
12535088Sab196087 		    /* MSG_INTL(MSG_HELP_SH_NAME) */
12545088Sab196087 		    ELFEDIT_I18NHDL(MSG_HELP_SH_NAME),
12555088Sab196087 		    opt_sh_name, arg_sh_name },
12565088Sab196087 
12575088Sab196087 		/* shdr:sh_offset */
12585088Sab196087 		{ cmd_sh_offset, cpl_1starg_sec, name_sh_offset,
12595088Sab196087 		    /* MSG_INTL(MSG_DESC_SH_OFFSET) */
12605088Sab196087 		    ELFEDIT_I18NHDL(MSG_DESC_SH_OFFSET),
12615088Sab196087 		    /* MSG_INTL(MSG_HELP_SH_OFFSET) */
12625088Sab196087 		    ELFEDIT_I18NHDL(MSG_HELP_SH_OFFSET),
12635088Sab196087 		    opt_std, arg_sh_offset },
12645088Sab196087 
12655088Sab196087 		/* shdr:sh_size */
12665088Sab196087 		{ cmd_sh_size, cpl_1starg_sec, name_sh_size,
12675088Sab196087 		    /* MSG_INTL(MSG_DESC_SH_SIZE) */
12685088Sab196087 		    ELFEDIT_I18NHDL(MSG_DESC_SH_SIZE),
12695088Sab196087 		    /* MSG_INTL(MSG_HELP_SH_SIZE) */
12705088Sab196087 		    ELFEDIT_I18NHDL(MSG_HELP_SH_SIZE),
12715088Sab196087 		    opt_std, arg_sh_size },
12725088Sab196087 
12735088Sab196087 		/* shdr:sh_type */
12745088Sab196087 		{ cmd_sh_type, cpl_sh_type, name_sh_type,
12755088Sab196087 		    /* MSG_INTL(MSG_DESC_SH_TYPE) */
12765088Sab196087 		    ELFEDIT_I18NHDL(MSG_DESC_SH_TYPE),
12775088Sab196087 		    /* MSG_INTL(MSG_HELP_SH_TYPE) */
12785088Sab196087 		    ELFEDIT_I18NHDL(MSG_HELP_SH_TYPE),
12795088Sab196087 		    opt_std, arg_sh_type },
12805088Sab196087 
12815088Sab196087 		{ NULL }
12825088Sab196087 	};
12835088Sab196087 
12845088Sab196087 	static elfedit_module_t module = {
12855088Sab196087 	    ELFEDIT_VER_CURRENT, MSG_ORIG(MSG_MOD_NAME),
12865088Sab196087 	    /* MSG_INTL(MSG_MOD_DESC) */
12875088Sab196087 	    ELFEDIT_I18NHDL(MSG_MOD_DESC),
12885088Sab196087 	    cmds, mod_i18nhdl_to_str };
12895088Sab196087 
12905088Sab196087 	return (&module);
12915088Sab196087 }
1292