_elfdump.h revision 7e16fca05dfbcfd32c2ebc9e4d1abdac1cd8657c
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
#ifndef __ELFDUMP_H
#define __ELFDUMP_H
#include <_machelf.h>
#include <debug.h>
/*
* Local include file for elfdump.
*/
#ifdef __cplusplus
extern "C" {
#endif
/*
* flags: This is a bitmask that controls elfdump's operations. There
* are three categories of flag:
*
* SHOW - Specify categories of things in the ELF object to display.
* CALC - Compute something based on the contents of the ELF object.
* CTL - Control options specify general options that are not
* specific to any specific part of the ELF object, but
* which apply at a higher level.
*
* To simplify masking these categories, they are assigned bit ranges
* as follows:
* SHOW: Bottom 24-bits
* CALC: Upper nibble of most significant byte
* CTL: Lower nibble of most significant byte
*/
#define FLG_SHOW_DYNAMIC 0x00000001
#define FLG_SHOW_EHDR 0x00000002
#define FLG_SHOW_INTERP 0x00000004
#define FLG_SHOW_SHDR 0x00000008
#define FLG_SHOW_NOTE 0x00000010
#define FLG_SHOW_PHDR 0x00000020
#define FLG_SHOW_RELOC 0x00000040
#define FLG_SHOW_SYMBOLS 0x00000080
#define FLG_SHOW_VERSIONS 0x00000100
#define FLG_SHOW_HASH 0x00000200
#define FLG_SHOW_GOT 0x00000400
#define FLG_SHOW_SYMINFO 0x00000800
#define FLG_SHOW_MOVE 0x00001000
#define FLG_SHOW_GROUP 0x00002000
#define FLG_SHOW_CAP 0x00004000
#define FLG_SHOW_UNWIND 0x00008000
#define FLG_SHOW_SORT 0x00010000
#define FLG_CTL_LONGNAME 0x01000000
#define FLG_CTL_DEMANGLE 0x02000000
#define FLG_CTL_FAKESHDR 0x04000000
#define FLG_CTL_MATCH 0x08000000
#define FLG_CALC_CHECKSUM 0x10000000
/* Bitmasks that isolate the parts of a flag value */
#define FLG_MASK_SHOW 0x00ffffff
#define FLG_MASK_CTL 0x0f000000
#define FLG_MASK_CALC 0xf0000000
/*
* Mask that selects the show flags that do not require the ELF
* object to have a section header array.
*/
#define FLG_MASK_SHOW_NOSHDR (FLG_SHOW_EHDR | FLG_SHOW_PHDR)
/*
* Masks to select the flags that require the ELF object to
* have a section header array, within each flag type.
*/
#define FLG_MASK_SHOW_SHDR (FLG_MASK_SHOW & ~FLG_MASK_SHOW_NOSHDR)
#define FLG_MASK_CALC_SHDR FLG_CALC_CHECKSUM
/* Size of buffer used for formatting an index into textual representation */
#define MAXNDXSIZE 10
typedef struct cache {
Elf_Scn *c_scn;
Shdr *c_shdr;
Elf_Data *c_data;
char *c_name;
int c_ndx; /* Section index */
} Cache;
typedef struct got_info {
Word g_reltype; /* it will never happen, but */
/* support mixed relocations */
void *g_rel;
const char *g_symname;
} Got_info;
extern const Cache cache_init;
extern void failure(const char *, const char *);
extern const char *demangle(const char *, uint_t);
/*
* Flags for the match() function:
* MATCH_F_STRICT
* A strict match requires an explicit match to
* a user specified match (-I, -N, -T) option. A
* non-strict match also succeeds if the match
* list is empty.
*
* MATCH_F_PHDR
* The match item is a program header. If this
* flag is not set, the match item is a section
* header.
*
* MATCH_F_NAME
* The name parameter contains valid information.
*
* MATCH_F_NDX
* The ndx argument contains valid information
*
* MATCH_F_TYPE
* The type argument contains valid information
*/
typedef enum {
MATCH_F_STRICT = 1,
MATCH_F_PHDR = 2,
MATCH_F_NAME = 4,
MATCH_F_NDX = 8,
MATCH_F_TYPE = 16
} match_flags_t;
/* It is common for calls to match() to specify all three arguments */
#define MATCH_F_ALL (MATCH_F_NAME | MATCH_F_NDX | MATCH_F_TYPE)
extern int match(match_flags_t, const char *, uint_t, uint_t);
/*
* Possible return values from corenote()
*/
typedef enum {
CORENOTE_R_OK = 0, /* Note data successfully displayed */
CORENOTE_R_OK_DUMP = 1, /* Note OK, but not handled. Display Hex dump */
CORENOTE_R_BADDATA = 2, /* Note data truncated or otherwise malformed */
CORENOTE_R_BADARCH = 3, /* core file note code does not contain */
/* support for given architecture */
CORENOTE_R_BADTYPE = 4 /* Unknown note type */
} corenote_ret_t;
/*
* Define various elfdump() functions into their 32-bit and 64-bit variants.
*/
#if defined(_ELF64)
#define cap cap64
#define checksum checksum64
#define dynamic dynamic64
#define fake_shdr_cache fake_shdr_cache64
#define fake_shdr_cache_free fake_shdr_cache_free64
#define got got64
#define group group64
#define hash hash64
#define interp interp64
#define move move64
#define note note64
#define note_entry note_entry64
#define regular regular64
#define reloc reloc64
#define sections sections64
#define string string64
#define symbols symbols64
#define syminfo syminfo64
#define symlookup symlookup64
#define unwind unwind64
#define versions versions64
#define version_def version_def64
#define version_need version_need64
#else
#define cap cap32
#define checksum checksum32
#define dynamic dynamic32
#define fake_shdr_cache fake_shdr_cache32
#define fake_shdr_cache_free fake_shdr_cache_free32
#define got got32
#define group group32
#define hash hash32
#define interp interp32
#define move move32
#define note note32
#define note_entry note_entry32
#define regular regular32
#define reloc reloc32
#define sections sections32
#define string string32
#define symbols symbols32
#define syminfo syminfo32
#define symlookup symlookup32
#define unwind unwind32
#define versions versions32
#define version_def version_def32
#define version_need version_need32
#endif
extern corenote_ret_t corenote(Half, int, Word, const char *, Word);
extern void dump_eh_frame(uchar_t *, size_t, uint64_t, Half e_machine,
uchar_t *e_ident);
extern void dump_hex_bytes(const void *, size_t, int, int, int);
extern int fake_shdr_cache32(const char *, int, Elf *, Elf32_Ehdr *,
Cache **, size_t *);
extern int fake_shdr_cache64(const char *, int, Elf *, Elf64_Ehdr *,
Cache **, size_t *);
extern void fake_shdr_cache_free32(Cache *, size_t);
extern void fake_shdr_cache_free64(Cache *, size_t);
extern int regular32(const char *, int, Elf *, uint_t, const char *, int);
extern int regular64(const char *, int, Elf *, uint_t, const char *, int);
#ifdef __cplusplus
}
#endif
#endif /* __ELFDUMP_H */