d29b2c4438482eb00488be49a1f5d6835f455546ab/*
d29b2c4438482eb00488be49a1f5d6835f455546ab * CDDL HEADER START
d29b2c4438482eb00488be49a1f5d6835f455546ab *
d29b2c4438482eb00488be49a1f5d6835f455546ab * The contents of this file are subject to the terms of the
d29b2c4438482eb00488be49a1f5d6835f455546ab * Common Development and Distribution License (the "License").
d29b2c4438482eb00488be49a1f5d6835f455546ab * You may not use this file except in compliance with the License.
d29b2c4438482eb00488be49a1f5d6835f455546ab *
d29b2c4438482eb00488be49a1f5d6835f455546ab * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
d29b2c4438482eb00488be49a1f5d6835f455546ab * or http://www.opensolaris.org/os/licensing.
d29b2c4438482eb00488be49a1f5d6835f455546ab * See the License for the specific language governing permissions
d29b2c4438482eb00488be49a1f5d6835f455546ab * and limitations under the License.
d29b2c4438482eb00488be49a1f5d6835f455546ab *
d29b2c4438482eb00488be49a1f5d6835f455546ab * When distributing Covered Code, include this CDDL HEADER in each
d29b2c4438482eb00488be49a1f5d6835f455546ab * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
d29b2c4438482eb00488be49a1f5d6835f455546ab * If applicable, add the following below this CDDL HEADER, with the
d29b2c4438482eb00488be49a1f5d6835f455546ab * fields enclosed by brackets "[]" replaced with your own identifying
d29b2c4438482eb00488be49a1f5d6835f455546ab * information: Portions Copyright [yyyy] [name of copyright owner]
d29b2c4438482eb00488be49a1f5d6835f455546ab *
d29b2c4438482eb00488be49a1f5d6835f455546ab * CDDL HEADER END
d29b2c4438482eb00488be49a1f5d6835f455546ab */
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
d29b2c4438482eb00488be49a1f5d6835f455546ab * Use is subject to license terms.
d29b2c4438482eb00488be49a1f5d6835f455546ab */
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab#ifndef _ELFEDIT_H
d29b2c4438482eb00488be49a1f5d6835f455546ab#define _ELFEDIT_H
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab#include <stdio.h>
d29b2c4438482eb00488be49a1f5d6835f455546ab#include <stdlib.h>
d29b2c4438482eb00488be49a1f5d6835f455546ab#include <sys/types.h>
d29b2c4438482eb00488be49a1f5d6835f455546ab#include <libelf.h>
d29b2c4438482eb00488be49a1f5d6835f455546ab#include <stdarg.h>
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab/* The following are here to support use of elfedit_msg() */
d29b2c4438482eb00488be49a1f5d6835f455546ab#include <sys/machelf.h> /* EC_ macros */
d29b2c4438482eb00488be49a1f5d6835f455546ab#include <libintl.h>
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab#ifdef __cplusplus
d29b2c4438482eb00488be49a1f5d6835f455546abextern "C" {
d29b2c4438482eb00488be49a1f5d6835f455546ab#endif
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab/*
d29b2c4438482eb00488be49a1f5d6835f455546ab * elfedit uses elfedit_printf() to produce generic output to stdout.
d29b2c4438482eb00488be49a1f5d6835f455546ab * elfedit_msg() is used to produce error message, or specific types
d29b2c4438482eb00488be49a1f5d6835f455546ab * of terse informational messages:
d29b2c4438482eb00488be49a1f5d6835f455546ab *
d29b2c4438482eb00488be49a1f5d6835f455546ab * ELFEDIT_MSG_ERR:
d29b2c4438482eb00488be49a1f5d6835f455546ab * Issues an error to stderr. elfedit_msg() does not return
d29b2c4438482eb00488be49a1f5d6835f455546ab * to the caller. Control returns to the outer loop in
d29b2c4438482eb00488be49a1f5d6835f455546ab * interactive use. elfedit exits in non-interactive use.
d29b2c4438482eb00488be49a1f5d6835f455546ab *
d29b2c4438482eb00488be49a1f5d6835f455546ab * ELFEDIT_MSG_FATAL:
d29b2c4438482eb00488be49a1f5d6835f455546ab * Issues an error to stderr. elfedit_msg() exits the process,
d29b2c4438482eb00488be49a1f5d6835f455546ab * and does not return to the caller.
d29b2c4438482eb00488be49a1f5d6835f455546ab *
d29b2c4438482eb00488be49a1f5d6835f455546ab * ELFEDIT_MSG_USAGE:
d29b2c4438482eb00488be49a1f5d6835f455546ab * Issues an elfedit usage message to stderr, and
d29b2c4438482eb00488be49a1f5d6835f455546ab * returns to the caller.
d29b2c4438482eb00488be49a1f5d6835f455546ab *
d29b2c4438482eb00488be49a1f5d6835f455546ab * ELFEDIT_MSG_CMDUSAGE
d29b2c4438482eb00488be49a1f5d6835f455546ab * Issues an elfedit usage message to stderr, and
d29b2c4438482eb00488be49a1f5d6835f455546ab * does not return to the caller.
d29b2c4438482eb00488be49a1f5d6835f455546ab *
d29b2c4438482eb00488be49a1f5d6835f455546ab * ELFEDIT_MSG_DEBUG
d29b2c4438482eb00488be49a1f5d6835f455546ab * If the ELFEDIT_F_DEBUG flag is set, the message
d29b2c4438482eb00488be49a1f5d6835f455546ab * is printed to stdout, otherwise no output is produced.
d29b2c4438482eb00488be49a1f5d6835f455546ab * elfedit_msg() returns to the caller.
d29b2c4438482eb00488be49a1f5d6835f455546ab *
d29b2c4438482eb00488be49a1f5d6835f455546ab * ELFEDIT_MSG_QUIET
d29b2c4438482eb00488be49a1f5d6835f455546ab * This is a very special case, intended to handle the
d29b2c4438482eb00488be49a1f5d6835f455546ab * case where the pager subprocess exits before we are
d29b2c4438482eb00488be49a1f5d6835f455546ab * done producing output (the user presses 'q'). It acts
d29b2c4438482eb00488be49a1f5d6835f455546ab * just like ELFEDIT_MSG_ERR, except that no message is
d29b2c4438482eb00488be49a1f5d6835f455546ab * actually printed.
d29b2c4438482eb00488be49a1f5d6835f455546ab *
d29b2c4438482eb00488be49a1f5d6835f455546ab * In the cases where elfedit_msg() does not return to the caller, the
d29b2c4438482eb00488be49a1f5d6835f455546ab * behavior depends on the mode of execution. If running in interactive
d29b2c4438482eb00488be49a1f5d6835f455546ab * mode (reading from a tty), control is returned directly to the outer
d29b2c4438482eb00488be49a1f5d6835f455546ab * elfedit control loop to read another command. If not running in interactive
d29b2c4438482eb00488be49a1f5d6835f455546ab * mode, elfedit exits with a non-zero status.
d29b2c4438482eb00488be49a1f5d6835f455546ab */
d29b2c4438482eb00488be49a1f5d6835f455546abtypedef enum {
d29b2c4438482eb00488be49a1f5d6835f455546ab ELFEDIT_MSG_ERR = 0,
d29b2c4438482eb00488be49a1f5d6835f455546ab ELFEDIT_MSG_FATAL = 1,
d29b2c4438482eb00488be49a1f5d6835f455546ab ELFEDIT_MSG_USAGE = 2,
d29b2c4438482eb00488be49a1f5d6835f455546ab ELFEDIT_MSG_CMDUSAGE = 3,
d29b2c4438482eb00488be49a1f5d6835f455546ab ELFEDIT_MSG_DEBUG = 4,
d29b2c4438482eb00488be49a1f5d6835f455546ab ELFEDIT_MSG_QUIET = 5
d29b2c4438482eb00488be49a1f5d6835f455546ab} elfedit_msg_t;
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab/*
d29b2c4438482eb00488be49a1f5d6835f455546ab * Information for a single ELF section.
d29b2c4438482eb00488be49a1f5d6835f455546ab *
d29b2c4438482eb00488be49a1f5d6835f455546ab * NOTE: sec_xshndx
d29b2c4438482eb00488be49a1f5d6835f455546ab * A symbol table can have an associated SHT_SYMTAB_SHNDX section. This
d29b2c4438482eb00488be49a1f5d6835f455546ab * happens when the number of sections is too large to fit in the
d29b2c4438482eb00488be49a1f5d6835f455546ab * ELF symbol st_shndx field, which is a 16-bit value. The sec_xshndx
d29b2c4438482eb00488be49a1f5d6835f455546ab * field will be SHN_UNDEF if there is no such section, and will be
d29b2c4438482eb00488be49a1f5d6835f455546ab * the section index of the extended section index section assocated
d29b2c4438482eb00488be49a1f5d6835f455546ab * with the symbol table otherwise.
d29b2c4438482eb00488be49a1f5d6835f455546ab *
d29b2c4438482eb00488be49a1f5d6835f455546ab * NOTE: sec_versym
d29b2c4438482eb00488be49a1f5d6835f455546ab * Symbol table sections can have an SHT_SUNW_VERSYM section that
d29b2c4438482eb00488be49a1f5d6835f455546ab * contains its version indices. Other types of section will have
d29b2c4438482eb00488be49a1f5d6835f455546ab * this field set to SHN_UNDEF.
d29b2c4438482eb00488be49a1f5d6835f455546ab */
d29b2c4438482eb00488be49a1f5d6835f455546abtypedef struct {
d29b2c4438482eb00488be49a1f5d6835f455546ab Elf32_Word sec_shndx; /* Section index */
d29b2c4438482eb00488be49a1f5d6835f455546ab Elf_Scn *sec_scn; /* Section descriptor */
d29b2c4438482eb00488be49a1f5d6835f455546ab Elf32_Shdr *sec_shdr; /* Section header */
d29b2c4438482eb00488be49a1f5d6835f455546ab Elf_Data *sec_data; /* Data region of section */
d29b2c4438482eb00488be49a1f5d6835f455546ab const char *sec_name; /* Name of section */
d29b2c4438482eb00488be49a1f5d6835f455546ab} elfedit32_section_t;
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546abtypedef struct {
d29b2c4438482eb00488be49a1f5d6835f455546ab Elf64_Word sec_shndx;
d29b2c4438482eb00488be49a1f5d6835f455546ab Elf_Scn *sec_scn;
d29b2c4438482eb00488be49a1f5d6835f455546ab Elf64_Shdr *sec_shdr;
d29b2c4438482eb00488be49a1f5d6835f455546ab Elf_Data *sec_data;
d29b2c4438482eb00488be49a1f5d6835f455546ab const char *sec_name;
d29b2c4438482eb00488be49a1f5d6835f455546ab} elfedit64_section_t;
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab#ifdef _ELF64
d29b2c4438482eb00488be49a1f5d6835f455546ab#define elfedit_section_t elfedit64_section_t
d29b2c4438482eb00488be49a1f5d6835f455546ab#else
d29b2c4438482eb00488be49a1f5d6835f455546ab#define elfedit_section_t elfedit32_section_t
d29b2c4438482eb00488be49a1f5d6835f455546ab#endif
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab/*
d29b2c4438482eb00488be49a1f5d6835f455546ab * We maintain extra information for symbol tables. We look them
d29b2c4438482eb00488be49a1f5d6835f455546ab * up frequently, so we want to eliminate expensive linear searches
d29b2c4438482eb00488be49a1f5d6835f455546ab * of the entire section header array. Also, symbol tables usually
d29b2c4438482eb00488be49a1f5d6835f455546ab * have associated parallal sections (syminfo, versym, extended indexes, etc)
d29b2c4438482eb00488be49a1f5d6835f455546ab * and we want to eliminate repeated linear lookups for them, as well as
d29b2c4438482eb00488be49a1f5d6835f455546ab * the basic error checking that is necessary to ensure they match the
d29b2c4438482eb00488be49a1f5d6835f455546ab * symbol table they're given.
d29b2c4438482eb00488be49a1f5d6835f455546ab *
d29b2c4438482eb00488be49a1f5d6835f455546ab * This extra information is kept in elfedit_symtab_t structs. Each field
d29b2c4438482eb00488be49a1f5d6835f455546ab * is a section index, with SHN_UNDEF used for those that do not apply.
d29b2c4438482eb00488be49a1f5d6835f455546ab */
d29b2c4438482eb00488be49a1f5d6835f455546abtypedef struct {
d29b2c4438482eb00488be49a1f5d6835f455546ab Elf32_Word symt_shndx; /* Symbol table section index */
d29b2c4438482eb00488be49a1f5d6835f455546ab Elf32_Word symt_xshndx; /* Index of extended index section */
d29b2c4438482eb00488be49a1f5d6835f455546ab Elf32_Word symt_syminfo; /* Index of versym section */
d29b2c4438482eb00488be49a1f5d6835f455546ab Elf32_Word symt_versym; /* Index of versym section */
d29b2c4438482eb00488be49a1f5d6835f455546ab} elfedit32_symtab_t;
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546abtypedef struct {
d29b2c4438482eb00488be49a1f5d6835f455546ab Elf64_Word symt_shndx;
d29b2c4438482eb00488be49a1f5d6835f455546ab Elf64_Word symt_xshndx;
d29b2c4438482eb00488be49a1f5d6835f455546ab Elf64_Word symt_versym;
d29b2c4438482eb00488be49a1f5d6835f455546ab Elf64_Word symt_syminfo;
d29b2c4438482eb00488be49a1f5d6835f455546ab} elfedit64_symtab_t;
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab#ifdef _ELF64
d29b2c4438482eb00488be49a1f5d6835f455546ab#define elfedit_symtab_t elfedit64_symtab_t
d29b2c4438482eb00488be49a1f5d6835f455546ab#else
d29b2c4438482eb00488be49a1f5d6835f455546ab#define elfedit_symtab_t elfedit32_symtab_t
d29b2c4438482eb00488be49a1f5d6835f455546ab#endif
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab/*
d29b2c4438482eb00488be49a1f5d6835f455546ab * Information for a single ELF object.
d29b2c4438482eb00488be49a1f5d6835f455546ab *
d29b2c4438482eb00488be49a1f5d6835f455546ab * note:
d29b2c4438482eb00488be49a1f5d6835f455546ab * elfedit is intended to be an expert's tool, capable of modifying
d29b2c4438482eb00488be49a1f5d6835f455546ab * nearly everything in the file, whether or not such modifications
d29b2c4438482eb00488be49a1f5d6835f455546ab * are a good idea. At the same time, elfedit, via libelf, relies
d29b2c4438482eb00488be49a1f5d6835f455546ab * on the contents of the object to properly locate information in
d29b2c4438482eb00488be49a1f5d6835f455546ab * the file. As this is the same information that elfedit allows the
d29b2c4438482eb00488be49a1f5d6835f455546ab * user to modify, it should be obvious that the potential exists
d29b2c4438482eb00488be49a1f5d6835f455546ab * for users to corrupt the file to the degree that elfedit itself
d29b2c4438482eb00488be49a1f5d6835f455546ab * may fail, or produce spurious results. We allow such changes for
d29b2c4438482eb00488be49a1f5d6835f455546ab * several reasons:
d29b2c4438482eb00488be49a1f5d6835f455546ab *
d29b2c4438482eb00488be49a1f5d6835f455546ab * 1) Such corruption does not happen in the most obvious and
d29b2c4438482eb00488be49a1f5d6835f455546ab * useful operations elfedit supports, but comes as a result
d29b2c4438482eb00488be49a1f5d6835f455546ab * of modifying fields that contain size and offset information
d29b2c4438482eb00488be49a1f5d6835f455546ab * used to navigate the file. Non-ELF developers have
d29b2c4438482eb00488be49a1f5d6835f455546ab * little practical reason to change such things.
d29b2c4438482eb00488be49a1f5d6835f455546ab *
d29b2c4438482eb00488be49a1f5d6835f455546ab * 2) Producing a corrupt ELF file can be very useful
d29b2c4438482eb00488be49a1f5d6835f455546ab * for R&D and/or testing purposes.
d29b2c4438482eb00488be49a1f5d6835f455546ab *
d29b2c4438482eb00488be49a1f5d6835f455546ab * 3) ELF is sufficiently complex that no absolute guarantees can
d29b2c4438482eb00488be49a1f5d6835f455546ab * be made about "safe" operations, beyond the basic
d29b2c4438482eb00488be49a1f5d6835f455546ab * and obvious things that are of practical use.
d29b2c4438482eb00488be49a1f5d6835f455546ab *
d29b2c4438482eb00488be49a1f5d6835f455546ab * One way we protect ourselves is via the information cached in
d29b2c4438482eb00488be49a1f5d6835f455546ab * the elfedit_obj_state_t structure at startup. By using this
d29b2c4438482eb00488be49a1f5d6835f455546ab * information, rather than constantly fetching it via libelf,
d29b2c4438482eb00488be49a1f5d6835f455546ab * we protect ourselves against many user changes, such as changing the
d29b2c4438482eb00488be49a1f5d6835f455546ab * program or section header offsets, or similar size/position fields.
d29b2c4438482eb00488be49a1f5d6835f455546ab *
d29b2c4438482eb00488be49a1f5d6835f455546ab * Of course, we make no assurances that that we will be able to
d29b2c4438482eb00488be49a1f5d6835f455546ab * read the resulting file in a subsequent session.
d29b2c4438482eb00488be49a1f5d6835f455546ab */
d29b2c4438482eb00488be49a1f5d6835f455546abtypedef struct {
d29b2c4438482eb00488be49a1f5d6835f455546ab const char *os_file; /* Path to ELF file */
d29b2c4438482eb00488be49a1f5d6835f455546ab int os_fd; /* Open file descriptor */
d29b2c4438482eb00488be49a1f5d6835f455546ab Elf *os_elf; /* ELF descriptor */
d29b2c4438482eb00488be49a1f5d6835f455546ab Elf32_Ehdr *os_ehdr; /* ELF header */
d29b2c4438482eb00488be49a1f5d6835f455546ab Elf32_Word os_dynndx; /* Index of dynamic section */
d29b2c4438482eb00488be49a1f5d6835f455546ab size_t os_shstrndx; /* Index of section header */
d29b2c4438482eb00488be49a1f5d6835f455546ab /* string table section */
d29b2c4438482eb00488be49a1f5d6835f455546ab size_t os_shnum; /* # of sections in file */
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit32_section_t *os_secarr; /* Section data */
d29b2c4438482eb00488be49a1f5d6835f455546ab size_t os_phnum; /* # of program headers */
d29b2c4438482eb00488be49a1f5d6835f455546ab Elf32_Phdr *os_phdr; /* Program header array */
d29b2c4438482eb00488be49a1f5d6835f455546ab size_t os_symtabnum; /* # items in os_symtab[] */
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit32_symtab_t *os_symtab; /* Array of symbol tbl info */
d29b2c4438482eb00488be49a1f5d6835f455546ab} elfedit32_obj_state_t;
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546abtypedef struct {
d29b2c4438482eb00488be49a1f5d6835f455546ab const char *os_file;
d29b2c4438482eb00488be49a1f5d6835f455546ab int os_fd;
d29b2c4438482eb00488be49a1f5d6835f455546ab Elf *os_elf;
d29b2c4438482eb00488be49a1f5d6835f455546ab Elf64_Ehdr *os_ehdr;
d29b2c4438482eb00488be49a1f5d6835f455546ab Elf64_Word os_dynndx;
d29b2c4438482eb00488be49a1f5d6835f455546ab size_t os_shstrndx;
d29b2c4438482eb00488be49a1f5d6835f455546ab size_t os_shnum;
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit64_section_t *os_secarr;
d29b2c4438482eb00488be49a1f5d6835f455546ab size_t os_phnum;
d29b2c4438482eb00488be49a1f5d6835f455546ab Elf64_Phdr *os_phdr;
d29b2c4438482eb00488be49a1f5d6835f455546ab size_t os_symtabnum;
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit64_symtab_t *os_symtab;
d29b2c4438482eb00488be49a1f5d6835f455546ab} elfedit64_obj_state_t;
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab#ifdef _ELF64
d29b2c4438482eb00488be49a1f5d6835f455546ab#define elfedit_obj_state_t elfedit64_obj_state_t
d29b2c4438482eb00488be49a1f5d6835f455546ab#else
d29b2c4438482eb00488be49a1f5d6835f455546ab#define elfedit_obj_state_t elfedit32_obj_state_t
d29b2c4438482eb00488be49a1f5d6835f455546ab#endif
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab/*
d29b2c4438482eb00488be49a1f5d6835f455546ab * Bit values for editor state.
d29b2c4438482eb00488be49a1f5d6835f455546ab */
d29b2c4438482eb00488be49a1f5d6835f455546abtypedef enum {
d29b2c4438482eb00488be49a1f5d6835f455546ab ELFEDIT_F_AUTOPRINT = 1, /* Print informational text about edits */
d29b2c4438482eb00488be49a1f5d6835f455546ab ELFEDIT_F_DEBUG = 2, /* Print informational text about operations */
d29b2c4438482eb00488be49a1f5d6835f455546ab ELFEDIT_F_READONLY = 4, /* File is processed readonly */
d29b2c4438482eb00488be49a1f5d6835f455546ab} elfedit_flag_t;
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab/*
d29b2c4438482eb00488be49a1f5d6835f455546ab * Type used to represent the output style for printing ELF values.
d29b2c4438482eb00488be49a1f5d6835f455546ab *
d29b2c4438482eb00488be49a1f5d6835f455546ab * DEFAULT - Output is in 'elfdump' style, designed for human eyes.
d29b2c4438482eb00488be49a1f5d6835f455546ab * Headers, and additional information are shown.
d29b2c4438482eb00488be49a1f5d6835f455546ab * SIMPLE - Output is simple, consisting only of the target item.
d29b2c4438482eb00488be49a1f5d6835f455546ab * Integer values are shown as symbolic constants when possible,
d29b2c4438482eb00488be49a1f5d6835f455546ab * and integers otherwise.
d29b2c4438482eb00488be49a1f5d6835f455546ab * NUM - Like SIMPLE, except integer values are always shown as
d29b2c4438482eb00488be49a1f5d6835f455546ab * integer constants, and strings are shown as the integer
d29b2c4438482eb00488be49a1f5d6835f455546ab * offset into the string table.
d29b2c4438482eb00488be49a1f5d6835f455546ab */
d29b2c4438482eb00488be49a1f5d6835f455546abtypedef enum {
d29b2c4438482eb00488be49a1f5d6835f455546ab ELFEDIT_OUTSTYLE_DEFAULT = 0,
d29b2c4438482eb00488be49a1f5d6835f455546ab ELFEDIT_OUTSTYLE_SIMPLE = 1,
d29b2c4438482eb00488be49a1f5d6835f455546ab ELFEDIT_OUTSTYLE_NUM = 2
d29b2c4438482eb00488be49a1f5d6835f455546ab} elfedit_outstyle_t;
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab/*
d29b2c4438482eb00488be49a1f5d6835f455546ab * The elfedit_module_t, and the types it references, are defined
d29b2c4438482eb00488be49a1f5d6835f455546ab * by loadable elfedit modules, and used by elfedit. These structures
d29b2c4438482eb00488be49a1f5d6835f455546ab * need to communicate internationalized strings for elfedit to print.
d29b2c4438482eb00488be49a1f5d6835f455546ab *
d29b2c4438482eb00488be49a1f5d6835f455546ab * We want to leave the choice of internationalization APIs, as well as
d29b2c4438482eb00488be49a1f5d6835f455546ab * the decision about whether or not to even to it to the individual
d29b2c4438482eb00488be49a1f5d6835f455546ab * modules. Hence, we do not use a simple (const char *) pointer to
d29b2c4438482eb00488be49a1f5d6835f455546ab * communicate potentially internationalized strings. Instead, we define
d29b2c4438482eb00488be49a1f5d6835f455546ab * elfedit_i18nhdl_t, an opaque type guaranteed to be large enough
d29b2c4438482eb00488be49a1f5d6835f455546ab * to hold a pointer. Each module casts the handle needed to access the
d29b2c4438482eb00488be49a1f5d6835f455546ab * string to this type. Each module also supplies a function
d29b2c4438482eb00488be49a1f5d6835f455546ab * (mod_i18nhdl_to_str field of elfedit_module_t) that given one
d29b2c4438482eb00488be49a1f5d6835f455546ab * of these opaque keys, will return a (const char *) pointer to the
d29b2c4438482eb00488be49a1f5d6835f455546ab * actual string, for elfedit to print.
d29b2c4438482eb00488be49a1f5d6835f455546ab *
d29b2c4438482eb00488be49a1f5d6835f455546ab * If the underlying module doesn't want to implement i18n support,
d29b2c4438482eb00488be49a1f5d6835f455546ab * all it has to do is cast the strings to elfedit_i18nhdl_t and
d29b2c4438482eb00488be49a1f5d6835f455546ab * back.
d29b2c4438482eb00488be49a1f5d6835f455546ab */
d29b2c4438482eb00488be49a1f5d6835f455546abtypedef uintptr_t elfedit_i18nhdl_t;
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab/*
d29b2c4438482eb00488be49a1f5d6835f455546ab * Macro to handle casting international string "handles" to the
d29b2c4438482eb00488be49a1f5d6835f455546ab * elfedit_i18nhdl_t opaque type.
d29b2c4438482eb00488be49a1f5d6835f455546ab */
d29b2c4438482eb00488be49a1f5d6835f455546ab#define ELFEDIT_I18NHDL(_i18n_str_ref) ((elfedit_i18nhdl_t)_i18n_str_ref)
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab/*
d29b2c4438482eb00488be49a1f5d6835f455546ab * Return values from command functions
d29b2c4438482eb00488be49a1f5d6835f455546ab */
d29b2c4438482eb00488be49a1f5d6835f455546abtypedef enum {
d29b2c4438482eb00488be49a1f5d6835f455546ab ELFEDIT_CMDRET_NONE = 0, /* Nothing to report */
d29b2c4438482eb00488be49a1f5d6835f455546ab ELFEDIT_CMDRET_MOD = 1, /* Command modified output ELF file */
4f680cc668fa6cf678c531083400ade9a9c7934cAli Bahrami ELFEDIT_CMDRET_MOD_OS_MACH = 2, /* As per _MOD, include ELF header */
4f680cc668fa6cf678c531083400ade9a9c7934cAli Bahrami /* osabi or machine change */
4f680cc668fa6cf678c531083400ade9a9c7934cAli Bahrami ELFEDIT_CMDRET_FLUSH = 3 /* Output file flushed: elf_update() */
d29b2c4438482eb00488be49a1f5d6835f455546ab} elfedit_cmdret_t;
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab/*
d29b2c4438482eb00488be49a1f5d6835f455546ab * Prototype of an implementation function for an edit command. Note that
d29b2c4438482eb00488be49a1f5d6835f455546ab * commands do not return a status:
d29b2c4438482eb00488be49a1f5d6835f455546ab * - Success is indicated by a normal return.
d29b2c4438482eb00488be49a1f5d6835f455546ab * - The command indicates a fatal error by calling elfedit_msg() with the
d29b2c4438482eb00488be49a1f5d6835f455546ab * ELFEDIT_MSG_ERR type, in which case execution does not return
d29b2c4438482eb00488be49a1f5d6835f455546ab * to the command, and the elfedit command loop knows that an
d29b2c4438482eb00488be49a1f5d6835f455546ab * error occurred.
d29b2c4438482eb00488be49a1f5d6835f455546ab * - The command is responsible for using the standard libelf
d29b2c4438482eb00488be49a1f5d6835f455546ab * mechanisms to indicate when changes have been made to
d29b2c4438482eb00488be49a1f5d6835f455546ab * the ELF file.
d29b2c4438482eb00488be49a1f5d6835f455546ab */
d29b2c4438482eb00488be49a1f5d6835f455546abtypedef elfedit_cmdret_t elfedit32_cmd_func_t(elfedit32_obj_state_t *state,
d29b2c4438482eb00488be49a1f5d6835f455546ab int argc, const char *argv[]);
d29b2c4438482eb00488be49a1f5d6835f455546abtypedef elfedit_cmdret_t elfedit64_cmd_func_t(elfedit64_obj_state_t *state,
d29b2c4438482eb00488be49a1f5d6835f455546ab int argc, const char *argv[]);
d29b2c4438482eb00488be49a1f5d6835f455546ab#ifdef _ELF64
d29b2c4438482eb00488be49a1f5d6835f455546ab#define elfedit_cmd_func_t elfedit64_cmd_func_t
d29b2c4438482eb00488be49a1f5d6835f455546ab#else
d29b2c4438482eb00488be49a1f5d6835f455546ab#define elfedit_cmd_func_t elfedit32_cmd_func_t
d29b2c4438482eb00488be49a1f5d6835f455546ab#endif
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab/*
d29b2c4438482eb00488be49a1f5d6835f455546ab * An elfedit command (elfedit_cmd_t) has a cmd_cpl field that
d29b2c4438482eb00488be49a1f5d6835f455546ab * can be set to a command completion function. If such a function
d29b2c4438482eb00488be49a1f5d6835f455546ab * is present (non-NULL), and the user presses the tab key at the
d29b2c4438482eb00488be49a1f5d6835f455546ab * command line while the cursor is at a plain (non option) argument,
d29b2c4438482eb00488be49a1f5d6835f455546ab * elfedit calls the function, passing it all the tokens up through
d29b2c4438482eb00488be49a1f5d6835f455546ab * the one needing completion. The function can use elfedit_cpl_match()
d29b2c4438482eb00488be49a1f5d6835f455546ab * to enter possible alternatives. Additionally, there are helper
d29b2c4438482eb00488be49a1f5d6835f455546ab * functions built on top of elfedit_cpl_match() that simplify common cases.
d29b2c4438482eb00488be49a1f5d6835f455546ab *
d29b2c4438482eb00488be49a1f5d6835f455546ab * elfedit_cpl_ato[iu]() - enter matches from elfedit_ato[iu]_sym_t
d29b2c4438482eb00488be49a1f5d6835f455546ab * mappings.
d29b2c4438482eb00488be49a1f5d6835f455546ab * elfedit_cpl_atoconst() - Enter matches for well known constants
d29b2c4438482eb00488be49a1f5d6835f455546ab * elfedit_cpl_command() - enter matches for all known commands
d29b2c4438482eb00488be49a1f5d6835f455546ab * elfedit_cpl_mod() - enter matches for all known modules.
55ef6355bc6375ad080b10b10660e3528e2b7e6aab * elfedit_cpl_ndx() - enter numeric index as a match
d29b2c4438482eb00488be49a1f5d6835f455546ab *
d29b2c4438482eb00488be49a1f5d6835f455546ab * The completion function is passed the following arguments:
d29b2c4438482eb00488be49a1f5d6835f455546ab *
d29b2c4438482eb00488be49a1f5d6835f455546ab * obj_state - Object state. Will be NULL if elfedit session does not
d29b2c4438482eb00488be49a1f5d6835f455546ab * have an active object. The completion function must test
d29b2c4438482eb00488be49a1f5d6835f455546ab * the pointer before using it.
d29b2c4438482eb00488be49a1f5d6835f455546ab * cpldata - Completion data, to be passed to elfedit_cpl_match()
d29b2c4438482eb00488be49a1f5d6835f455546ab * or the helper functions built on it to register alternative
d29b2c4438482eb00488be49a1f5d6835f455546ab * strings.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * argc, argv - The tokens from the start of the line through
d29b2c4438482eb00488be49a1f5d6835f455546ab * the one needing completion, which will always
d29b2c4438482eb00488be49a1f5d6835f455546ab * be cmdcpl_argv[cmdcpl_argc - 1].
d29b2c4438482eb00488be49a1f5d6835f455546ab * num_opt - A count of the optional arguments (those starting with
d29b2c4438482eb00488be49a1f5d6835f455546ab * '-' at the beginning of argv. This means that argv[num_opt]
d29b2c4438482eb00488be49a1f5d6835f455546ab * is the first plain argument, and the 1-based positional
d29b2c4438482eb00488be49a1f5d6835f455546ab * number of the plain argument for which command completion
d29b2c4438482eb00488be49a1f5d6835f455546ab * is needed is (argc - num_opt).
d29b2c4438482eb00488be49a1f5d6835f455546ab */
d29b2c4438482eb00488be49a1f5d6835f455546abtypedef void elfedit32_cmdcpl_func_t(elfedit32_obj_state_t *state,
d29b2c4438482eb00488be49a1f5d6835f455546ab void *cpldata, int argc, const char *argv[], int num_opt);
d29b2c4438482eb00488be49a1f5d6835f455546abtypedef void elfedit64_cmdcpl_func_t(elfedit64_obj_state_t *state,
d29b2c4438482eb00488be49a1f5d6835f455546ab void *cpldata, int argc, const char *argv[], int num_opt);
d29b2c4438482eb00488be49a1f5d6835f455546ab#ifdef _ELF64
d29b2c4438482eb00488be49a1f5d6835f455546ab#define elfedit_cmdcpl_func_t elfedit64_cmdcpl_func_t
d29b2c4438482eb00488be49a1f5d6835f455546ab#else
d29b2c4438482eb00488be49a1f5d6835f455546ab#define elfedit_cmdcpl_func_t elfedit32_cmdcpl_func_t
d29b2c4438482eb00488be49a1f5d6835f455546ab#endif
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab/*
d29b2c4438482eb00488be49a1f5d6835f455546ab * Command option/argument descriptor. These structures
d29b2c4438482eb00488be49a1f5d6835f455546ab * are used to represent each option and plain argument accepted
d29b2c4438482eb00488be49a1f5d6835f455546ab * by a command, via the cmd_opt and cmd_args fields in the
d29b2c4438482eb00488be49a1f5d6835f455546ab * command definition (elfedit_cmd_t). Each descriptor consists
d29b2c4438482eb00488be49a1f5d6835f455546ab * of a name, a help string (formatted for display via sys:help),
d29b2c4438482eb00488be49a1f5d6835f455546ab * and a flags field that conveys extra information about the
d29b2c4438482eb00488be49a1f5d6835f455546ab * item:
d29b2c4438482eb00488be49a1f5d6835f455546ab *
d29b2c4438482eb00488be49a1f5d6835f455546ab * ELFEDIT_CMDOA_F_OPT
d29b2c4438482eb00488be49a1f5d6835f455546ab * The item is optional. This flag is implicit for options
d29b2c4438482eb00488be49a1f5d6835f455546ab * and need only be set for plain arguments.
d29b2c4438482eb00488be49a1f5d6835f455546ab *
d29b2c4438482eb00488be49a1f5d6835f455546ab * ELFEDIT_CMDOA_F_VALUE
d29b2c4438482eb00488be49a1f5d6835f455546ab * The item has a value, which is found in the following
d29b2c4438482eb00488be49a1f5d6835f455546ab * item. This flag only has meaning for options, and should
d29b2c4438482eb00488be49a1f5d6835f455546ab * not be set for plain arguments. The descriptor for the
d29b2c4438482eb00488be49a1f5d6835f455546ab * value is found in the next array element, and only the
d29b2c4438482eb00488be49a1f5d6835f455546ab * oa_name field is used (the other should be set t 0).
d29b2c4438482eb00488be49a1f5d6835f455546ab *
d29b2c4438482eb00488be49a1f5d6835f455546ab * ELFEDIT_CMDOA_F_MULT
d29b2c4438482eb00488be49a1f5d6835f455546ab * More than one of the specified items may be specified
d29b2c4438482eb00488be49a1f5d6835f455546ab *
d29b2c4438482eb00488be49a1f5d6835f455546ab * ELFEDIT_CMDOA_F_INHERIT
d29b2c4438482eb00488be49a1f5d6835f455546ab * This is an item for which a common definition exists.
d29b2c4438482eb00488be49a1f5d6835f455546ab * Elfedit will substitute the standard values for the
d29b2c4438482eb00488be49a1f5d6835f455546ab * name, help text, and flags. This enforces consistency
d29b2c4438482eb00488be49a1f5d6835f455546ab * in documentation, plus it is easier for the module author.
d29b2c4438482eb00488be49a1f5d6835f455546ab * When ELFEDIT_CMDOA_F_INHERIT is set:
d29b2c4438482eb00488be49a1f5d6835f455546ab * - oa_name should be set to one of the ELFEDIT_STDOA_
d29b2c4438482eb00488be49a1f5d6835f455546ab * values to specifiy which standard item is being
d29b2c4438482eb00488be49a1f5d6835f455546ab * inherited.
d29b2c4438482eb00488be49a1f5d6835f455546ab * - oa_help must be set to NULL.
d29b2c4438482eb00488be49a1f5d6835f455546ab * - It is an error to set any other flags with
d29b2c4438482eb00488be49a1f5d6835f455546ab * ELFEDIT_CMDOA_F_INHERIT.
d29b2c4438482eb00488be49a1f5d6835f455546ab * - oa_idmask and oa_excmask are used in the normal way.
d29b2c4438482eb00488be49a1f5d6835f455546ab *
d29b2c4438482eb00488be49a1f5d6835f455546ab * The oa_idmask and oa_excmask fields are used to identify options,
d29b2c4438482eb00488be49a1f5d6835f455546ab * and to support mutual exclusion (when two or more options cannot be
d29b2c4438482eb00488be49a1f5d6835f455546ab * used together). They are ignored for arguments, and should be set to 0.
d29b2c4438482eb00488be49a1f5d6835f455546ab * oa_idmask is used to uniquely identify each item. When elfedit_getopt()
d29b2c4438482eb00488be49a1f5d6835f455546ab * matches an option, it returns the value of oa_idmask to the caller to
d29b2c4438482eb00488be49a1f5d6835f455546ab * indicate which option was matched. elfedit enforces the following rules
d29b2c4438482eb00488be49a1f5d6835f455546ab * for oa_idmask, and will refuse to load a module that does not follow them:
d29b2c4438482eb00488be49a1f5d6835f455546ab * - The value of oa_idmask must be 0, or have a value that
d29b2c4438482eb00488be49a1f5d6835f455546ab * is a power of 2 (i.e. only has one bit set).
d29b2c4438482eb00488be49a1f5d6835f455546ab * - Each item that sets a non-0 value for oa_idmask must have
d29b2c4438482eb00488be49a1f5d6835f455546ab * a unique value.
d29b2c4438482eb00488be49a1f5d6835f455546ab * - If oa_idmask is 0, oa_excmask must be 0 also.
d29b2c4438482eb00488be49a1f5d6835f455546ab * - oa_excmask is set to 0 if an item is not mutually exclusive
d29b2c4438482eb00488be49a1f5d6835f455546ab * to any other item. Otherwise, it should set the bit
d29b2c4438482eb00488be49a1f5d6835f455546ab * values representing the items it is mutually exclusive to.
d29b2c4438482eb00488be49a1f5d6835f455546ab * - An oa_idmask value of 0 can be used for any item that
d29b2c4438482eb00488be49a1f5d6835f455546ab * the module does not need to identify, and which
d29b2c4438482eb00488be49a1f5d6835f455546ab * is not mutually exclusive to any other item.
d29b2c4438482eb00488be49a1f5d6835f455546ab * As elfedit_getopt() processes items, it maintains a bitmask combining the
d29b2c4438482eb00488be49a1f5d6835f455546ab * oa_idmask fields of all the options already seen. For each option, it uses
d29b2c4438482eb00488be49a1f5d6835f455546ab * oa_excmask to check for conflicts.
d29b2c4438482eb00488be49a1f5d6835f455546ab *
d29b2c4438482eb00488be49a1f5d6835f455546ab * note: elfedit enforces the rule that options consist of a '-'
d29b2c4438482eb00488be49a1f5d6835f455546ab * character followed by at least one character when a module
d29b2c4438482eb00488be49a1f5d6835f455546ab * is loaded.
d29b2c4438482eb00488be49a1f5d6835f455546ab */
d29b2c4438482eb00488be49a1f5d6835f455546abtypedef enum {
d29b2c4438482eb00488be49a1f5d6835f455546ab ELFEDIT_CMDOA_F_OPT = 1, /* Item is optional */
d29b2c4438482eb00488be49a1f5d6835f455546ab ELFEDIT_CMDOA_F_VALUE = 2, /* Item has a value arg following */
d29b2c4438482eb00488be49a1f5d6835f455546ab ELFEDIT_CMDOA_F_MULT = 4, /* More than one are allowed */
d29b2c4438482eb00488be49a1f5d6835f455546ab ELFEDIT_CMDOA_F_INHERIT = 8, /* Inherit definition: See above */
d29b2c4438482eb00488be49a1f5d6835f455546ab} elfedit_cmd_oa_flag_t;
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546abtypedef u_longlong_t elfedit_cmd_oa_mask_t;
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546abtypedef struct {
d29b2c4438482eb00488be49a1f5d6835f455546ab const char *oa_name; /* Name of option */
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_i18nhdl_t oa_help; /* Help text for option */
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_cmd_oa_flag_t oa_flags; /* Additional attributes */
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_cmd_oa_mask_t oa_idmask; /* Unique id, returned by */
d29b2c4438482eb00488be49a1f5d6835f455546ab /* elfedit_getopt */
d29b2c4438482eb00488be49a1f5d6835f455546ab /* for use by caller */
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_cmd_oa_mask_t oa_excmask; /* Mutual exclusion mask */
d29b2c4438482eb00488be49a1f5d6835f455546ab} elfedit_cmd_optarg_t;
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab/*
d29b2c4438482eb00488be49a1f5d6835f455546ab * These values define the standard options and arguments that a module
d29b2c4438482eb00488be49a1f5d6835f455546ab * can inherit using the ELFEDIT_CMDOA_F_INHERIT flag (described above).
d29b2c4438482eb00488be49a1f5d6835f455546ab * New items must be added at the end --- reordering the list will
d29b2c4438482eb00488be49a1f5d6835f455546ab * require all modules to be rebuilt.
d29b2c4438482eb00488be49a1f5d6835f455546ab *
d29b2c4438482eb00488be49a1f5d6835f455546ab * Note: 0 cannot be used as a ELFEDIT_STDOA_ value, because a NULL
d29b2c4438482eb00488be49a1f5d6835f455546ab * value of oa_name is used to terminate argument and options lists.
d29b2c4438482eb00488be49a1f5d6835f455546ab * Therefore, these values start at 1.
d29b2c4438482eb00488be49a1f5d6835f455546ab */
d29b2c4438482eb00488be49a1f5d6835f455546ab#define ELFEDIT_STDOA_OPT_O ((const char *) 1) /* -o ostyle */
d29b2c4438482eb00488be49a1f5d6835f455546ab#define ELFEDIT_STDOA_OPT_AND ((const char *) 2) /* -and */
d29b2c4438482eb00488be49a1f5d6835f455546ab#define ELFEDIT_STDOA_OPT_CMP ((const char *) 3) /* -cmp */
d29b2c4438482eb00488be49a1f5d6835f455546ab#define ELFEDIT_STDOA_OPT_OR ((const char *) 4) /* -or */
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab#define ELFEDIT_NUM_STDOA 4 /* # of ELFEDIT_STDOA_ definitions */
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab/*
d29b2c4438482eb00488be49a1f5d6835f455546ab * Definition of a command
d29b2c4438482eb00488be49a1f5d6835f455546ab *
d29b2c4438482eb00488be49a1f5d6835f455546ab * This structure includes an elfedit_cmd_func_t pointer, which has
d29b2c4438482eb00488be49a1f5d6835f455546ab * different definitions for different ELFCLASS. Rather than needlessly
d29b2c4438482eb00488be49a1f5d6835f455546ab * complicate the code with three versions of this type, and any
d29b2c4438482eb00488be49a1f5d6835f455546ab * type that uses it, we simply use the GenericClass type. elfedit
d29b2c4438482eb00488be49a1f5d6835f455546ab * will always cast this to the correct type before calling a module.
d29b2c4438482eb00488be49a1f5d6835f455546ab *
d29b2c4438482eb00488be49a1f5d6835f455546ab * cmd_name is an array of pointers to the names for the command.
d29b2c4438482eb00488be49a1f5d6835f455546ab * The "primary" name should always be first, followed by any alias
d29b2c4438482eb00488be49a1f5d6835f455546ab * names. The final element of the array must be a NULL pointer,
d29b2c4438482eb00488be49a1f5d6835f455546ab * which terminates the list. Every command is required to have at
d29b2c4438482eb00488be49a1f5d6835f455546ab * least one name, so code is allowed to assume that the first element
d29b2c4438482eb00488be49a1f5d6835f455546ab * of cmd_name is non-NULL, and contains the primary name.
d29b2c4438482eb00488be49a1f5d6835f455546ab *
d29b2c4438482eb00488be49a1f5d6835f455546ab * Many modules provide a "default" command, which is a command
d29b2c4438482eb00488be49a1f5d6835f455546ab * that is run if only the module name is specified, followed
d29b2c4438482eb00488be49a1f5d6835f455546ab * by a colon (i.e. "sym:"). The way this is implemented is to
d29b2c4438482eb00488be49a1f5d6835f455546ab * give the desired default command an empty string as an alias.
d29b2c4438482eb00488be49a1f5d6835f455546ab * Note that the primary name cannot be an empty string, only the
d29b2c4438482eb00488be49a1f5d6835f455546ab * alias name.
d29b2c4438482eb00488be49a1f5d6835f455546ab *
d29b2c4438482eb00488be49a1f5d6835f455546ab * cmd_opts and cmd_args are each an array of elfedit_cmd_argdesc_t
d29b2c4438482eb00488be49a1f5d6835f455546ab * structures, that describe the options and plain arguments accepted
d29b2c4438482eb00488be49a1f5d6835f455546ab * by the command. These arrays are used to general help text for
d29b2c4438482eb00488be49a1f5d6835f455546ab * the commands. The cmd_opts array is also used to provide command
d29b2c4438482eb00488be49a1f5d6835f455546ab * completion for options. Both of these arrays are terminated by
d29b2c4438482eb00488be49a1f5d6835f455546ab * a final NULL element (all fields zero).
d29b2c4438482eb00488be49a1f5d6835f455546ab */
d29b2c4438482eb00488be49a1f5d6835f455546abtypedef struct {
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit32_cmd_func_t *cmd_func; /* Implementation */
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit32_cmdcpl_func_t *cmd_cplfunc; /* Completion function */
d29b2c4438482eb00488be49a1f5d6835f455546ab const char **cmd_name; /* Cmd names (null term.) */
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_i18nhdl_t cmd_desc; /* Short desc. of cmd purpose */
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_i18nhdl_t cmd_help; /* Help text for the command */
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_cmd_optarg_t *cmd_opt; /* Options */
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_cmd_optarg_t *cmd_args; /* Plain arguments */
d29b2c4438482eb00488be49a1f5d6835f455546ab} elfedit32_cmd_t;
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546abtypedef struct {
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit64_cmd_func_t *cmd_func;
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit64_cmdcpl_func_t *cmd_cplfunc;
d29b2c4438482eb00488be49a1f5d6835f455546ab const char **cmd_name;
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_i18nhdl_t cmd_desc;
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_i18nhdl_t cmd_help;
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_cmd_optarg_t *cmd_opt;
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_cmd_optarg_t *cmd_args;
d29b2c4438482eb00488be49a1f5d6835f455546ab} elfedit64_cmd_t;
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab#ifdef _ELF64
d29b2c4438482eb00488be49a1f5d6835f455546ab#define elfedit_cmd_t elfedit64_cmd_t
d29b2c4438482eb00488be49a1f5d6835f455546ab#else
d29b2c4438482eb00488be49a1f5d6835f455546ab#define elfedit_cmd_t elfedit32_cmd_t
d29b2c4438482eb00488be49a1f5d6835f455546ab#endif
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab/*
d29b2c4438482eb00488be49a1f5d6835f455546ab * elfedit modules version themselves so that we can alter the definition
d29b2c4438482eb00488be49a1f5d6835f455546ab * of elfedit_module_t in a backward compatible way.
d29b2c4438482eb00488be49a1f5d6835f455546ab */
d29b2c4438482eb00488be49a1f5d6835f455546abtypedef enum {
d29b2c4438482eb00488be49a1f5d6835f455546ab ELFEDIT_VER_NONE = 0,
d29b2c4438482eb00488be49a1f5d6835f455546ab ELFEDIT_VER_CURRENT = 1,
d29b2c4438482eb00488be49a1f5d6835f455546ab ELFEDIT_VER_NUM = 2
d29b2c4438482eb00488be49a1f5d6835f455546ab} elfedit_module_version_t;
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab/*
d29b2c4438482eb00488be49a1f5d6835f455546ab * Each module returns a pointer to an elfedit_module_t, describing
d29b2c4438482eb00488be49a1f5d6835f455546ab * what commands the module provides.
d29b2c4438482eb00488be49a1f5d6835f455546ab *
d29b2c4438482eb00488be49a1f5d6835f455546ab * Note: mod_cmds is a NULL terminated array of command defs. This
d29b2c4438482eb00488be49a1f5d6835f455546ab * means that the final element in the array should have all of its
d29b2c4438482eb00488be49a1f5d6835f455546ab * fields set to NULL.
d29b2c4438482eb00488be49a1f5d6835f455546ab *
d29b2c4438482eb00488be49a1f5d6835f455546ab * The mod_i18nhdl_to_str function pointer is explained above
d29b2c4438482eb00488be49a1f5d6835f455546ab * with the definition of elfedit_i18nhdl_t.
d29b2c4438482eb00488be49a1f5d6835f455546ab */
d29b2c4438482eb00488be49a1f5d6835f455546abtypedef const char *(* elfedit_mod_i18nhdl_to_str_func_t)(elfedit_i18nhdl_t);
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546abtypedef struct {
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_module_version_t mod_version; /* version */
d29b2c4438482eb00488be49a1f5d6835f455546ab const char *mod_name; /* Name of module */
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_i18nhdl_t mod_desc; /* Short desc. of mod purpose */
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit32_cmd_t *mod_cmds; /* Array of command defs */
d29b2c4438482eb00488be49a1f5d6835f455546ab /* i18n -> (char *) fcn */
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_mod_i18nhdl_to_str_func_t mod_i18nhdl_to_str;
d29b2c4438482eb00488be49a1f5d6835f455546ab} elfedit32_module_t;
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546abtypedef struct {
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_module_version_t mod_version;
d29b2c4438482eb00488be49a1f5d6835f455546ab const char *mod_name;
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_i18nhdl_t mod_desc;
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit64_cmd_t *mod_cmds;
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_mod_i18nhdl_to_str_func_t mod_i18nhdl_to_str;
d29b2c4438482eb00488be49a1f5d6835f455546ab} elfedit64_module_t;
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab#ifdef _ELF64
d29b2c4438482eb00488be49a1f5d6835f455546ab#define elfedit_module_t elfedit64_module_t
d29b2c4438482eb00488be49a1f5d6835f455546ab#else
d29b2c4438482eb00488be49a1f5d6835f455546ab#define elfedit_module_t elfedit32_module_t
d29b2c4438482eb00488be49a1f5d6835f455546ab#endif
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab/*
d29b2c4438482eb00488be49a1f5d6835f455546ab * Each module is a sharable library, expected to provide a single global
d29b2c4438482eb00488be49a1f5d6835f455546ab * function, named elfedit_init(), with the following prototype.
d29b2c4438482eb00488be49a1f5d6835f455546ab */
d29b2c4438482eb00488be49a1f5d6835f455546abtypedef elfedit_module_t *elfedit_init_func_t(elfedit_module_version_t version);
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab
cce0e03bb2d07f0fe27cabb93acae9c23655859fab/*
cce0e03bb2d07f0fe27cabb93acae9c23655859fab * Prototype for elfedit_write(), and for outfunc argument
cce0e03bb2d07f0fe27cabb93acae9c23655859fab * to elfedit_str_to_c_literal().
cce0e03bb2d07f0fe27cabb93acae9c23655859fab */
cce0e03bb2d07f0fe27cabb93acae9c23655859fabtypedef void elfedit_write_func_t(const void *ptr, size_t size);
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab/*
d29b2c4438482eb00488be49a1f5d6835f455546ab * Core elfedit functions exported for use by modules
d29b2c4438482eb00488be49a1f5d6835f455546ab */
d29b2c4438482eb00488be49a1f5d6835f455546abextern void elfedit_command_usage(void);
d29b2c4438482eb00488be49a1f5d6835f455546abextern void elfedit_cpl_command(void *cpldata);
d29b2c4438482eb00488be49a1f5d6835f455546abextern void elfedit_cpl_match(void *cpldata, const char *str, int casefold);
55ef6355bc6375ad080b10b10660e3528e2b7e6aabextern void elfedit_cpl_ndx(void *cpldata, uint_t ndx);
d29b2c4438482eb00488be49a1f5d6835f455546abextern void elfedit_elferr(const char *file, const char *libelf_rtn_name);
d29b2c4438482eb00488be49a1f5d6835f455546abextern elfedit_flag_t elfedit_flags(void);
d29b2c4438482eb00488be49a1f5d6835f455546abextern void *elfedit_malloc(const char *item_name, size_t size);
d29b2c4438482eb00488be49a1f5d6835f455546abextern void elfedit_msg(elfedit_msg_t type, const char *format, ...);
d29b2c4438482eb00488be49a1f5d6835f455546abextern elfedit_outstyle_t elfedit_outstyle(void);
d29b2c4438482eb00488be49a1f5d6835f455546abextern void elfedit_pager_init(void);
d29b2c4438482eb00488be49a1f5d6835f455546abextern void elfedit_printf(const char *format, ...);
d29b2c4438482eb00488be49a1f5d6835f455546abextern void *elfedit_realloc(const char *item_name, void *ptr, size_t size);
cce0e03bb2d07f0fe27cabb93acae9c23655859fabextern void elfedit_str_to_c_literal(const char *str,
cce0e03bb2d07f0fe27cabb93acae9c23655859fab elfedit_write_func_t *outfunc);
cce0e03bb2d07f0fe27cabb93acae9c23655859fabextern elfedit_write_func_t elfedit_write;
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab/*
d29b2c4438482eb00488be49a1f5d6835f455546ab * Core elfedit functions exported for use by sys: module only
d29b2c4438482eb00488be49a1f5d6835f455546ab */
d29b2c4438482eb00488be49a1f5d6835f455546abextern void elfedit_cpl_module(void *cpldata, int load_all_modules);
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab/*
d29b2c4438482eb00488be49a1f5d6835f455546ab * elfedit modules are expected to define two functions, one for
d29b2c4438482eb00488be49a1f5d6835f455546ab * each ELFCLASS. Define a generic name for this function, based on
d29b2c4438482eb00488be49a1f5d6835f455546ab * the class being supported by the including module.
d29b2c4438482eb00488be49a1f5d6835f455546ab */
d29b2c4438482eb00488be49a1f5d6835f455546ab#ifdef _ELF64
d29b2c4438482eb00488be49a1f5d6835f455546ab#define elfedit_init elfedit64_init
d29b2c4438482eb00488be49a1f5d6835f455546ab#else
d29b2c4438482eb00488be49a1f5d6835f455546ab#define elfedit_init elfedit32_init
d29b2c4438482eb00488be49a1f5d6835f455546ab#endif
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab/*
d29b2c4438482eb00488be49a1f5d6835f455546ab * It is common to search the dynamic section for specific elements.
d29b2c4438482eb00488be49a1f5d6835f455546ab * Structures of this type are used to represent the contents of such
d29b2c4438482eb00488be49a1f5d6835f455546ab * elements in a systematic way. The elfedit_dyn_elt_init() function
d29b2c4438482eb00488be49a1f5d6835f455546ab * is used to prepare these strucutres for use.
d29b2c4438482eb00488be49a1f5d6835f455546ab */
d29b2c4438482eb00488be49a1f5d6835f455546abtypedef struct {
d29b2c4438482eb00488be49a1f5d6835f455546ab int dn_seen; /* True if this item has been seen */
d29b2c4438482eb00488be49a1f5d6835f455546ab Elf32_Word dn_ndx; /* Index of item in dynamic array */
d29b2c4438482eb00488be49a1f5d6835f455546ab Elf32_Dyn dn_dyn; /* Contents of dynamic item */
d29b2c4438482eb00488be49a1f5d6835f455546ab} elfedit32_dyn_elt_t;
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546abtypedef struct {
d29b2c4438482eb00488be49a1f5d6835f455546ab int dn_seen;
d29b2c4438482eb00488be49a1f5d6835f455546ab Elf64_Word dn_ndx;
d29b2c4438482eb00488be49a1f5d6835f455546ab Elf64_Dyn dn_dyn;
d29b2c4438482eb00488be49a1f5d6835f455546ab} elfedit64_dyn_elt_t;
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab#ifdef _ELF64
d29b2c4438482eb00488be49a1f5d6835f455546ab#define elfedit_dyn_elt_t elfedit64_dyn_elt_t
d29b2c4438482eb00488be49a1f5d6835f455546ab#else
d29b2c4438482eb00488be49a1f5d6835f455546ab#define elfedit_dyn_elt_t elfedit32_dyn_elt_t
d29b2c4438482eb00488be49a1f5d6835f455546ab#endif
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab/*
d29b2c4438482eb00488be49a1f5d6835f455546ab * The elfedit_atoi() and elfedit_atoui() functions can optionally
d29b2c4438482eb00488be49a1f5d6835f455546ab * accept an array of these structures, giving symbolic names that
d29b2c4438482eb00488be49a1f5d6835f455546ab * will be accepted instead of numeric codes. If such an array is
d29b2c4438482eb00488be49a1f5d6835f455546ab * present, the supplied string has it's leading and trailing whitespace
d29b2c4438482eb00488be49a1f5d6835f455546ab * removed and is then compared to the list, and if there is a match,
d29b2c4438482eb00488be49a1f5d6835f455546ab * the corresponding integer value is returned.
d29b2c4438482eb00488be49a1f5d6835f455546ab *
d29b2c4438482eb00488be49a1f5d6835f455546ab * The final array element must have its name field set to NULL.
d29b2c4438482eb00488be49a1f5d6835f455546ab */
d29b2c4438482eb00488be49a1f5d6835f455546abtypedef u_longlong_t elfedit_atoui_t;
d29b2c4438482eb00488be49a1f5d6835f455546abtypedef struct {
d29b2c4438482eb00488be49a1f5d6835f455546ab const char *sym_name;
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_atoui_t sym_value;
d29b2c4438482eb00488be49a1f5d6835f455546ab} elfedit_atoui_sym_t;
d29b2c4438482eb00488be49a1f5d6835f455546abtypedef longlong_t elfedit_atoi_t;
d29b2c4438482eb00488be49a1f5d6835f455546abtypedef struct {
d29b2c4438482eb00488be49a1f5d6835f455546ab const char *sym_name;
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_atoi_t sym_value;
d29b2c4438482eb00488be49a1f5d6835f455546ab} elfedit_atoi_sym_t;
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab/*
d29b2c4438482eb00488be49a1f5d6835f455546ab * The elfedit_atoconst*() functions are built on top of the atoui routines.
d29b2c4438482eb00488be49a1f5d6835f455546ab * These routines accept an elfedit_const_t code instead of a
d29b2c4438482eb00488be49a1f5d6835f455546ab * pointer to an elfedit_atoui_sym_t array, and use internally
d29b2c4438482eb00488be49a1f5d6835f455546ab * predefined tables of elfedit_atoui_sym_t in order to do the desired
d29b2c4438482eb00488be49a1f5d6835f455546ab * mappings. elfedit modules are encouraged to use these standard
d29b2c4438482eb00488be49a1f5d6835f455546ab * tables instead of defining their own elfedit_atoui_sym_t arrays.
d29b2c4438482eb00488be49a1f5d6835f455546ab *
d29b2c4438482eb00488be49a1f5d6835f455546ab * note:
d29b2c4438482eb00488be49a1f5d6835f455546ab * - The values assigned here must be in agreement with the
d29b2c4438482eb00488be49a1f5d6835f455546ab * sym_table[] array defined in elfconst.c.
d29b2c4438482eb00488be49a1f5d6835f455546ab * - Once defined, these values must not change. Reordering the
d29b2c4438482eb00488be49a1f5d6835f455546ab * list will require all modules to be rebuilt, and will
d29b2c4438482eb00488be49a1f5d6835f455546ab * break backward compatability. New items should be
d29b2c4438482eb00488be49a1f5d6835f455546ab * added to the end.
d29b2c4438482eb00488be49a1f5d6835f455546ab */
d29b2c4438482eb00488be49a1f5d6835f455546abtypedef enum {
d29b2c4438482eb00488be49a1f5d6835f455546ab ELFEDIT_CONST_OUTSTYLE = 0, /* elfedit output styles */
d29b2c4438482eb00488be49a1f5d6835f455546ab ELFEDIT_CONST_OUTSTYLE_MO = 1, /* ostyles with -o prefix */
d29b2c4438482eb00488be49a1f5d6835f455546ab ELFEDIT_CONST_BOOL = 2, /* boolean names */
4f680cc668fa6cf678c531083400ade9a9c7934cAli Bahrami ELFEDIT_CONST_SHT_STRTAB = 3, /* ELF SHT_STRTAB */
4f680cc668fa6cf678c531083400ade9a9c7934cAli Bahrami ELFEDIT_CONST_SHT_SYMTAB = 4, /* ELF SHT_SYMTAB */
4f680cc668fa6cf678c531083400ade9a9c7934cAli Bahrami ELFEDIT_CONST_SHT_DYNSYM = 5, /* ELF SHT_DYNSYM */
4f680cc668fa6cf678c531083400ade9a9c7934cAli Bahrami ELFEDIT_CONST_SHT_LDYNSYM = 6, /* ELF SHT_SUNW_LDYNSYM */
4f680cc668fa6cf678c531083400ade9a9c7934cAli Bahrami ELFEDIT_CONST_SHN = 7, /* ELF SHN_ section indexes */
4f680cc668fa6cf678c531083400ade9a9c7934cAli Bahrami ELFEDIT_CONST_SHT = 8, /* ELF SHT_ section types */
4f680cc668fa6cf678c531083400ade9a9c7934cAli Bahrami ELFEDIT_CONST_SHT_ALLSYMTAB = 9, /* ELF SHT_ symbol table */
d29b2c4438482eb00488be49a1f5d6835f455546ab /* section types */
d29b2c4438482eb00488be49a1f5d6835f455546ab ELFEDIT_CONST_DT = 10, /* Dynamic tags: DT_ */
d29b2c4438482eb00488be49a1f5d6835f455546ab ELFEDIT_CONST_DF = 11, /* DT_FLAGS bits */
d29b2c4438482eb00488be49a1f5d6835f455546ab ELFEDIT_CONST_DF_P1 = 12, /* DF_POSFLAG_1 bits */
d29b2c4438482eb00488be49a1f5d6835f455546ab ELFEDIT_CONST_DF_1 = 13, /* DT_FLAGS_1 bits */
d29b2c4438482eb00488be49a1f5d6835f455546ab ELFEDIT_CONST_DTF_1 = 14, /* DT_FEATURE_1 bits */
d29b2c4438482eb00488be49a1f5d6835f455546ab ELFEDIT_CONST_EI = 15, /* ELF header e_ident indexes */
d29b2c4438482eb00488be49a1f5d6835f455546ab ELFEDIT_CONST_ET = 16, /* Ehdr obj type */
d29b2c4438482eb00488be49a1f5d6835f455546ab ELFEDIT_CONST_ELFCLASS = 17, /* Ehdr wordsize (32,64) */
d29b2c4438482eb00488be49a1f5d6835f455546ab ELFEDIT_CONST_ELFDATA = 18, /* Ehdr endian */
d29b2c4438482eb00488be49a1f5d6835f455546ab ELFEDIT_CONST_EF = 19, /* Ehdr flags */
d29b2c4438482eb00488be49a1f5d6835f455546ab ELFEDIT_CONST_EV = 20, /* Ehdr version */
d29b2c4438482eb00488be49a1f5d6835f455546ab ELFEDIT_CONST_EM = 21, /* Ehdr machine */
d29b2c4438482eb00488be49a1f5d6835f455546ab ELFEDIT_CONST_ELFOSABI = 22, /* Ehdr ABI */
4f680cc668fa6cf678c531083400ade9a9c7934cAli Bahrami ELFEDIT_CONST_EAV = 23, /* Ehdr ABI version */
4f680cc668fa6cf678c531083400ade9a9c7934cAli Bahrami ELFEDIT_CONST_PT = 24, /* Phdr type */
4f680cc668fa6cf678c531083400ade9a9c7934cAli Bahrami ELFEDIT_CONST_PF = 25, /* Phdr flags */
4f680cc668fa6cf678c531083400ade9a9c7934cAli Bahrami ELFEDIT_CONST_SHF = 26, /* Shdr flags */
4f680cc668fa6cf678c531083400ade9a9c7934cAli Bahrami ELFEDIT_CONST_STB = 27, /* Sym binding */
4f680cc668fa6cf678c531083400ade9a9c7934cAli Bahrami ELFEDIT_CONST_STT = 28, /* Sym type */
4f680cc668fa6cf678c531083400ade9a9c7934cAli Bahrami ELFEDIT_CONST_STV = 29, /* Sym visibility */
4f680cc668fa6cf678c531083400ade9a9c7934cAli Bahrami ELFEDIT_CONST_SYMINFO_BT = 30, /* Syminfo boundto */
4f680cc668fa6cf678c531083400ade9a9c7934cAli Bahrami ELFEDIT_CONST_SYMINFO_FLG = 31, /* Syminfo flags */
4f680cc668fa6cf678c531083400ade9a9c7934cAli Bahrami ELFEDIT_CONST_CA = 32, /* Capabilities tags */
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans ELFEDIT_CONST_HW1_SUNW = 33, /* hardware capabilities */
d29b2c4438482eb00488be49a1f5d6835f455546ab ELFEDIT_CONST_SF1_SUNW = 34, /* software capabilities */
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans ELFEDIT_CONST_HW2_SUNW = 35, /* hardware capabilities */
4f680cc668fa6cf678c531083400ade9a9c7934cAli Bahrami
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans ELFEDIT_CONST_NUM = 36, /* # of constant types */
d29b2c4438482eb00488be49a1f5d6835f455546ab} elfedit_const_t;
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab/*
d29b2c4438482eb00488be49a1f5d6835f455546ab * Given an elfedit_const_t, return the array of elfedit_atoui_sym_t
d29b2c4438482eb00488be49a1f5d6835f455546ab * entries that it represents.
d29b2c4438482eb00488be49a1f5d6835f455546ab */
d29b2c4438482eb00488be49a1f5d6835f455546abextern elfedit_atoui_sym_t *elfedit_const_to_atoui(elfedit_const_t const_type);
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab/*
d29b2c4438482eb00488be49a1f5d6835f455546ab * ato[u]i and const routines, used to turn strings into numeric values,
d29b2c4438482eb00488be49a1f5d6835f455546ab * with support for mapping symbol names to numbers, and range checking.
d29b2c4438482eb00488be49a1f5d6835f455546ab */
d29b2c4438482eb00488be49a1f5d6835f455546abextern elfedit_atoi_t elfedit_atoi(const char *str,
d29b2c4438482eb00488be49a1f5d6835f455546ab const elfedit_atoi_sym_t *sym);
d29b2c4438482eb00488be49a1f5d6835f455546abextern elfedit_atoui_t elfedit_atoui(const char *str,
d29b2c4438482eb00488be49a1f5d6835f455546ab const elfedit_atoui_sym_t *sym);
d29b2c4438482eb00488be49a1f5d6835f455546abextern elfedit_atoui_t elfedit_atoconst(const char *str,
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_const_t const_type);
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546abextern int elfedit_atoi2(const char *str, const elfedit_atoi_sym_t *sym,
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_atoi_t *v);
d29b2c4438482eb00488be49a1f5d6835f455546abextern int elfedit_atoui2(const char *str, const elfedit_atoui_sym_t *sym,
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_atoui_t *);
d29b2c4438482eb00488be49a1f5d6835f455546abextern int elfedit_atoconst2(const char *str, elfedit_const_t const_type,
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_atoui_t *);
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546abextern elfedit_atoi_t elfedit_atoi_range(const char *str,
d29b2c4438482eb00488be49a1f5d6835f455546ab const char *item_name, elfedit_atoi_t min, elfedit_atoi_t max,
d29b2c4438482eb00488be49a1f5d6835f455546ab const elfedit_atoi_sym_t *sym);
d29b2c4438482eb00488be49a1f5d6835f455546abextern elfedit_atoui_t elfedit_atoui_range(const char *str,
d29b2c4438482eb00488be49a1f5d6835f455546ab const char *item_name, elfedit_atoui_t min, elfedit_atoui_t max,
d29b2c4438482eb00488be49a1f5d6835f455546ab const elfedit_atoui_sym_t *sym);
d29b2c4438482eb00488be49a1f5d6835f455546abextern elfedit_atoui_t elfedit_atoconst_range(const char *str,
d29b2c4438482eb00488be49a1f5d6835f455546ab const char *item_name, elfedit_atoui_t min, elfedit_atoui_t max,
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_const_t const_type);
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546abextern int elfedit_atoi_range2(const char *str, elfedit_atoi_t min,
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_atoi_t max, const elfedit_atoi_sym_t *sym, elfedit_atoi_t *v);
d29b2c4438482eb00488be49a1f5d6835f455546abextern int elfedit_atoui_range2(const char *str, elfedit_atoui_t min,
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_atoui_t max, const elfedit_atoui_sym_t *sym, elfedit_atoui_t *v);
d29b2c4438482eb00488be49a1f5d6835f455546abextern int elfedit_atoconst_range2(const char *str, elfedit_atoui_t min,
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_atoui_t max, elfedit_const_t const_type, elfedit_atoui_t *v);
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546abextern const char *elfedit_atoi_value_to_str(const elfedit_atoi_sym_t *sym,
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_atoi_t value, int required);
d29b2c4438482eb00488be49a1f5d6835f455546abextern const char *elfedit_atoui_value_to_str(const elfedit_atoui_sym_t *sym,
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_atoui_t value, int required);
d29b2c4438482eb00488be49a1f5d6835f455546abextern const char *elfedit_atoconst_value_to_str(elfedit_const_t const_type,
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_atoui_t value, int required);
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546abextern void elfedit_cpl_atoi(void *cpldata, const elfedit_atoi_sym_t *sym);
d29b2c4438482eb00488be49a1f5d6835f455546abextern void elfedit_cpl_atoui(void *cpldata, const elfedit_atoui_sym_t *sym);
d29b2c4438482eb00488be49a1f5d6835f455546abextern void elfedit_cpl_atoconst(void *cpldata, elfedit_const_t const_type);
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab/*
d29b2c4438482eb00488be49a1f5d6835f455546ab * Convenience functions built on top of the ato[u]i routines.
d29b2c4438482eb00488be49a1f5d6835f455546ab */
d29b2c4438482eb00488be49a1f5d6835f455546abextern int elfedit_atobool(const char *str, const char *item_name);
d29b2c4438482eb00488be49a1f5d6835f455546abextern elfedit_atoui_t elfedit_atoshndx(const char *str, size_t shnum);
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab/*
d29b2c4438482eb00488be49a1f5d6835f455546ab * elfedit provides a getopt utility for use by the module commands.
d29b2c4438482eb00488be49a1f5d6835f455546ab * elfedit_getopt_state_t is the state block used by elfedit_getopt().
d29b2c4438482eb00488be49a1f5d6835f455546ab * elfedit_getopt_ret_t is the definition of the values returned to
d29b2c4438482eb00488be49a1f5d6835f455546ab * the user by elfedit_getopt() when an option is matched. Elfedit
d29b2c4438482eb00488be49a1f5d6835f455546ab * getopt processing is done as follows:
d29b2c4438482eb00488be49a1f5d6835f455546ab *
d29b2c4438482eb00488be49a1f5d6835f455546ab * 1) The caller initializes an elfedit_getopt_state_t struct via
d29b2c4438482eb00488be49a1f5d6835f455546ab * a call to elfedit_getopt_init(). The contents of this structure
d29b2c4438482eb00488be49a1f5d6835f455546ab * must not be accessed by the caller, as they are all private and
d29b2c4438482eb00488be49a1f5d6835f455546ab * subject to change.
d29b2c4438482eb00488be49a1f5d6835f455546ab * 2) Repeated calls are made to elfedit_getopt(), as long as it returns
d29b2c4438482eb00488be49a1f5d6835f455546ab * a non-NULL pointer to an elfedit_getopt_ret_t structure. If the
d29b2c4438482eb00488be49a1f5d6835f455546ab * matched option has a value (ELFEDIT_CMDOA_F_VALUE), then the gor_value
d29b2c4438482eb00488be49a1f5d6835f455546ab * field contains the pointer to the string. Otherwise, gor_value is NULL.
d29b2c4438482eb00488be49a1f5d6835f455546ab * 3) As elfedit_getopt() consumes optional arguments from the argc/argv
d29b2c4438482eb00488be49a1f5d6835f455546ab * passed to elfedit_getopt_init(), it adjusts argc/argc to skip over
d29b2c4438482eb00488be49a1f5d6835f455546ab * them. Once elfedit_getopt() returns NULL to indicate that there are no
d29b2c4438482eb00488be49a1f5d6835f455546ab * more options to match, argc/argv have been adjusted so that they
d29b2c4438482eb00488be49a1f5d6835f455546ab * reference the plain arguments.
d29b2c4438482eb00488be49a1f5d6835f455546ab */
d29b2c4438482eb00488be49a1f5d6835f455546abtypedef struct {
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_cmd_oa_mask_t gor_idmask; /* oa_idmask from matching */
d29b2c4438482eb00488be49a1f5d6835f455546ab /* elfedit_cmd_optarg_t. Can be */
d29b2c4438482eb00488be49a1f5d6835f455546ab /* used to quickly identify opt */
d29b2c4438482eb00488be49a1f5d6835f455546ab const char *gor_value; /* Opt value if ELFEDIT_CMDOA_F_VALUE */
d29b2c4438482eb00488be49a1f5d6835f455546ab /* Otherwise, NULL */
d29b2c4438482eb00488be49a1f5d6835f455546ab} elfedit_getopt_ret_t;
d29b2c4438482eb00488be49a1f5d6835f455546abtypedef struct {
d29b2c4438482eb00488be49a1f5d6835f455546ab int *go_argc; /* Pointer to # of options */
d29b2c4438482eb00488be49a1f5d6835f455546ab const char ***go_argv; /* Ptr to array of opt strs */
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_cmd_optarg_t *go_optarg; /* Array of allowed options */
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_cmd_oa_mask_t go_idmask; /* Combined id masks of all */
d29b2c4438482eb00488be49a1f5d6835f455546ab /* seen options */
d29b2c4438482eb00488be49a1f5d6835f455546ab int go_done; /* True if last option seen */
d29b2c4438482eb00488be49a1f5d6835f455546ab const char *go_sglgrp; /* Group of 1-letter opts */
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_getopt_ret_t go_ret; /* Data returned to user */
d29b2c4438482eb00488be49a1f5d6835f455546ab} elfedit_getopt_state_t;
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab/*
d29b2c4438482eb00488be49a1f5d6835f455546ab * getopt related routines
d29b2c4438482eb00488be49a1f5d6835f455546ab */
d29b2c4438482eb00488be49a1f5d6835f455546abextern void elfedit_getopt_init(elfedit_getopt_state_t *,
d29b2c4438482eb00488be49a1f5d6835f455546ab int *, const char ***);
d29b2c4438482eb00488be49a1f5d6835f455546abextern elfedit_getopt_ret_t *elfedit_getopt(elfedit_getopt_state_t *);
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab/*
d29b2c4438482eb00488be49a1f5d6835f455546ab * Additional utility functions exported for use by modules
d29b2c4438482eb00488be49a1f5d6835f455546ab */
d29b2c4438482eb00488be49a1f5d6835f455546abextern void elfedit_array_elts_delete(const char *name_str, void *data_start,
d29b2c4438482eb00488be49a1f5d6835f455546ab size_t entsize, size_t num_ent, size_t start_ndx, size_t cnt);
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546abextern void elfedit_array_elts_move(const char *name_str, void *data_start,
d29b2c4438482eb00488be49a1f5d6835f455546ab size_t entsize, size_t num_ent, size_t srcndx,
d29b2c4438482eb00488be49a1f5d6835f455546ab size_t dstndx, size_t cnt, void *scr_item);
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546abextern int elfedit_bits_set(u_longlong_t v, int sizeof_orig_v);
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546abextern void elfedit32_dyn_elt_init(elfedit32_dyn_elt_t *dyn_elt);
d29b2c4438482eb00488be49a1f5d6835f455546abextern void elfedit64_dyn_elt_init(elfedit64_dyn_elt_t *dyn_elt);
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546abextern void elfedit32_dyn_elt_save(elfedit32_dyn_elt_t *elt, Elf32_Word ndx,
d29b2c4438482eb00488be49a1f5d6835f455546ab Elf32_Dyn *dyn);
d29b2c4438482eb00488be49a1f5d6835f455546abextern void elfedit64_dyn_elt_save(elfedit64_dyn_elt_t *elt, Elf64_Word ndx,
d29b2c4438482eb00488be49a1f5d6835f455546ab Elf64_Dyn *dyn);
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546abconst char *elfedit32_dyn_offset_to_str(elfedit32_section_t *strsec,
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit32_dyn_elt_t *dynelt);
d29b2c4438482eb00488be49a1f5d6835f455546abconst char *elfedit64_dyn_offset_to_str(elfedit64_section_t *strsec,
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit64_dyn_elt_t *dynelt);
d29b2c4438482eb00488be49a1f5d6835f455546ab
4f680cc668fa6cf678c531083400ade9a9c7934cAli Bahramiextern int elfedit32_dynstr_getpad(elfedit32_obj_state_t *obj_state,
4f680cc668fa6cf678c531083400ade9a9c7934cAli Bahrami elfedit32_section_t *dynsec, elfedit32_dyn_elt_t *dyn_strpad);
4f680cc668fa6cf678c531083400ade9a9c7934cAli Bahramiextern int elfedit64_dynstr_getpad(elfedit64_obj_state_t *obj_state,
4f680cc668fa6cf678c531083400ade9a9c7934cAli Bahrami elfedit64_section_t *dynsec, elfedit64_dyn_elt_t *dyn_strpad);
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546abextern Elf32_Word elfedit32_dynstr_insert(elfedit32_section_t *dynsec,
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit32_section_t *strsec, elfedit32_dyn_elt_t *dyn_strpad,
d29b2c4438482eb00488be49a1f5d6835f455546ab const char *str);
d29b2c4438482eb00488be49a1f5d6835f455546abextern Elf64_Word elfedit64_dynstr_insert(elfedit64_section_t *dynsec,
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit64_section_t *strsec, elfedit64_dyn_elt_t *dyn_strpad,
d29b2c4438482eb00488be49a1f5d6835f455546ab const char *str);
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546abextern void elfedit32_modified_data(elfedit32_section_t *s);
d29b2c4438482eb00488be49a1f5d6835f455546abextern void elfedit64_modified_data(elfedit64_section_t *s);
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546abextern void elfedit32_modified_ehdr(elfedit32_obj_state_t *obj_state);
d29b2c4438482eb00488be49a1f5d6835f455546abextern void elfedit64_modified_ehdr(elfedit64_obj_state_t *obj_state);
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546abextern void elfedit32_modified_phdr(elfedit32_obj_state_t *obj_state);
d29b2c4438482eb00488be49a1f5d6835f455546abextern void elfedit64_modified_phdr(elfedit64_obj_state_t *obj_state);
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546abextern void elfedit32_modified_shdr(elfedit32_section_t *s);
d29b2c4438482eb00488be49a1f5d6835f455546abextern void elfedit64_modified_shdr(elfedit64_section_t *s);
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546abextern Elf32_Word elfedit32_name_to_shndx(elfedit32_obj_state_t *obj_state,
d29b2c4438482eb00488be49a1f5d6835f455546ab const char *shnam);
d29b2c4438482eb00488be49a1f5d6835f455546abextern Elf64_Word elfedit64_name_to_shndx(elfedit64_obj_state_t *obj_state,
d29b2c4438482eb00488be49a1f5d6835f455546ab const char *shnam);
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546abextern int elfedit32_name_to_symndx(elfedit32_section_t *symsec,
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit32_section_t *strsec, const char *name, elfedit_msg_t msg_type,
d29b2c4438482eb00488be49a1f5d6835f455546ab Elf32_Word *ret_symndx);
d29b2c4438482eb00488be49a1f5d6835f455546abextern int elfedit64_name_to_symndx(elfedit64_section_t *symsec,
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit64_section_t *strsec, const char *name, elfedit_msg_t msg_type,
d29b2c4438482eb00488be49a1f5d6835f455546ab Elf64_Word *ret_symndx);
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546abextern const char *elfedit32_offset_to_str(elfedit32_section_t *strsec,
d29b2c4438482eb00488be49a1f5d6835f455546ab Elf32_Word offset, elfedit_msg_t msg_type, int debug_msg);
d29b2c4438482eb00488be49a1f5d6835f455546abextern const char *elfedit64_offset_to_str(elfedit64_section_t *strsec,
d29b2c4438482eb00488be49a1f5d6835f455546ab Elf64_Word offset, elfedit_msg_t msg_type, int debug_msg);
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546abextern int elfedit32_sec_findstr(elfedit32_section_t *sec, Elf32_Word tail_ign,
d29b2c4438482eb00488be49a1f5d6835f455546ab const char *str, Elf32_Word *ret_offset);
d29b2c4438482eb00488be49a1f5d6835f455546abextern int elfedit64_sec_findstr(elfedit64_section_t *sec, Elf64_Word tail_ign,
d29b2c4438482eb00488be49a1f5d6835f455546ab const char *str, Elf64_Word *ret_offset);
d29b2c4438482eb00488be49a1f5d6835f455546ab
cce0e03bb2d07f0fe27cabb93acae9c23655859fabextern elfedit32_section_t *elfedit32_sec_get(
cce0e03bb2d07f0fe27cabb93acae9c23655859fab elfedit32_obj_state_t *obj_state, Elf32_Word shndx);
cce0e03bb2d07f0fe27cabb93acae9c23655859fabextern elfedit64_section_t *elfedit64_sec_get(
cce0e03bb2d07f0fe27cabb93acae9c23655859fab elfedit64_obj_state_t *obj_state, Elf64_Word shndx);
cce0e03bb2d07f0fe27cabb93acae9c23655859fab
d29b2c4438482eb00488be49a1f5d6835f455546abextern elfedit32_section_t *elfedit32_sec_getcap(
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit32_obj_state_t *obj_state, Elf32_Cap **cap, Elf32_Word *num);
d29b2c4438482eb00488be49a1f5d6835f455546abextern elfedit64_section_t *elfedit64_sec_getcap(
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit64_obj_state_t *obj_state, Elf64_Cap **cap, Elf64_Word *num);
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546abextern elfedit32_section_t *elfedit32_sec_getdyn(
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit32_obj_state_t *obj_state, Elf32_Dyn **dyn, Elf32_Word *num);
d29b2c4438482eb00488be49a1f5d6835f455546abextern elfedit64_section_t *elfedit64_sec_getdyn(
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit64_obj_state_t *obj_state, Elf64_Dyn **dyn, Elf64_Word *num);
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546abextern elfedit32_section_t *elfedit32_sec_getstr(
55ef6355bc6375ad080b10b10660e3528e2b7e6aab elfedit32_obj_state_t *obj_state, Elf32_Word shndx, int);
d29b2c4438482eb00488be49a1f5d6835f455546abextern elfedit64_section_t *elfedit64_sec_getstr(
55ef6355bc6375ad080b10b10660e3528e2b7e6aab elfedit64_obj_state_t *obj_state, Elf64_Word shndx, int);
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546abextern elfedit32_section_t *elfedit32_sec_getsyminfo(
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit32_obj_state_t *obj_state, Elf32_Syminfo **syminfo, Elf32_Word *num);
d29b2c4438482eb00488be49a1f5d6835f455546abextern elfedit64_section_t *elfedit64_sec_getsyminfo(
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit64_obj_state_t *obj_state, Elf64_Syminfo **syminfo, Elf64_Word *num);
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546abextern elfedit32_section_t *elfedit32_sec_getsymtab(
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit32_obj_state_t *obj_state, int by_index, Elf32_Word index,
d29b2c4438482eb00488be49a1f5d6835f455546ab const char *name, Elf32_Sym **sym, Elf32_Word *num,
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit32_symtab_t **aux_info);
d29b2c4438482eb00488be49a1f5d6835f455546abextern elfedit64_section_t *elfedit64_sec_getsymtab(
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit64_obj_state_t *obj_state, int by_index, Elf64_Word index,
d29b2c4438482eb00488be49a1f5d6835f455546ab const char *name, Elf64_Sym **sym, Elf64_Word *num,
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit64_symtab_t **aux_info);
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546abextern elfedit32_section_t *elfedit32_sec_getversym(
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit32_obj_state_t *obj_state, elfedit32_section_t *symsec,
d29b2c4438482eb00488be49a1f5d6835f455546ab Elf32_Versym **versym, Elf32_Word *num);
d29b2c4438482eb00488be49a1f5d6835f455546abextern elfedit64_section_t *elfedit64_sec_getversym(
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit64_obj_state_t *obj_state, elfedit64_section_t *symsec,
d29b2c4438482eb00488be49a1f5d6835f455546ab Elf64_Versym **versym, Elf64_Word *num);
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546abextern elfedit32_section_t *elfedit32_sec_getxshndx(
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit32_obj_state_t *obj_state, elfedit32_section_t *symsec,
d29b2c4438482eb00488be49a1f5d6835f455546ab Elf32_Word **xshndx, Elf32_Word *num);
d29b2c4438482eb00488be49a1f5d6835f455546abextern elfedit64_section_t *elfedit64_sec_getxshndx(
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit64_obj_state_t *obj_state, elfedit64_section_t *symsec,
d29b2c4438482eb00488be49a1f5d6835f455546ab Elf64_Word **xshndx, Elf64_Word *num);
d29b2c4438482eb00488be49a1f5d6835f455546ab
4f680cc668fa6cf678c531083400ade9a9c7934cAli Bahramiextern int elfedit32_sec_issymtab(elfedit32_obj_state_t *obj_state,
4f680cc668fa6cf678c531083400ade9a9c7934cAli Bahrami elfedit32_section_t *sec, int issue_err, elfedit_atoui_sym_t **atoui_list);
4f680cc668fa6cf678c531083400ade9a9c7934cAli Bahramiextern int elfedit64_sec_issymtab(elfedit64_obj_state_t *obj_state,
4f680cc668fa6cf678c531083400ade9a9c7934cAli Bahrami elfedit64_section_t *sec, int issue_err, elfedit_atoui_sym_t **atoui_list);
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546abextern const char *elfedit32_sec_msgprefix(elfedit32_section_t *sec);
d29b2c4438482eb00488be49a1f5d6835f455546abextern const char *elfedit64_sec_msgprefix(elfedit64_section_t *sec);
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546abextern const char *elfedit32_shndx_to_name(elfedit32_obj_state_t *obj_state,
d29b2c4438482eb00488be49a1f5d6835f455546ab Elf32_Word shndx);
d29b2c4438482eb00488be49a1f5d6835f455546abextern const char *elfedit64_shndx_to_name(elfedit64_obj_state_t *obj_state,
d29b2c4438482eb00488be49a1f5d6835f455546ab Elf64_Word shndx);
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546abextern Elf32_Word elfedit32_strtab_insert(elfedit32_obj_state_t *obj_state,
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit32_section_t *strsec, elfedit32_section_t *dynsec, const char *str);
d29b2c4438482eb00488be49a1f5d6835f455546abextern Elf64_Word elfedit64_strtab_insert(elfedit64_obj_state_t *obj_state,
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit64_section_t *strsec, elfedit64_section_t *dynsec, const char *str);
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546abextern void elfedit32_strtab_insert_test(elfedit32_obj_state_t *obj_state,
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit32_section_t *strsec, elfedit32_section_t *dynsec, const char *str);
d29b2c4438482eb00488be49a1f5d6835f455546abextern void elfedit64_strtab_insert_test(elfedit64_obj_state_t *obj_state,
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit64_section_t *strsec, elfedit64_section_t *dynsec, const char *str);
d29b2c4438482eb00488be49a1f5d6835f455546ab
4f680cc668fa6cf678c531083400ade9a9c7934cAli Bahramiextern int elfedit32_test_osabi(elfedit32_obj_state_t *obj_state, uchar_t osabi,
4f680cc668fa6cf678c531083400ade9a9c7934cAli Bahrami int issue_err);
4f680cc668fa6cf678c531083400ade9a9c7934cAli Bahramiextern int elfedit64_test_osabi(elfedit64_obj_state_t *obj_state, uchar_t osabi,
4f680cc668fa6cf678c531083400ade9a9c7934cAli Bahrami int issue_err);
4f680cc668fa6cf678c531083400ade9a9c7934cAli Bahrami
d29b2c4438482eb00488be49a1f5d6835f455546abextern Elf32_Word elfedit32_type_to_shndx(elfedit32_obj_state_t *obj_state,
d29b2c4438482eb00488be49a1f5d6835f455546ab Elf32_Word shtype);
d29b2c4438482eb00488be49a1f5d6835f455546abextern Elf64_Word elfedit64_type_to_shndx(elfedit64_obj_state_t *obj_state,
d29b2c4438482eb00488be49a1f5d6835f455546ab Elf64_Word shtype);
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab/*
d29b2c4438482eb00488be49a1f5d6835f455546ab * Map the generic names for each of the ELFCLASS specific routines
d29b2c4438482eb00488be49a1f5d6835f455546ab * above to reference the proper routine for the current compilation.
d29b2c4438482eb00488be49a1f5d6835f455546ab */
d29b2c4438482eb00488be49a1f5d6835f455546ab#ifdef _ELF64
d29b2c4438482eb00488be49a1f5d6835f455546ab#define elfedit_dyn_elt_init elfedit64_dyn_elt_init
d29b2c4438482eb00488be49a1f5d6835f455546ab#define elfedit_dyn_elt_save elfedit64_dyn_elt_save
d29b2c4438482eb00488be49a1f5d6835f455546ab#define elfedit_dyn_offset_to_str elfedit64_dyn_offset_to_str
d29b2c4438482eb00488be49a1f5d6835f455546ab#define elfedit_dynstr_getpad elfedit64_dynstr_getpad
d29b2c4438482eb00488be49a1f5d6835f455546ab#define elfedit_dynstr_insert elfedit64_dynstr_insert
d29b2c4438482eb00488be49a1f5d6835f455546ab#define elfedit_modified_data elfedit64_modified_data
d29b2c4438482eb00488be49a1f5d6835f455546ab#define elfedit_modified_ehdr elfedit64_modified_ehdr
d29b2c4438482eb00488be49a1f5d6835f455546ab#define elfedit_modified_phdr elfedit64_modified_phdr
d29b2c4438482eb00488be49a1f5d6835f455546ab#define elfedit_modified_shdr elfedit64_modified_shdr
d29b2c4438482eb00488be49a1f5d6835f455546ab#define elfedit_name_to_shndx elfedit64_name_to_shndx
d29b2c4438482eb00488be49a1f5d6835f455546ab#define elfedit_name_to_symndx elfedit64_name_to_symndx
d29b2c4438482eb00488be49a1f5d6835f455546ab#define elfedit_offset_to_str elfedit64_offset_to_str
d29b2c4438482eb00488be49a1f5d6835f455546ab#define elfedit_sec_findstr elfedit64_sec_findstr
cce0e03bb2d07f0fe27cabb93acae9c23655859fab#define elfedit_sec_get elfedit64_sec_get
d29b2c4438482eb00488be49a1f5d6835f455546ab#define elfedit_sec_getcap elfedit64_sec_getcap
d29b2c4438482eb00488be49a1f5d6835f455546ab#define elfedit_sec_getdyn elfedit64_sec_getdyn
d29b2c4438482eb00488be49a1f5d6835f455546ab#define elfedit_sec_getstr elfedit64_sec_getstr
d29b2c4438482eb00488be49a1f5d6835f455546ab#define elfedit_sec_getsyminfo elfedit64_sec_getsyminfo
d29b2c4438482eb00488be49a1f5d6835f455546ab#define elfedit_sec_getsymtab elfedit64_sec_getsymtab
d29b2c4438482eb00488be49a1f5d6835f455546ab#define elfedit_sec_getversym elfedit64_sec_getversym
d29b2c4438482eb00488be49a1f5d6835f455546ab#define elfedit_sec_getxshndx elfedit64_sec_getxshndx
d29b2c4438482eb00488be49a1f5d6835f455546ab#define elfedit_sec_issymtab elfedit64_sec_issymtab
d29b2c4438482eb00488be49a1f5d6835f455546ab#define elfedit_shndx_to_name elfedit64_shndx_to_name
d29b2c4438482eb00488be49a1f5d6835f455546ab#define elfedit_sec_msgprefix elfedit64_sec_msgprefix
d29b2c4438482eb00488be49a1f5d6835f455546ab#define elfedit_strtab_insert elfedit64_strtab_insert
d29b2c4438482eb00488be49a1f5d6835f455546ab#define elfedit_strtab_insert_test elfedit64_strtab_insert_test
4f680cc668fa6cf678c531083400ade9a9c7934cAli Bahrami#define elfedit_test_osabi elfedit64_test_osabi
d29b2c4438482eb00488be49a1f5d6835f455546ab#define elfedit_type_to_shndx elfedit64_type_to_shndx
d29b2c4438482eb00488be49a1f5d6835f455546ab#else
d29b2c4438482eb00488be49a1f5d6835f455546ab#define elfedit_dyn_elt_init elfedit32_dyn_elt_init
d29b2c4438482eb00488be49a1f5d6835f455546ab#define elfedit_dyn_elt_save elfedit32_dyn_elt_save
d29b2c4438482eb00488be49a1f5d6835f455546ab#define elfedit_dyn_offset_to_str elfedit32_dyn_offset_to_str
d29b2c4438482eb00488be49a1f5d6835f455546ab#define elfedit_dynstr_getpad elfedit32_dynstr_getpad
d29b2c4438482eb00488be49a1f5d6835f455546ab#define elfedit_dynstr_insert elfedit32_dynstr_insert
d29b2c4438482eb00488be49a1f5d6835f455546ab#define elfedit_modified_data elfedit32_modified_data
d29b2c4438482eb00488be49a1f5d6835f455546ab#define elfedit_modified_ehdr elfedit32_modified_ehdr
d29b2c4438482eb00488be49a1f5d6835f455546ab#define elfedit_modified_phdr elfedit32_modified_phdr
d29b2c4438482eb00488be49a1f5d6835f455546ab#define elfedit_modified_shdr elfedit32_modified_shdr
d29b2c4438482eb00488be49a1f5d6835f455546ab#define elfedit_name_to_shndx elfedit32_name_to_shndx
d29b2c4438482eb00488be49a1f5d6835f455546ab#define elfedit_name_to_symndx elfedit32_name_to_symndx
d29b2c4438482eb00488be49a1f5d6835f455546ab#define elfedit_offset_to_str elfedit32_offset_to_str
d29b2c4438482eb00488be49a1f5d6835f455546ab#define elfedit_sec_findstr elfedit32_sec_findstr
cce0e03bb2d07f0fe27cabb93acae9c23655859fab#define elfedit_sec_get elfedit32_sec_get
d29b2c4438482eb00488be49a1f5d6835f455546ab#define elfedit_sec_getcap elfedit32_sec_getcap
d29b2c4438482eb00488be49a1f5d6835f455546ab#define elfedit_sec_getdyn elfedit32_sec_getdyn
d29b2c4438482eb00488be49a1f5d6835f455546ab#define elfedit_sec_getstr elfedit32_sec_getstr
d29b2c4438482eb00488be49a1f5d6835f455546ab#define elfedit_sec_getsyminfo elfedit32_sec_getsyminfo
d29b2c4438482eb00488be49a1f5d6835f455546ab#define elfedit_sec_getsymtab elfedit32_sec_getsymtab
d29b2c4438482eb00488be49a1f5d6835f455546ab#define elfedit_sec_getversym elfedit32_sec_getversym
d29b2c4438482eb00488be49a1f5d6835f455546ab#define elfedit_sec_getxshndx elfedit32_sec_getxshndx
d29b2c4438482eb00488be49a1f5d6835f455546ab#define elfedit_sec_issymtab elfedit32_sec_issymtab
d29b2c4438482eb00488be49a1f5d6835f455546ab#define elfedit_shndx_to_name elfedit32_shndx_to_name
d29b2c4438482eb00488be49a1f5d6835f455546ab#define elfedit_sec_msgprefix elfedit32_sec_msgprefix
d29b2c4438482eb00488be49a1f5d6835f455546ab#define elfedit_strtab_insert elfedit32_strtab_insert
d29b2c4438482eb00488be49a1f5d6835f455546ab#define elfedit_strtab_insert_test elfedit32_strtab_insert_test
4f680cc668fa6cf678c531083400ade9a9c7934cAli Bahrami#define elfedit_test_osabi elfedit32_test_osabi
d29b2c4438482eb00488be49a1f5d6835f455546ab#define elfedit_type_to_shndx elfedit32_type_to_shndx
d29b2c4438482eb00488be49a1f5d6835f455546ab#endif
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab#ifdef __cplusplus
d29b2c4438482eb00488be49a1f5d6835f455546ab}
d29b2c4438482eb00488be49a1f5d6835f455546ab#endif
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab#endif /* _ELFEDIT_H */