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