#include <stdio.h>
#include <ctype.h>
#include <elfedit.h>
#include <sys/elf_SPARC.h>
#include <sys/elf_amd64.h>
#include <strings.h>
#include <conv.h>
#include <debug.h>
#include <ehdr_msg.h>
typedef enum {
EHDR_CMD_T_DUMP = 0,
EHDR_CMD_T_E_IDENT = 1,
EHDR_CMD_T_E_TYPE = 2,
EHDR_CMD_T_E_MACHINE = 3,
EHDR_CMD_T_E_VERSION = 4,
EHDR_CMD_T_E_ENTRY = 5,
EHDR_CMD_T_E_PHOFF = 6,
EHDR_CMD_T_E_SHOFF = 7,
EHDR_CMD_T_E_FLAGS = 8,
EHDR_CMD_T_E_EHSIZE = 9,
EHDR_CMD_T_E_PHENTSIZE = 10,
EHDR_CMD_T_E_PHNUM = 11,
EHDR_CMD_T_E_SHENTSIZE = 12,
EHDR_CMD_T_E_SHNUM = 13,
EHDR_CMD_T_E_SHSTRNDX = 14,
EHDR_CMD_T_EI_MAG0 = 15,
EHDR_CMD_T_EI_MAG1 = 16,
EHDR_CMD_T_EI_MAG2 = 17,
EHDR_CMD_T_EI_MAG3 = 18,
EHDR_CMD_T_EI_CLASS = 19,
EHDR_CMD_T_EI_DATA = 20,
EHDR_CMD_T_EI_VERSION = 21,
EHDR_CMD_T_EI_OSABI = 22,
EHDR_CMD_T_EI_ABIVERSION = 23
} EHDR_CMD_T;
#ifndef _ELF64
const char *
_ehdr_msg(Msg mid)
{
return (gettext(MSG_ORIG(mid)));
}
#endif
static const char *
mod_i18nhdl_to_str(elfedit_i18nhdl_t hdl)
{
Msg msg = (Msg)hdl;
return (MSG_INTL(msg));
}
typedef enum {
EHDR_OPT_F_AND = 1,
EHDR_OPT_F_CMP = 2,
EHDR_OPT_F_OR = 4,
EHDR_OPT_F_SHNDX = 8,
EHDR_OPT_F_SHTYP = 16
} ehdr_opt_t;
typedef struct {
elfedit_obj_state_t *obj_state;
ehdr_opt_t optmask;
int argc;
const char **argv;
} ARGSTATE;
static void
process_args(elfedit_obj_state_t *obj_state, int argc, const char *argv[],
ARGSTATE *argstate)
{
elfedit_getopt_state_t getopt_state;
elfedit_getopt_ret_t *getopt_ret;
bzero(argstate, sizeof (*argstate));
argstate->obj_state = obj_state;
elfedit_getopt_init(&getopt_state, &argc, &argv);
while ((getopt_ret = elfedit_getopt(&getopt_state)) != NULL)
argstate->optmask |= getopt_ret->gor_idmask;
if (argc == 0)
elfedit_pager_init();
argstate->argc = argc;
argstate->argv = argv;
}
static const char *
conv_magic_value(int value)
{
static char buf1[20];
static char buf2[20];
static char *buf;
buf = (buf == buf1) ? buf2 : buf1;
if (isprint(value))
(void) snprintf(buf, sizeof (buf1),
MSG_ORIG(MSG_FMT_HEXNUM_QCHR), value, value);
else
(void) snprintf(buf, sizeof (buf1),
MSG_ORIG(MSG_FMT_HEXNUM), value);
return (buf);
}
static void
print_ehdr(EHDR_CMD_T cmd, int e_ident_ndx, int autoprint,
ARGSTATE *argstate)
{
elfedit_outstyle_t outstyle;
Conv_fmt_flags_t flags_fmt_flags = 0;
Ehdr *ehdr;
int c;
Conv_inv_buf_t inv_buf;
if (autoprint && ((elfedit_flags() & ELFEDIT_F_AUTOPRINT) == 0))
return;
if (cmd == EHDR_CMD_T_DUMP) {
outstyle = ELFEDIT_OUTSTYLE_DEFAULT;
} else {
outstyle = elfedit_outstyle();
if (outstyle == ELFEDIT_OUTSTYLE_SIMPLE)
flags_fmt_flags = CONV_FMT_NOBKT;
if ((outstyle == ELFEDIT_OUTSTYLE_DEFAULT) &&
((cmd != EHDR_CMD_T_E_IDENT) || (e_ident_ndx != -1)))
outstyle = ELFEDIT_OUTSTYLE_SIMPLE;
}
ehdr = argstate->obj_state->os_ehdr;
if (outstyle == ELFEDIT_OUTSTYLE_DEFAULT) {
const char *ndx, *value;
char ndx_buf[64], value_buf[20];
int i;
if (cmd == EHDR_CMD_T_DUMP) {
Elf_ehdr(NULL, ehdr,
argstate->obj_state->os_secarr[0].sec_shdr);
elfedit_printf(MSG_ORIG(MSG_STR_NL));
}
elfedit_printf(MSG_ORIG(MSG_STR_EIDENT_HDR));
for (i = 0; i < EI_NIDENT; i++) {
ndx = value = NULL;
switch (i) {
case EI_MAG0:
case EI_MAG1:
case EI_MAG2:
case EI_MAG3:
ndx = elfedit_atoconst_value_to_str(
ELFEDIT_CONST_EI, i, 1);
value = conv_magic_value(ehdr->e_ident[i]);
break;
case EI_CLASS:
ndx = elfedit_atoconst_value_to_str(
ELFEDIT_CONST_EI, EI_CLASS, 1);
value = conv_ehdr_class(ehdr->e_ident[EI_CLASS],
0, &inv_buf);
break;
case EI_DATA:
ndx = elfedit_atoconst_value_to_str(
ELFEDIT_CONST_EI, EI_DATA, 1);
value = conv_ehdr_data(ehdr->e_ident[EI_DATA],
0, &inv_buf);
break;
case EI_VERSION:
ndx = elfedit_atoconst_value_to_str(
ELFEDIT_CONST_EI, EI_VERSION, 1);
value = conv_ehdr_vers(
ehdr->e_ident[EI_VERSION], 0, &inv_buf);
break;
case EI_OSABI:
ndx = elfedit_atoconst_value_to_str(
ELFEDIT_CONST_EI, EI_OSABI, 1);
value = conv_ehdr_osabi(ehdr->e_ident[EI_OSABI],
0, &inv_buf);
break;
case EI_ABIVERSION:
ndx = elfedit_atoconst_value_to_str(
ELFEDIT_CONST_EI, EI_ABIVERSION, 1);
value = conv_ehdr_abivers(
ehdr->e_ident[EI_OSABI],
ehdr->e_ident[EI_ABIVERSION],
CONV_FMT_DECIMAL, &inv_buf);
break;
default:
value = value_buf;
(void) snprintf(value_buf, sizeof (value_buf),
MSG_ORIG(MSG_FMT_HEXNUM), ehdr->e_ident[i]);
break;
}
if (ndx == NULL)
(void) snprintf(ndx_buf, sizeof (ndx_buf),
MSG_ORIG(MSG_FMT_BKTINT), i);
else
(void) snprintf(ndx_buf, sizeof (ndx_buf),
MSG_ORIG(MSG_FMT_BKTSTR), ndx);
elfedit_printf(MSG_ORIG(MSG_FMT_EI_ELT),
ndx_buf, value);
}
return;
}
switch (cmd) {
case EHDR_CMD_T_E_IDENT:
{
int i, cnt;
if (e_ident_ndx == -1) {
i = 0;
cnt = EI_NIDENT;
} else {
i = e_ident_ndx;
cnt = 1;
}
for (; cnt-- > 0; i++) {
if ((outstyle == ELFEDIT_OUTSTYLE_NUM) ||
(i > EI_ABIVERSION)) {
elfedit_printf(
MSG_ORIG(MSG_FMT_HEXNUMNL),
ehdr->e_ident[i]);
continue;
}
switch (i) {
case EI_MAG0:
case EI_MAG1:
case EI_MAG2:
case EI_MAG3:
elfedit_printf(MSG_ORIG(MSG_FMT_STRNL),
conv_magic_value(ehdr->e_ident[i]));
continue;
case EI_CLASS:
elfedit_printf(MSG_ORIG(MSG_FMT_STRNL),
conv_ehdr_class(
ehdr->e_ident[EI_CLASS], 0,
&inv_buf));
continue;
case EI_DATA:
elfedit_printf(MSG_ORIG(MSG_FMT_STRNL),
conv_ehdr_data(
ehdr->e_ident[EI_DATA], 0,
&inv_buf));
continue;
case EI_VERSION:
elfedit_printf(MSG_ORIG(MSG_FMT_STRNL),
conv_ehdr_vers(
ehdr->e_ident[EI_VERSION], 0,
&inv_buf));
continue;
case EI_OSABI:
elfedit_printf(MSG_ORIG(MSG_FMT_STRNL),
conv_ehdr_osabi(
ehdr->e_ident[EI_OSABI], 0,
&inv_buf));
continue;
case EI_ABIVERSION:
elfedit_printf(MSG_ORIG(MSG_FMT_STRNL),
conv_ehdr_abivers(
ehdr->e_ident[EI_OSABI],
ehdr->e_ident[EI_ABIVERSION],
CONV_FMT_DECIMAL, &inv_buf));
continue;
}
}
}
return;
case EHDR_CMD_T_E_TYPE:
if (outstyle == ELFEDIT_OUTSTYLE_SIMPLE)
elfedit_printf(MSG_ORIG(MSG_FMT_STRNL),
conv_ehdr_type(ehdr->e_ident[EI_OSABI],
ehdr->e_type, 0, &inv_buf));
else
elfedit_printf(MSG_ORIG(MSG_FMT_DECNUMNL),
ehdr->e_type);
return;
case EHDR_CMD_T_E_MACHINE:
if (outstyle == ELFEDIT_OUTSTYLE_SIMPLE) {
elfedit_printf(MSG_ORIG(MSG_FMT_STRNL),
conv_ehdr_mach(ehdr->e_machine, 0, &inv_buf));
} else {
elfedit_printf(MSG_ORIG(MSG_FMT_DECNUMNL),
EC_WORD(ehdr->e_machine));
}
return;
case EHDR_CMD_T_E_VERSION:
if (outstyle == ELFEDIT_OUTSTYLE_SIMPLE)
elfedit_printf(MSG_ORIG(MSG_FMT_STRNL),
conv_ehdr_vers(ehdr->e_version, 0, &inv_buf));
else
elfedit_printf(MSG_ORIG(MSG_FMT_DECNUMNL),
ehdr->e_version);
return;
case EHDR_CMD_T_E_ENTRY:
elfedit_printf(MSG_ORIG(MSG_FMT_HEXNUMNL),
EC_WORD(ehdr->e_entry));
return;
case EHDR_CMD_T_E_PHOFF:
elfedit_printf(MSG_ORIG(MSG_FMT_HEXNUMNL),
EC_WORD(ehdr->e_phoff));
return;
case EHDR_CMD_T_E_SHOFF:
elfedit_printf(MSG_ORIG(MSG_FMT_HEXNUMNL),
EC_WORD(ehdr->e_shoff));
return;
case EHDR_CMD_T_E_FLAGS:
if (outstyle == ELFEDIT_OUTSTYLE_SIMPLE) {
Conv_ehdr_flags_buf_t flags_buf;
elfedit_printf(MSG_ORIG(MSG_FMT_STRNL),
conv_ehdr_flags(ehdr->e_machine, ehdr->e_flags,
flags_fmt_flags, &flags_buf));
} else {
elfedit_printf(MSG_ORIG(MSG_FMT_HEXNUMNL),
ehdr->e_flags);
}
return;
case EHDR_CMD_T_E_EHSIZE:
elfedit_printf(MSG_ORIG(MSG_FMT_DECNUMNL),
EC_WORD(ehdr->e_ehsize));
return;
case EHDR_CMD_T_E_PHENTSIZE:
elfedit_printf(MSG_ORIG(MSG_FMT_DECNUMNL),
EC_WORD(ehdr->e_phentsize));
return;
case EHDR_CMD_T_E_PHNUM:
{
Word num = ehdr->e_phnum;
if (num == PN_XNUM)
num = argstate->obj_state->
os_secarr[0].sec_shdr->sh_info;
elfedit_printf(MSG_ORIG(MSG_FMT_DECNUMNL),
EC_WORD(num));
}
return;
case EHDR_CMD_T_E_SHENTSIZE:
elfedit_printf(MSG_ORIG(MSG_FMT_DECNUMNL),
EC_WORD(ehdr->e_shentsize));
return;
case EHDR_CMD_T_E_SHNUM:
{
Word num = ehdr->e_shnum;
if (num == 0)
num = argstate->obj_state->
os_secarr[0].sec_shdr->sh_size;
elfedit_printf(MSG_ORIG(MSG_FMT_DECNUMNL),
EC_WORD(num));
}
return;
case EHDR_CMD_T_E_SHSTRNDX:
{
Word num = ehdr->e_shstrndx;
if (num == SHN_XINDEX)
num = argstate->obj_state->
os_secarr[0].sec_shdr->sh_link;
elfedit_printf(MSG_ORIG(MSG_FMT_DECNUMNL),
EC_WORD(num));
}
return;
case EHDR_CMD_T_EI_MAG0:
case EHDR_CMD_T_EI_MAG1:
case EHDR_CMD_T_EI_MAG2:
case EHDR_CMD_T_EI_MAG3:
c = ehdr->e_ident[cmd - EHDR_CMD_T_EI_MAG0];
if (outstyle == ELFEDIT_OUTSTYLE_SIMPLE)
elfedit_printf(MSG_ORIG(MSG_FMT_STRNL),
conv_magic_value(c));
else
elfedit_printf(MSG_ORIG(MSG_FMT_HEXNUMNL), c);
return;
case EHDR_CMD_T_EI_CLASS:
c = ehdr->e_ident[EI_CLASS];
if (outstyle == ELFEDIT_OUTSTYLE_SIMPLE)
elfedit_printf(MSG_ORIG(MSG_FMT_STRNL),
conv_ehdr_class(c, 0, &inv_buf));
else
elfedit_printf(MSG_ORIG(MSG_FMT_HEXNUMNL), c);
return;
case EHDR_CMD_T_EI_DATA:
c = ehdr->e_ident[EI_DATA];
if (outstyle == ELFEDIT_OUTSTYLE_SIMPLE)
elfedit_printf(MSG_ORIG(MSG_FMT_STRNL),
conv_ehdr_data(c, 0, &inv_buf));
else
elfedit_printf(MSG_ORIG(MSG_FMT_HEXNUMNL), c);
return;
case EHDR_CMD_T_EI_VERSION:
c = ehdr->e_ident[EI_VERSION];
if (outstyle == ELFEDIT_OUTSTYLE_SIMPLE)
elfedit_printf(MSG_ORIG(MSG_FMT_STRNL),
conv_ehdr_vers(c, 0, &inv_buf));
else
elfedit_printf(MSG_ORIG(MSG_FMT_HEXNUMNL), c);
return;
case EHDR_CMD_T_EI_OSABI:
c = ehdr->e_ident[EI_OSABI];
if (outstyle == ELFEDIT_OUTSTYLE_SIMPLE) {
elfedit_printf(MSG_ORIG(MSG_FMT_STRNL),
conv_ehdr_osabi(c, 0, &inv_buf));
} else {
elfedit_printf(MSG_ORIG(MSG_FMT_HEXNUMNL),
EC_WORD(c));
}
return;
case EHDR_CMD_T_EI_ABIVERSION:
c = ehdr->e_ident[EI_ABIVERSION];
if (outstyle == ELFEDIT_OUTSTYLE_SIMPLE) {
elfedit_printf(MSG_ORIG(MSG_FMT_STRNL),
conv_ehdr_abivers(ehdr->e_ident[EI_OSABI],
c, CONV_FMT_DECIMAL, &inv_buf));
} else {
elfedit_printf(MSG_ORIG(MSG_FMT_HEXNUMNL),
EC_WORD(c));
}
return;
}
}
static elfedit_cmdret_t
cmd_body(EHDR_CMD_T cmd, elfedit_obj_state_t *obj_state,
int argc, const char *argv[])
{
static const int e_ident_revector[16] = {
EHDR_CMD_T_EI_MAG0,
EHDR_CMD_T_EI_MAG1,
EHDR_CMD_T_EI_MAG2,
EHDR_CMD_T_EI_MAG3,
EHDR_CMD_T_EI_CLASS,
EHDR_CMD_T_EI_DATA,
EHDR_CMD_T_EI_VERSION,
EHDR_CMD_T_EI_OSABI,
EHDR_CMD_T_EI_ABIVERSION,
EHDR_CMD_T_E_IDENT,
EHDR_CMD_T_E_IDENT,
EHDR_CMD_T_E_IDENT,
EHDR_CMD_T_E_IDENT,
EHDR_CMD_T_E_IDENT,
EHDR_CMD_T_E_IDENT,
EHDR_CMD_T_E_IDENT,
};
ARGSTATE argstate;
Ehdr *ehdr;
elfedit_cmdret_t ret = ELFEDIT_CMDRET_NONE;
int e_ident_ndx = -1;
Conv_inv_buf_t inv_buf1, inv_buf2;
process_args(obj_state, argc, argv, &argstate);
switch (cmd) {
case EHDR_CMD_T_DUMP:
if (argstate.argc > 0)
elfedit_command_usage();
break;
case EHDR_CMD_T_E_IDENT:
if (argstate.argc > 0) {
if (argstate.argc > 2)
elfedit_command_usage();
e_ident_ndx = (int)
elfedit_atoconst_range(argstate.argv[0],
MSG_ORIG(MSG_STR_INDEX), 0, EI_NIDENT - 1,
ELFEDIT_CONST_EI);
argstate.argc--;
argstate.argv++;
cmd = e_ident_revector[e_ident_ndx];
}
break;
case EHDR_CMD_T_E_FLAGS:
break;
default:
if (argstate.argc > 1)
elfedit_command_usage();
break;
}
if (argstate.argc == 0) {
print_ehdr(cmd, e_ident_ndx, 0, &argstate);
return (ELFEDIT_CMDRET_NONE);
}
ehdr = obj_state->os_ehdr;
switch (cmd) {
case EHDR_CMD_T_E_IDENT:
{
uchar_t value = (uchar_t)
elfedit_atoui_range(argstate.argv[0],
MSG_ORIG(MSG_STR_VALUE), 0, 255, NULL);
if (ehdr->e_ident[e_ident_ndx] == value) {
elfedit_msg(ELFEDIT_MSG_DEBUG,
MSG_INTL(MSG_DEBUG_EI_D_X_OK),
e_ident_ndx, EC_WORD(value));
} else {
elfedit_msg(ELFEDIT_MSG_DEBUG,
MSG_INTL(MSG_DEBUG_EI_D_X_CHG),
e_ident_ndx, ehdr->e_ident[e_ident_ndx],
value);
ret = ELFEDIT_CMDRET_MOD;
ehdr->e_ident[e_ident_ndx] = value;
}
}
break;
case EHDR_CMD_T_E_TYPE:
{
Half type = (Half) elfedit_atoconst(argstate.argv[0],
ELFEDIT_CONST_ET);
const char *name = MSG_ORIG(MSG_CMD_E_TYPE);
if (ehdr->e_type == type) {
elfedit_msg(ELFEDIT_MSG_DEBUG,
MSG_INTL(MSG_DEBUG_E_S_OK), name,
conv_ehdr_type(ehdr->e_ident[EI_OSABI],
ehdr->e_type, 0, &inv_buf1));
} else {
elfedit_msg(ELFEDIT_MSG_DEBUG,
MSG_INTL(MSG_DEBUG_E_S_CHG), name,
conv_ehdr_type(ehdr->e_ident[EI_OSABI],
ehdr->e_type, 0, &inv_buf1),
conv_ehdr_type(ehdr->e_ident[EI_OSABI],
type, 0, &inv_buf2));
ret = ELFEDIT_CMDRET_MOD;
ehdr->e_type = type;
}
}
break;
case EHDR_CMD_T_E_MACHINE:
{
Half mach = (Half) elfedit_atoconst(argstate.argv[0],
ELFEDIT_CONST_EM);
const char *name = MSG_ORIG(MSG_CMD_E_MACHINE);
if (ehdr->e_machine == mach) {
elfedit_msg(ELFEDIT_MSG_DEBUG,
MSG_INTL(MSG_DEBUG_E_S_OK), name,
conv_ehdr_mach(ehdr->e_machine, 0,
&inv_buf1));
} else {
elfedit_msg(ELFEDIT_MSG_DEBUG,
MSG_INTL(MSG_DEBUG_E_S_CHG), name,
conv_ehdr_mach(ehdr->e_machine, 0,
&inv_buf1),
conv_ehdr_mach(mach, 0, &inv_buf2));
ret = ELFEDIT_CMDRET_MOD_OS_MACH;
ehdr->e_machine = mach;
}
}
break;
case EHDR_CMD_T_E_VERSION:
{
Word ver = (Word) elfedit_atoconst(argstate.argv[0],
ELFEDIT_CONST_EV);
const char *name = MSG_ORIG(MSG_CMD_E_VERSION);
if (ehdr->e_version == ver) {
elfedit_msg(ELFEDIT_MSG_DEBUG,
MSG_INTL(MSG_DEBUG_E_S_OK), name,
conv_ehdr_vers(ehdr->e_version, 0,
&inv_buf1));
} else {
elfedit_msg(ELFEDIT_MSG_DEBUG,
MSG_INTL(MSG_DEBUG_E_S_CHG), name,
conv_ehdr_vers(ehdr->e_version, 0,
&inv_buf1),
conv_ehdr_vers(ver, 0, &inv_buf2));
ret = ELFEDIT_CMDRET_MOD;
ehdr->e_version = ver;
}
}
break;
case EHDR_CMD_T_E_ENTRY:
{
Addr entry = (Addr)
elfedit_atoui(argstate.argv[0], NULL);
const char *name = MSG_ORIG(MSG_CMD_E_ENTRY);
if (ehdr->e_entry == entry) {
elfedit_msg(ELFEDIT_MSG_DEBUG,
MSG_INTL(MSG_DEBUG_E_LLX_OK), name,
EC_ADDR(ehdr->e_entry));
} else {
elfedit_msg(ELFEDIT_MSG_DEBUG,
MSG_INTL(MSG_DEBUG_E_LLX_CHG), name,
EC_ADDR(ehdr->e_entry), EC_ADDR(entry));
ret = ELFEDIT_CMDRET_MOD;
ehdr->e_entry = entry;
}
}
break;
case EHDR_CMD_T_E_PHOFF:
{
Off off = (Off) elfedit_atoui(argstate.argv[0],
NULL);
const char *name = MSG_ORIG(MSG_CMD_E_PHOFF);
if (ehdr->e_phoff == off) {
elfedit_msg(ELFEDIT_MSG_DEBUG,
MSG_INTL(MSG_DEBUG_E_LLX_OK), name,
EC_OFF(ehdr->e_phoff));
} else {
elfedit_msg(ELFEDIT_MSG_DEBUG,
MSG_INTL(MSG_DEBUG_E_LLX_CHG), name,
EC_OFF(ehdr->e_phoff), EC_OFF(off));
ret = ELFEDIT_CMDRET_MOD;
ehdr->e_phoff = off;
}
}
break;
case EHDR_CMD_T_E_SHOFF:
{
Off off = (Off) elfedit_atoui(argstate.argv[0],
NULL);
const char *name = MSG_ORIG(MSG_CMD_E_SHOFF);
if (ehdr->e_shoff == off) {
elfedit_msg(ELFEDIT_MSG_DEBUG,
MSG_INTL(MSG_DEBUG_E_LLX_OK), name,
EC_OFF(ehdr->e_shoff));
} else {
elfedit_msg(ELFEDIT_MSG_DEBUG,
MSG_INTL(MSG_DEBUG_E_LLX_CHG), name,
EC_OFF(ehdr->e_shoff), EC_OFF(off));
ret = ELFEDIT_CMDRET_MOD;
ehdr->e_shoff = off;
}
}
break;
case EHDR_CMD_T_E_FLAGS:
{
Conv_ehdr_flags_buf_t flags_buf1, flags_buf2;
const char *name = MSG_ORIG(MSG_CMD_E_FLAGS);
Word flags = 0;
int i;
for (i = 0; i < argstate.argc; i++)
flags |= (Word)
elfedit_atoconst(argstate.argv[i],
ELFEDIT_CONST_EF);
if (argstate.optmask & EHDR_OPT_F_CMP)
flags = ~flags;
if (argstate.optmask & EHDR_OPT_F_AND)
flags &= ehdr->e_flags;
else if (argstate.optmask & EHDR_OPT_F_OR)
flags |= ehdr->e_flags;
if (ehdr->e_flags == flags) {
elfedit_msg(ELFEDIT_MSG_DEBUG,
MSG_INTL(MSG_DEBUG_E_S_OK), name,
conv_ehdr_flags(ehdr->e_machine,
ehdr->e_flags, 0, &flags_buf1));
} else {
elfedit_msg(ELFEDIT_MSG_DEBUG,
MSG_INTL(MSG_DEBUG_E_S_CHG), name,
conv_ehdr_flags(ehdr->e_machine,
ehdr->e_flags, 0, &flags_buf1),
conv_ehdr_flags(ehdr->e_machine,
flags, 0, &flags_buf2));
ret = ELFEDIT_CMDRET_MOD;
ehdr->e_flags = flags;
}
}
break;
case EHDR_CMD_T_E_EHSIZE:
{
Half ehsize = (Half) elfedit_atoui(argstate.argv[0],
NULL);
const char *name = MSG_ORIG(MSG_CMD_E_EHSIZE);
if (ehdr->e_ehsize == ehsize) {
elfedit_msg(ELFEDIT_MSG_DEBUG,
MSG_INTL(MSG_DEBUG_E_D_OK), name,
EC_WORD(ehdr->e_ehsize));
} else {
elfedit_msg(ELFEDIT_MSG_DEBUG,
MSG_INTL(MSG_DEBUG_E_D_CHG), name,
EC_WORD(ehdr->e_ehsize), EC_WORD(ehsize));
ret = ELFEDIT_CMDRET_MOD;
ehdr->e_ehsize = ehsize;
}
}
break;
case EHDR_CMD_T_E_PHENTSIZE:
{
Half phentsize = (Half) elfedit_atoui(argstate.argv[0],
NULL);
const char *name = MSG_ORIG(MSG_CMD_E_PHENTSIZE);
if (ehdr->e_phentsize == phentsize) {
elfedit_msg(ELFEDIT_MSG_DEBUG,
MSG_INTL(MSG_DEBUG_E_D_OK), name,
EC_WORD(ehdr->e_phentsize));
} else {
elfedit_msg(ELFEDIT_MSG_DEBUG,
MSG_INTL(MSG_DEBUG_E_D_CHG), name,
EC_WORD(ehdr->e_phentsize),
EC_WORD(phentsize));
ret = ELFEDIT_CMDRET_MOD;
ehdr->e_phentsize = phentsize;
}
}
break;
case EHDR_CMD_T_E_PHNUM:
{
Word phnum = (Word) elfedit_atoui(argstate.argv[0],
NULL);
const char *name = MSG_ORIG(MSG_CMD_E_PHNUM);
elfedit_section_t *sec0 = &obj_state->os_secarr[0];
Shdr *shdr0 = sec0->sec_shdr;
Half e_phnum;
Word sh_info;
if (phnum >= PN_XNUM) {
e_phnum = PN_XNUM;
sh_info = phnum;
} else {
e_phnum = phnum;
sh_info = 0;
}
if (ehdr->e_phnum == e_phnum) {
elfedit_msg(ELFEDIT_MSG_DEBUG,
MSG_INTL(MSG_DEBUG_E_D_OK), name,
EC_WORD(ehdr->e_phnum));
} else {
elfedit_msg(ELFEDIT_MSG_DEBUG,
MSG_INTL(MSG_DEBUG_E_D_CHG), name,
EC_WORD(ehdr->e_phnum), e_phnum);
ret = ELFEDIT_CMDRET_MOD;
ehdr->e_phnum = e_phnum;
}
if (shdr0->sh_info == sh_info) {
elfedit_msg(ELFEDIT_MSG_DEBUG,
MSG_INTL(MSG_DEBUG_SHDR0_D_OK),
MSG_ORIG(MSG_STR_SH_INFO),
EC_WORD(shdr0->sh_info));
} else {
elfedit_msg(ELFEDIT_MSG_DEBUG,
MSG_INTL(MSG_DEBUG_SHDR0_D_CHG),
MSG_ORIG(MSG_STR_SH_INFO),
EC_WORD(shdr0->sh_info), sh_info);
ret = ELFEDIT_CMDRET_MOD;
shdr0->sh_info = sh_info;
elfedit_modified_shdr(sec0);
}
}
break;
case EHDR_CMD_T_E_SHENTSIZE:
{
Half shentsize = (Half) elfedit_atoui(argstate.argv[0],
NULL);
const char *name = MSG_ORIG(MSG_CMD_E_SHENTSIZE);
if (ehdr->e_shentsize == shentsize) {
elfedit_msg(ELFEDIT_MSG_DEBUG,
MSG_INTL(MSG_DEBUG_E_D_OK), name,
EC_WORD(ehdr->e_shentsize));
} else {
elfedit_msg(ELFEDIT_MSG_DEBUG,
MSG_INTL(MSG_DEBUG_E_D_CHG), name,
EC_WORD(ehdr->e_shentsize),
EC_WORD(shentsize));
ret = ELFEDIT_CMDRET_MOD;
ehdr->e_shentsize = shentsize;
}
}
break;
case EHDR_CMD_T_E_SHNUM:
{
Word shnum = (Word) elfedit_atoui(argstate.argv[0],
NULL);
const char *name = MSG_ORIG(MSG_CMD_E_SHNUM);
elfedit_section_t *sec0 = &obj_state->os_secarr[0];
Shdr *shdr0 = sec0->sec_shdr;
Half e_shnum;
Word sh_size;
if (shnum >= SHN_LORESERVE) {
e_shnum = 0;
sh_size = shnum;
} else {
e_shnum = shnum;
sh_size = 0;
}
if (ehdr->e_shnum == e_shnum) {
elfedit_msg(ELFEDIT_MSG_DEBUG,
MSG_INTL(MSG_DEBUG_E_D_OK), name,
EC_WORD(ehdr->e_shnum));
} else {
elfedit_msg(ELFEDIT_MSG_DEBUG,
MSG_INTL(MSG_DEBUG_E_D_CHG), name,
EC_WORD(ehdr->e_shnum), e_shnum);
ret = ELFEDIT_CMDRET_MOD;
ehdr->e_shnum = e_shnum;
}
if (shdr0->sh_size == sh_size) {
elfedit_msg(ELFEDIT_MSG_DEBUG,
MSG_INTL(MSG_DEBUG_SHDR0_D_OK),
MSG_ORIG(MSG_STR_SH_SIZE),
EC_WORD(shdr0->sh_size));
} else {
elfedit_msg(ELFEDIT_MSG_DEBUG,
MSG_INTL(MSG_DEBUG_SHDR0_D_CHG),
MSG_ORIG(MSG_STR_SH_SIZE),
EC_WORD(shdr0->sh_size), sh_size);
ret = ELFEDIT_CMDRET_MOD;
shdr0->sh_size = sh_size;
elfedit_modified_shdr(sec0);
}
}
break;
case EHDR_CMD_T_E_SHSTRNDX:
{
const char *name = MSG_ORIG(MSG_CMD_E_SHSTRNDX);
Word shstrndx;
elfedit_section_t *sec0 = &obj_state->os_secarr[0];
Shdr *shdr0 = sec0->sec_shdr;
Half e_shstrndx;
Word sh_link;
if (argstate.optmask & EHDR_OPT_F_SHNDX)
shstrndx = elfedit_atoshndx(argstate.argv[0],
obj_state->os_shnum);
else if (argstate.optmask & EHDR_OPT_F_SHTYP)
shstrndx = elfedit_type_to_shndx(obj_state,
elfedit_atoconst(argstate.argv[0],
ELFEDIT_CONST_SHT));
else
shstrndx = elfedit_name_to_shndx(obj_state,
argstate.argv[0]);
if ((shstrndx >= obj_state->os_shnum) ||
((shstrndx >= SHN_LORESERVE) &&
(shstrndx <= SHN_HIRESERVE)) ||
(obj_state->os_secarr[shstrndx].sec_shdr->sh_type !=
SHT_STRTAB))
elfedit_msg(ELFEDIT_MSG_DEBUG,
MSG_INTL(MSG_DEBUG_NOTSTRTAB), name,
EC_WORD(shstrndx));
if (shstrndx >= SHN_LORESERVE) {
e_shstrndx = SHN_XINDEX;
sh_link = shstrndx;
} else {
e_shstrndx = shstrndx;
sh_link = 0;
}
if (ehdr->e_shstrndx == e_shstrndx) {
elfedit_msg(ELFEDIT_MSG_DEBUG,
MSG_INTL(MSG_DEBUG_E_D_OK), name,
EC_WORD(ehdr->e_shstrndx));
} else {
elfedit_msg(ELFEDIT_MSG_DEBUG,
MSG_INTL(MSG_DEBUG_E_D_CHG), name,
EC_WORD(ehdr->e_shstrndx), e_shstrndx);
ret = ELFEDIT_CMDRET_MOD;
ehdr->e_shstrndx = e_shstrndx;
}
if (shdr0->sh_link == sh_link) {
elfedit_msg(ELFEDIT_MSG_DEBUG,
MSG_INTL(MSG_DEBUG_SHDR0_D_OK),
MSG_ORIG(MSG_STR_SH_LINK),
EC_WORD(shdr0->sh_link));
} else {
elfedit_msg(ELFEDIT_MSG_DEBUG,
MSG_INTL(MSG_DEBUG_SHDR0_D_CHG),
MSG_ORIG(MSG_STR_SH_LINK),
EC_WORD(shdr0->sh_link), sh_link);
ret = ELFEDIT_CMDRET_MOD;
shdr0->sh_link = sh_link;
elfedit_modified_shdr(sec0);
}
}
break;
case EHDR_CMD_T_EI_MAG0:
case EHDR_CMD_T_EI_MAG1:
case EHDR_CMD_T_EI_MAG2:
case EHDR_CMD_T_EI_MAG3:
{
int ei_ndx = (cmd - EHDR_CMD_T_EI_MAG0) + EI_MAG0;
int mag = (int)elfedit_atoui_range(argstate.argv[0],
MSG_ORIG(MSG_STR_VALUE), 0, 255, NULL);
if (ehdr->e_ident[ei_ndx] == mag) {
elfedit_msg(ELFEDIT_MSG_DEBUG,
MSG_INTL(MSG_DEBUG_EI_S_S_OK),
elfedit_atoconst_value_to_str(
ELFEDIT_CONST_EI, ei_ndx, 1),
conv_magic_value(ehdr->e_ident[ei_ndx]));
} else {
elfedit_msg(ELFEDIT_MSG_DEBUG,
MSG_INTL(MSG_DEBUG_EI_S_S_CHG),
elfedit_atoconst_value_to_str(
ELFEDIT_CONST_EI, ei_ndx, 1),
conv_magic_value(ehdr->e_ident[ei_ndx]),
conv_magic_value(mag));
ret = ELFEDIT_CMDRET_MOD;
ehdr->e_ident[ei_ndx] = mag;
}
}
break;
case EHDR_CMD_T_EI_CLASS:
{
int class = (int)elfedit_atoconst_range(
argstate.argv[0], MSG_ORIG(MSG_STR_VALUE), 0, 255,
ELFEDIT_CONST_ELFCLASS);
const char *name = elfedit_atoconst_value_to_str(
ELFEDIT_CONST_EI, EI_CLASS, 1);
if (ehdr->e_ident[EI_CLASS] == class) {
elfedit_msg(ELFEDIT_MSG_DEBUG,
MSG_INTL(MSG_DEBUG_EI_S_S_OK), name,
conv_ehdr_class(class, 0, &inv_buf1));
} else {
elfedit_msg(ELFEDIT_MSG_DEBUG,
MSG_INTL(MSG_DEBUG_EI_S_S_CHG), name,
conv_ehdr_class(ehdr->e_ident[EI_CLASS],
0, &inv_buf1),
conv_ehdr_class(class, 0, &inv_buf2));
ret = ELFEDIT_CMDRET_MOD;
ehdr->e_ident[EI_CLASS] = class;
}
}
break;
case EHDR_CMD_T_EI_DATA:
{
int data = (int)elfedit_atoconst_range(argstate.argv[0],
MSG_ORIG(MSG_STR_VALUE), 0, 255,
ELFEDIT_CONST_ELFDATA);
const char *name = elfedit_atoconst_value_to_str(
ELFEDIT_CONST_EI, EI_DATA, 1);
if (ehdr->e_ident[EI_DATA] == data) {
elfedit_msg(ELFEDIT_MSG_DEBUG,
MSG_INTL(MSG_DEBUG_EI_S_S_OK), name,
conv_ehdr_data(data, 0, &inv_buf1));
} else {
elfedit_msg(ELFEDIT_MSG_DEBUG,
MSG_INTL(MSG_DEBUG_EI_S_S_CHG), name,
conv_ehdr_data(ehdr->e_ident[EI_DATA],
0, &inv_buf1),
conv_ehdr_data(data, 0, &inv_buf2));
ret = ELFEDIT_CMDRET_MOD;
ehdr->e_ident[EI_DATA] = data;
}
}
break;
case EHDR_CMD_T_EI_VERSION:
{
int ver = (int)elfedit_atoconst_range(argstate.argv[0],
MSG_ORIG(MSG_STR_VALUE), 0, 255, ELFEDIT_CONST_EV);
const char *name = elfedit_atoconst_value_to_str(
ELFEDIT_CONST_EI, EI_VERSION, 1);
if (ehdr->e_ident[EI_VERSION] == ver) {
elfedit_msg(ELFEDIT_MSG_DEBUG,
MSG_INTL(MSG_DEBUG_EI_S_S_OK), name,
conv_ehdr_vers(ver, 0, &inv_buf1));
} else {
elfedit_msg(ELFEDIT_MSG_DEBUG,
MSG_INTL(MSG_DEBUG_EI_S_S_CHG), name,
conv_ehdr_vers(ehdr->e_ident[EI_VERSION],
0, &inv_buf1),
conv_ehdr_vers(ver, 0, &inv_buf2));
ret = ELFEDIT_CMDRET_MOD;
ehdr->e_ident[EI_VERSION] = ver;
}
}
break;
case EHDR_CMD_T_EI_OSABI:
{
int osabi = (int)elfedit_atoconst_range(
argstate.argv[0], MSG_ORIG(MSG_STR_VALUE), 0, 255,
ELFEDIT_CONST_ELFOSABI);
const char *name = elfedit_atoconst_value_to_str(
ELFEDIT_CONST_EI, EI_OSABI, 1);
if (ehdr->e_ident[EI_OSABI] == osabi) {
elfedit_msg(ELFEDIT_MSG_DEBUG,
MSG_INTL(MSG_DEBUG_EI_S_S_OK), name,
conv_ehdr_osabi(osabi, 0, &inv_buf1));
} else {
elfedit_msg(ELFEDIT_MSG_DEBUG,
MSG_INTL(MSG_DEBUG_EI_S_S_CHG), name,
conv_ehdr_osabi(ehdr->e_ident[EI_OSABI],
0, &inv_buf1),
conv_ehdr_osabi(osabi, 0, &inv_buf2));
ret = ELFEDIT_CMDRET_MOD_OS_MACH;
ehdr->e_ident[EI_OSABI] = osabi;
}
}
break;
case EHDR_CMD_T_EI_ABIVERSION:
{
int abiver = (int)elfedit_atoconst_range(
argstate.argv[0], MSG_ORIG(MSG_STR_VALUE), 0, 255,
ELFEDIT_CONST_EAV);
const char *name = elfedit_atoconst_value_to_str(
ELFEDIT_CONST_EI, EI_ABIVERSION, 1);
if (ehdr->e_ident[EI_ABIVERSION] == abiver) {
elfedit_msg(ELFEDIT_MSG_DEBUG,
MSG_INTL(MSG_DEBUG_EI_S_S_OK), name,
conv_ehdr_abivers(ehdr->e_ident[EI_OSABI],
abiver, CONV_FMT_DECIMAL, &inv_buf1));
} else {
elfedit_msg(ELFEDIT_MSG_DEBUG,
MSG_INTL(MSG_DEBUG_EI_S_S_CHG), name,
conv_ehdr_abivers(ehdr->e_ident[EI_OSABI],
ehdr->e_ident[EI_ABIVERSION],
CONV_FMT_DECIMAL, &inv_buf1),
conv_ehdr_abivers(ehdr->e_ident[EI_OSABI],
abiver, CONV_FMT_DECIMAL, &inv_buf2));
ret = ELFEDIT_CMDRET_MOD;
ehdr->e_ident[EI_ABIVERSION] = abiver;
}
}
break;
}
if (ret == ELFEDIT_CMDRET_MOD)
elfedit_modified_ehdr(obj_state);
print_ehdr(cmd, e_ident_ndx, 1, &argstate);
return (ret);
}
static void
cpl_e_ident(elfedit_obj_state_t *obj_state, void *cpldata, int argc,
const char *argv[], int num_opt)
{
elfedit_atoui_t ndx;
argc -= num_opt;
argv += num_opt;
if (argc == 1) {
elfedit_cpl_atoconst(cpldata, ELFEDIT_CONST_EI);
return;
}
if (argc != 2)
return;
if (elfedit_atoconst_range2(argv[0], 0, EI_NIDENT - 1,
ELFEDIT_CONST_EI, &ndx) == 0)
return;
switch (ndx) {
case EI_CLASS:
elfedit_cpl_atoconst(cpldata, ELFEDIT_CONST_ELFCLASS);
break;
case EI_DATA:
elfedit_cpl_atoconst(cpldata, ELFEDIT_CONST_ELFDATA);
break;
case EI_VERSION:
elfedit_cpl_atoconst(cpldata, ELFEDIT_CONST_EV);
break;
case EI_OSABI:
elfedit_cpl_atoconst(cpldata, ELFEDIT_CONST_ELFOSABI);
break;
}
}
static void
cpl_e_type(elfedit_obj_state_t *obj_state, void *cpldata, int argc,
const char *argv[], int num_opt)
{
argc -= num_opt;
argv += num_opt;
if (argc == 1)
elfedit_cpl_atoconst(cpldata, ELFEDIT_CONST_ET);
}
static void
cpl_e_machine(elfedit_obj_state_t *obj_state, void *cpldata, int argc,
const char *argv[], int num_opt)
{
argc -= num_opt;
argv += num_opt;
if (argc == 1)
elfedit_cpl_atoconst(cpldata, ELFEDIT_CONST_EM);
}
static void
cpl_e_version(elfedit_obj_state_t *obj_state, void *cpldata, int argc,
const char *argv[], int num_opt)
{
argc -= num_opt;
argv += num_opt;
if (argc == 1)
elfedit_cpl_atoconst(cpldata, ELFEDIT_CONST_EV);
}
static void
cpl_e_flags(elfedit_obj_state_t *obj_state, void *cpldata, int argc,
const char *argv[], int num_opt)
{
elfedit_cpl_atoconst(cpldata, ELFEDIT_CONST_EF);
}
static void
cpl_e_shstrndx(elfedit_obj_state_t *obj_state, void *cpldata, int argc,
const char *argv[], int num_opt)
{
enum { NAME, INDEX, TYPE } op;
Word ndx;
if (argc != (num_opt + 1))
return;
op = NAME;
for (ndx = 0; ndx < num_opt; ndx++) {
if (strcmp(argv[ndx], MSG_ORIG(MSG_STR_MINUS_SHNDX)) == 0)
op = INDEX;
else if (strcmp(argv[ndx], MSG_ORIG(MSG_STR_MINUS_SHTYP)) == 0)
op = TYPE;
}
if (obj_state == NULL) {
if (op == TYPE)
elfedit_cpl_atoconst(cpldata, ELFEDIT_CONST_SHT);
return;
}
for (ndx = 0; ndx < obj_state->os_shnum; ndx++) {
elfedit_section_t *sec = &obj_state->os_secarr[ndx];
if (sec->sec_shdr->sh_type != SHT_STRTAB)
continue;
switch (op) {
case NAME:
elfedit_cpl_match(cpldata, sec->sec_name, 0);
break;
case INDEX:
elfedit_cpl_ndx(cpldata, ndx);
break;
case TYPE:
elfedit_cpl_atoconst(cpldata, ELFEDIT_CONST_SHT_STRTAB);
break;
}
}
}
static void
cpl_ei_class(elfedit_obj_state_t *obj_state, void *cpldata, int argc,
const char *argv[], int num_opt)
{
argc -= num_opt;
argv += num_opt;
if (argc == 1)
elfedit_cpl_atoconst(cpldata, ELFEDIT_CONST_ELFCLASS);
}
static void
cpl_ei_data(elfedit_obj_state_t *obj_state, void *cpldata, int argc,
const char *argv[], int num_opt)
{
argc -= num_opt;
argv += num_opt;
if (argc == 1)
elfedit_cpl_atoconst(cpldata, ELFEDIT_CONST_ELFDATA);
}
static void
cpl_ei_osabi(elfedit_obj_state_t *obj_state, void *cpldata, int argc,
const char *argv[], int num_opt)
{
argc -= num_opt;
argv += num_opt;
if (argc == 1)
elfedit_cpl_atoconst(cpldata, ELFEDIT_CONST_ELFOSABI);
}
static void
cpl_ei_abiversion(elfedit_obj_state_t *obj_state, void *cpldata, int argc,
const char *argv[], int num_opt)
{
argc -= num_opt;
argv += num_opt;
if (argc == 1)
elfedit_cpl_atoconst(cpldata, ELFEDIT_CONST_EAV);
}
static elfedit_cmdret_t
cmd_dump(elfedit_obj_state_t *obj_state, int argc, const char *argv[])
{
return (cmd_body(EHDR_CMD_T_DUMP, obj_state, argc, argv));
}
static elfedit_cmdret_t
cmd_e_ident(elfedit_obj_state_t *obj_state, int argc, const char *argv[])
{
return (cmd_body(EHDR_CMD_T_E_IDENT, obj_state, argc, argv));
}
static elfedit_cmdret_t
cmd_e_type(elfedit_obj_state_t *obj_state, int argc, const char *argv[])
{
return (cmd_body(EHDR_CMD_T_E_TYPE, obj_state, argc, argv));
}
static elfedit_cmdret_t
cmd_e_machine(elfedit_obj_state_t *obj_state, int argc, const char *argv[])
{
return (cmd_body(EHDR_CMD_T_E_MACHINE, obj_state, argc, argv));
}
static elfedit_cmdret_t
cmd_e_version(elfedit_obj_state_t *obj_state, int argc, const char *argv[])
{
return (cmd_body(EHDR_CMD_T_E_VERSION, obj_state, argc, argv));
}
static elfedit_cmdret_t
cmd_e_entry(elfedit_obj_state_t *obj_state, int argc, const char *argv[])
{
return (cmd_body(EHDR_CMD_T_E_ENTRY, obj_state, argc, argv));
}
static elfedit_cmdret_t
cmd_e_phoff(elfedit_obj_state_t *obj_state, int argc, const char *argv[])
{
return (cmd_body(EHDR_CMD_T_E_PHOFF, obj_state, argc, argv));
}
static elfedit_cmdret_t
cmd_e_shoff(elfedit_obj_state_t *obj_state, int argc, const char *argv[])
{
return (cmd_body(EHDR_CMD_T_E_SHOFF, obj_state, argc, argv));
}
static elfedit_cmdret_t
cmd_e_flags(elfedit_obj_state_t *obj_state, int argc, const char *argv[])
{
return (cmd_body(EHDR_CMD_T_E_FLAGS, obj_state, argc, argv));
}
static elfedit_cmdret_t
cmd_e_ehsize(elfedit_obj_state_t *obj_state, int argc, const char *argv[])
{
return (cmd_body(EHDR_CMD_T_E_EHSIZE, obj_state, argc, argv));
}
static elfedit_cmdret_t
cmd_e_phentsize(elfedit_obj_state_t *obj_state, int argc, const char *argv[])
{
return (cmd_body(EHDR_CMD_T_E_PHENTSIZE, obj_state, argc, argv));
}
static elfedit_cmdret_t
cmd_e_phnum(elfedit_obj_state_t *obj_state, int argc, const char *argv[])
{
return (cmd_body(EHDR_CMD_T_E_PHNUM, obj_state, argc, argv));
}
static elfedit_cmdret_t
cmd_e_shentsize(elfedit_obj_state_t *obj_state, int argc, const char *argv[])
{
return (cmd_body(EHDR_CMD_T_E_SHENTSIZE, obj_state, argc, argv));
}
static elfedit_cmdret_t
cmd_e_shnum(elfedit_obj_state_t *obj_state, int argc, const char *argv[])
{
return (cmd_body(EHDR_CMD_T_E_SHNUM, obj_state, argc, argv));
}
static elfedit_cmdret_t
cmd_e_shstrndx(elfedit_obj_state_t *obj_state, int argc, const char *argv[])
{
return (cmd_body(EHDR_CMD_T_E_SHSTRNDX, obj_state, argc, argv));
}
static elfedit_cmdret_t
cmd_ei_mag0(elfedit_obj_state_t *obj_state, int argc, const char *argv[])
{
return (cmd_body(EHDR_CMD_T_EI_MAG0, obj_state, argc, argv));
}
static elfedit_cmdret_t
cmd_ei_mag1(elfedit_obj_state_t *obj_state, int argc, const char *argv[])
{
return (cmd_body(EHDR_CMD_T_EI_MAG1, obj_state, argc, argv));
}
static elfedit_cmdret_t
cmd_ei_mag2(elfedit_obj_state_t *obj_state, int argc, const char *argv[])
{
return (cmd_body(EHDR_CMD_T_EI_MAG2, obj_state, argc, argv));
}
static elfedit_cmdret_t
cmd_ei_mag3(elfedit_obj_state_t *obj_state, int argc, const char *argv[])
{
return (cmd_body(EHDR_CMD_T_EI_MAG3, obj_state, argc, argv));
}
static elfedit_cmdret_t
cmd_ei_class(elfedit_obj_state_t *obj_state, int argc, const char *argv[])
{
return (cmd_body(EHDR_CMD_T_EI_CLASS, obj_state, argc, argv));
}
static elfedit_cmdret_t
cmd_ei_data(elfedit_obj_state_t *obj_state, int argc, const char *argv[])
{
return (cmd_body(EHDR_CMD_T_EI_DATA, obj_state, argc, argv));
}
static elfedit_cmdret_t
cmd_ei_version(elfedit_obj_state_t *obj_state, int argc, const char *argv[])
{
return (cmd_body(EHDR_CMD_T_EI_VERSION, obj_state, argc, argv));
}
static elfedit_cmdret_t
cmd_ei_osabi(elfedit_obj_state_t *obj_state, int argc, const char *argv[])
{
return (cmd_body(EHDR_CMD_T_EI_OSABI, obj_state, argc, argv));
}
static elfedit_cmdret_t
cmd_ei_abiversion(elfedit_obj_state_t *obj_state, int argc, const char *argv[])
{
return (cmd_body(EHDR_CMD_T_EI_ABIVERSION, obj_state, argc, argv));
}
elfedit_module_t *
elfedit_init(elfedit_module_version_t version)
{
static elfedit_cmd_optarg_t opt_std[] = {
{ ELFEDIT_STDOA_OPT_O, 0,
ELFEDIT_CMDOA_F_INHERIT, 0, 0 },
{ NULL }
};
static const char *name_dump[] = {
MSG_ORIG(MSG_CMD_DUMP),
MSG_ORIG(MSG_STR_EMPTY),
NULL
};
static const char *name_e_ident[] = {
MSG_ORIG(MSG_CMD_E_IDENT), NULL };
static elfedit_cmd_optarg_t arg_e_ident[] = {
{ MSG_ORIG(MSG_STR_INDEX),
ELFEDIT_I18NHDL(MSG_ARGDESC_E_IDENT_NDX),
ELFEDIT_CMDOA_F_OPT, 0 },
{ MSG_ORIG(MSG_STR_VALUE),
ELFEDIT_I18NHDL(MSG_ARGDESC_E_IDENT_VALUE),
ELFEDIT_CMDOA_F_OPT, 0 },
{ NULL }
};
static const char *name_e_type[] = {
MSG_ORIG(MSG_CMD_E_TYPE), NULL };
static elfedit_cmd_optarg_t arg_e_type[] = {
{ MSG_ORIG(MSG_STR_VALUE),
ELFEDIT_I18NHDL(MSG_ARGDESC_E_TYPE_VALUE),
ELFEDIT_CMDOA_F_OPT, 0 },
{ NULL }
};
static const char *name_e_machine[] = {
MSG_ORIG(MSG_CMD_E_MACHINE), NULL };
static elfedit_cmd_optarg_t arg_e_machine[] = {
{ MSG_ORIG(MSG_STR_TYPE),
ELFEDIT_I18NHDL(MSG_ARGDESC_E_MACHINE_VALUE),
ELFEDIT_CMDOA_F_OPT, 0 },
{ NULL }
};
static const char *name_e_version[] = {
MSG_ORIG(MSG_CMD_E_VERSION), NULL };
static elfedit_cmd_optarg_t arg_e_version[] = {
{ MSG_ORIG(MSG_STR_VERSION),
ELFEDIT_I18NHDL(MSG_ARGDESC_E_VERSION_VALUE),
ELFEDIT_CMDOA_F_OPT, 0 },
{ NULL }
};
static const char *name_e_entry[] = {
MSG_ORIG(MSG_CMD_E_ENTRY), NULL };
static elfedit_cmd_optarg_t arg_e_entry[] = {
{ MSG_ORIG(MSG_STR_VALUE),
ELFEDIT_I18NHDL(MSG_ARGDESC_E_ENTRY_VALUE),
ELFEDIT_CMDOA_F_OPT, 0 },
{ NULL }
};
static const char *name_e_phoff[] = {
MSG_ORIG(MSG_CMD_E_PHOFF), NULL };
static elfedit_cmd_optarg_t arg_e_phoff[] = {
{ MSG_ORIG(MSG_STR_OFFSET),
ELFEDIT_I18NHDL(MSG_ARGDESC_E_PHOFF_VALUE),
ELFEDIT_CMDOA_F_OPT, 0 },
{ NULL }
};
static const char *name_e_shoff[] = {
MSG_ORIG(MSG_CMD_E_SHOFF), NULL };
static elfedit_cmd_optarg_t arg_e_shoff[] = {
{ MSG_ORIG(MSG_STR_OFFSET),
ELFEDIT_I18NHDL(MSG_ARGDESC_E_SHOFF_VALUE),
ELFEDIT_CMDOA_F_OPT, 0 },
{ NULL }
};
static const char *name_e_flags[] = {
MSG_ORIG(MSG_CMD_E_FLAGS), NULL };
static elfedit_cmd_optarg_t opt_e_flags[] = {
{ ELFEDIT_STDOA_OPT_AND, 0,
ELFEDIT_CMDOA_F_INHERIT, EHDR_OPT_F_AND, EHDR_OPT_F_OR },
{ ELFEDIT_STDOA_OPT_CMP, 0,
ELFEDIT_CMDOA_F_INHERIT, EHDR_OPT_F_CMP, 0 },
{ ELFEDIT_STDOA_OPT_O, 0,
ELFEDIT_CMDOA_F_INHERIT, 0, 0 },
{ ELFEDIT_STDOA_OPT_OR, 0,
ELFEDIT_CMDOA_F_INHERIT, EHDR_OPT_F_OR, EHDR_OPT_F_AND },
{ NULL }
};
static elfedit_cmd_optarg_t arg_e_flags[] = {
{ MSG_ORIG(MSG_STR_FLAGVALUE),
ELFEDIT_I18NHDL(MSG_ARGDESC_E_FLAGS_VALUE),
ELFEDIT_CMDOA_F_OPT | ELFEDIT_CMDOA_F_MULT, 0 },
{ NULL }
};
static const char *name_e_ehsize[] = {
MSG_ORIG(MSG_CMD_E_EHSIZE), NULL };
static elfedit_cmd_optarg_t arg_e_ehsize[] = {
{ MSG_ORIG(MSG_STR_VALUE),
ELFEDIT_I18NHDL(MSG_ARGDESC_E_EHSIZE_VALUE),
ELFEDIT_CMDOA_F_OPT, 0 },
{ NULL }
};
static const char *name_e_phentsize[] = {
MSG_ORIG(MSG_CMD_E_PHENTSIZE), NULL };
static elfedit_cmd_optarg_t arg_e_phentsize[] = {
{ MSG_ORIG(MSG_STR_VALUE),
ELFEDIT_I18NHDL(MSG_ARGDESC_E_PHENTSIZE_VALUE),
ELFEDIT_CMDOA_F_OPT, 0 },
{ NULL }
};
static const char *name_e_phnum[] = {
MSG_ORIG(MSG_CMD_E_PHNUM), NULL };
static elfedit_cmd_optarg_t arg_e_phnum[] = {
{ MSG_ORIG(MSG_STR_VALUE),
ELFEDIT_I18NHDL(MSG_ARGDESC_E_PHNUM_VALUE),
ELFEDIT_CMDOA_F_OPT, 0 },
{ NULL }
};
static const char *name_e_shentsize[] = {
MSG_ORIG(MSG_CMD_E_SHENTSIZE), NULL };
static elfedit_cmd_optarg_t arg_e_shentsize[] = {
{ MSG_ORIG(MSG_STR_VALUE),
ELFEDIT_I18NHDL(MSG_ARGDESC_E_SHENTSIZE_VALUE),
ELFEDIT_CMDOA_F_OPT, 0 },
{ NULL }
};
static const char *name_e_shnum[] = {
MSG_ORIG(MSG_CMD_E_SHNUM), NULL };
static elfedit_cmd_optarg_t arg_e_shnum[] = {
{ MSG_ORIG(MSG_STR_VALUE),
ELFEDIT_I18NHDL(MSG_ARGDESC_E_SHNUM_VALUE),
ELFEDIT_CMDOA_F_OPT, 0 },
{ NULL }
};
static const char *name_e_shstrndx[] = {
MSG_ORIG(MSG_CMD_E_SHSTRNDX), NULL };
static elfedit_cmd_optarg_t opt_e_shstrndx[] = {
{ ELFEDIT_STDOA_OPT_O, 0,
ELFEDIT_CMDOA_F_INHERIT, 0, 0 },
{ MSG_ORIG(MSG_STR_MINUS_SHNDX),
ELFEDIT_I18NHDL(MSG_OPTDESC_SHNDX), 0,
EHDR_OPT_F_SHNDX, EHDR_OPT_F_SHTYP },
{ MSG_ORIG(MSG_STR_MINUS_SHTYP),
ELFEDIT_I18NHDL(MSG_OPTDESC_SHTYP), 0,
EHDR_OPT_F_SHTYP, EHDR_OPT_F_SHNDX, },
{ NULL }
};
static elfedit_cmd_optarg_t arg_e_shstrndx[] = {
{ MSG_ORIG(MSG_STR_SEC),
ELFEDIT_I18NHDL(MSG_ARGDESC_E_SHSTRNDX_SEC),
ELFEDIT_CMDOA_F_OPT, 0 },
{ NULL }
};
static const char *name_ei_mag0[] = {
MSG_ORIG(MSG_CMD_EI_MAG0), NULL };
static elfedit_cmd_optarg_t arg_ei_mag0[] = {
{ MSG_ORIG(MSG_STR_VALUE),
ELFEDIT_I18NHDL(MSG_ARGDESC_EI_MAG0_VALUE),
ELFEDIT_CMDOA_F_OPT, 0 },
{ NULL }
};
static const char *name_ei_mag1[] = {
MSG_ORIG(MSG_CMD_EI_MAG1), NULL };
static elfedit_cmd_optarg_t arg_ei_mag1[] = {
{ MSG_ORIG(MSG_STR_VALUE),
ELFEDIT_I18NHDL(MSG_ARGDESC_EI_MAG1_VALUE),
ELFEDIT_CMDOA_F_OPT, 0 },
{ NULL }
};
static const char *name_ei_mag2[] = {
MSG_ORIG(MSG_CMD_EI_MAG2), NULL };
static elfedit_cmd_optarg_t arg_ei_mag2[] = {
{ MSG_ORIG(MSG_STR_VALUE),
ELFEDIT_I18NHDL(MSG_ARGDESC_EI_MAG2_VALUE),
ELFEDIT_CMDOA_F_OPT, 0 },
{ NULL }
};
static const char *name_ei_mag3[] = {
MSG_ORIG(MSG_CMD_EI_MAG3), NULL };
static elfedit_cmd_optarg_t arg_ei_mag3[] = {
{ MSG_ORIG(MSG_STR_VALUE),
ELFEDIT_I18NHDL(MSG_ARGDESC_EI_MAG3_VALUE),
ELFEDIT_CMDOA_F_OPT, 0 },
{ NULL }
};
static const char *name_ei_class[] = {
MSG_ORIG(MSG_CMD_EI_CLASS), NULL };
static elfedit_cmd_optarg_t arg_ei_class[] = {
{ MSG_ORIG(MSG_STR_VALUE),
ELFEDIT_I18NHDL(MSG_ARGDESC_EI_CLASS_VALUE),
ELFEDIT_CMDOA_F_OPT, 0 },
{ NULL }
};
static const char *name_ei_data[] = {
MSG_ORIG(MSG_CMD_EI_DATA), NULL };
static elfedit_cmd_optarg_t arg_ei_data[] = {
{ MSG_ORIG(MSG_STR_VALUE),
ELFEDIT_I18NHDL(MSG_ARGDESC_EI_DATA_VALUE),
ELFEDIT_CMDOA_F_OPT, 0 },
{ NULL }
};
static const char *name_ei_version[] = {
MSG_ORIG(MSG_CMD_EI_VERSION), NULL };
static const char *name_ei_osabi[] = {
MSG_ORIG(MSG_CMD_EI_OSABI), NULL };
static elfedit_cmd_optarg_t arg_ei_osabi[] = {
{ MSG_ORIG(MSG_STR_VALUE),
ELFEDIT_I18NHDL(MSG_ARGDESC_EI_OSABI_VALUE),
ELFEDIT_CMDOA_F_OPT, 0 },
{ NULL }
};
static const char *name_ei_abiversion[] = {
MSG_ORIG(MSG_CMD_EI_ABIVERSION), NULL };
static elfedit_cmd_optarg_t arg_ei_abiversion[] = {
{ MSG_ORIG(MSG_STR_VALUE),
ELFEDIT_I18NHDL(MSG_ARGDESC_EI_ABIVERSION_VALUE),
ELFEDIT_CMDOA_F_OPT, 0 },
{ NULL }
};
static elfedit_cmd_t cmds[] = {
{ cmd_dump, NULL, name_dump,
ELFEDIT_I18NHDL(MSG_DESC_DUMP),
ELFEDIT_I18NHDL(MSG_HELP_DUMP),
NULL, NULL },
{ cmd_e_ident, cpl_e_ident, name_e_ident,
ELFEDIT_I18NHDL(MSG_DESC_E_IDENT),
ELFEDIT_I18NHDL(MSG_HELP_E_IDENT),
opt_std, arg_e_ident },
{ cmd_e_type, cpl_e_type, name_e_type,
ELFEDIT_I18NHDL(MSG_DESC_E_TYPE),
ELFEDIT_I18NHDL(MSG_HELP_E_TYPE),
opt_std, arg_e_type },
{ cmd_e_machine, cpl_e_machine, name_e_machine,
ELFEDIT_I18NHDL(MSG_DESC_E_MACHINE),
ELFEDIT_I18NHDL(MSG_HELP_E_MACHINE),
opt_std, arg_e_machine },
{ cmd_e_version, cpl_e_version, name_e_version,
ELFEDIT_I18NHDL(MSG_DESC_E_VERSION),
ELFEDIT_I18NHDL(MSG_HELP_E_VERSION),
opt_std, arg_e_version },
{ cmd_e_entry, NULL, name_e_entry,
ELFEDIT_I18NHDL(MSG_DESC_E_ENTRY),
ELFEDIT_I18NHDL(MSG_HELP_E_ENTRY),
opt_std, arg_e_entry },
{ cmd_e_phoff, NULL, name_e_phoff,
ELFEDIT_I18NHDL(MSG_DESC_E_PHOFF),
ELFEDIT_I18NHDL(MSG_HELP_E_PHOFF),
opt_std, arg_e_phoff },
{ cmd_e_shoff, NULL, name_e_shoff,
ELFEDIT_I18NHDL(MSG_DESC_E_SHOFF),
ELFEDIT_I18NHDL(MSG_HELP_E_SHOFF),
opt_std, arg_e_shoff },
{ cmd_e_flags, cpl_e_flags, name_e_flags,
ELFEDIT_I18NHDL(MSG_DESC_E_FLAGS),
ELFEDIT_I18NHDL(MSG_HELP_E_FLAGS),
opt_e_flags, arg_e_flags },
{ cmd_e_ehsize, NULL, name_e_ehsize,
ELFEDIT_I18NHDL(MSG_DESC_E_EHSIZE),
ELFEDIT_I18NHDL(MSG_HELP_E_EHSIZE),
opt_std, arg_e_ehsize },
{ cmd_e_phentsize, NULL, name_e_phentsize,
ELFEDIT_I18NHDL(MSG_DESC_E_PHENTSIZE),
ELFEDIT_I18NHDL(MSG_HELP_E_PHENTSIZE),
opt_std, arg_e_phentsize },
{ cmd_e_phnum, NULL, name_e_phnum,
ELFEDIT_I18NHDL(MSG_DESC_E_PHNUM),
ELFEDIT_I18NHDL(MSG_HELP_E_PHNUM),
opt_std, arg_e_phnum },
{ cmd_e_shentsize, NULL, name_e_shentsize,
ELFEDIT_I18NHDL(MSG_DESC_E_SHENTSIZE),
ELFEDIT_I18NHDL(MSG_HELP_E_SHENTSIZE),
opt_std, arg_e_shentsize },
{ cmd_e_shnum, NULL, name_e_shnum,
ELFEDIT_I18NHDL(MSG_DESC_E_SHNUM),
ELFEDIT_I18NHDL(MSG_HELP_E_SHNUM),
opt_std, arg_e_shnum },
{ cmd_e_shstrndx, cpl_e_shstrndx, name_e_shstrndx,
ELFEDIT_I18NHDL(MSG_DESC_E_SHSTRNDX),
ELFEDIT_I18NHDL(MSG_HELP_E_SHSTRNDX),
opt_e_shstrndx, arg_e_shstrndx },
{ cmd_ei_mag0, NULL, name_ei_mag0,
ELFEDIT_I18NHDL(MSG_DESC_EI_MAG0),
ELFEDIT_I18NHDL(MSG_HELP_EI_MAG0),
opt_std, arg_ei_mag0 },
{ cmd_ei_mag1, NULL, name_ei_mag1,
ELFEDIT_I18NHDL(MSG_DESC_EI_MAG1),
ELFEDIT_I18NHDL(MSG_HELP_EI_MAG1),
opt_std, arg_ei_mag1 },
{ cmd_ei_mag2, NULL, name_ei_mag2,
ELFEDIT_I18NHDL(MSG_DESC_EI_MAG2),
ELFEDIT_I18NHDL(MSG_HELP_EI_MAG2),
opt_std, arg_ei_mag2 },
{ cmd_ei_mag3, NULL, name_ei_mag3,
ELFEDIT_I18NHDL(MSG_DESC_EI_MAG3),
ELFEDIT_I18NHDL(MSG_HELP_EI_MAG3),
opt_std, arg_ei_mag3 },
{ cmd_ei_class, cpl_ei_class, name_ei_class,
ELFEDIT_I18NHDL(MSG_DESC_EI_CLASS),
ELFEDIT_I18NHDL(MSG_HELP_EI_CLASS),
opt_std, arg_ei_class },
{ cmd_ei_data, cpl_ei_data, name_ei_data,
ELFEDIT_I18NHDL(MSG_DESC_EI_DATA),
ELFEDIT_I18NHDL(MSG_HELP_EI_DATA),
opt_std, arg_ei_data },
{ cmd_ei_version, cpl_e_version, name_ei_version,
ELFEDIT_I18NHDL(MSG_DESC_EI_VERSION),
ELFEDIT_I18NHDL(MSG_HELP_EI_VERSION),
opt_std, arg_e_version },
{ cmd_ei_osabi, cpl_ei_osabi, name_ei_osabi,
ELFEDIT_I18NHDL(MSG_DESC_EI_OSABI),
ELFEDIT_I18NHDL(MSG_HELP_EI_OSABI),
opt_std, arg_ei_osabi },
{ cmd_ei_abiversion, cpl_ei_abiversion, name_ei_abiversion,
ELFEDIT_I18NHDL(MSG_DESC_EI_ABIVERSION),
ELFEDIT_I18NHDL(MSG_HELP_EI_ABIVERSION),
opt_std, arg_ei_abiversion },
{ NULL }
};
static elfedit_module_t module = {
ELFEDIT_VER_CURRENT, MSG_ORIG(MSG_MOD_NAME),
ELFEDIT_I18NHDL(MSG_MOD_DESC),
cmds, mod_i18nhdl_to_str };
return (&module);
}