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