_elfdump.h revision 9273:9a0603d78ad3
1/* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 22/* 23 * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 27#ifndef __ELFDUMP_H 28#define __ELFDUMP_H 29 30#include <_machelf.h> 31#include <debug.h> 32 33/* 34 * Local include file for elfdump. 35 */ 36#ifdef __cplusplus 37extern "C" { 38#endif 39 40/* 41 * flags: This is a bitmask that controls elfdump's operations. There 42 * are three categories of flag: 43 * 44 * SHOW - Specify categories of things in the ELF object to display. 45 * CALC - Compute something based on the contents of the ELF object. 46 * CTL - Control options specify general options that are not 47 * specific to any specific part of the ELF object, but 48 * which apply at a higher level. 49 * 50 * To simplify masking these categories, they are assigned bit ranges 51 * as follows: 52 * SHOW: Bottom 24-bits 53 * CALC: Upper 2 bits of most significant byte 54 * CTL: Lower 6 bits of most significant byte 55 */ 56#define FLG_SHOW_DYNAMIC 0x00000001 57#define FLG_SHOW_EHDR 0x00000002 58#define FLG_SHOW_INTERP 0x00000004 59#define FLG_SHOW_SHDR 0x00000008 60#define FLG_SHOW_NOTE 0x00000010 61#define FLG_SHOW_PHDR 0x00000020 62#define FLG_SHOW_RELOC 0x00000040 63#define FLG_SHOW_SYMBOLS 0x00000080 64#define FLG_SHOW_VERSIONS 0x00000100 65#define FLG_SHOW_HASH 0x00000200 66#define FLG_SHOW_GOT 0x00000400 67#define FLG_SHOW_SYMINFO 0x00000800 68#define FLG_SHOW_MOVE 0x00001000 69#define FLG_SHOW_GROUP 0x00002000 70#define FLG_SHOW_CAP 0x00004000 71#define FLG_SHOW_UNWIND 0x00008000 72#define FLG_SHOW_SORT 0x00010000 73 74#define FLG_CTL_LONGNAME 0x01000000 75#define FLG_CTL_DEMANGLE 0x02000000 76#define FLG_CTL_FAKESHDR 0x04000000 77#define FLG_CTL_MATCH 0x08000000 78#define FLG_CTL_OSABI 0x10000000 79 80#define FLG_CALC_CHECKSUM 0x40000000 81 82/* Bitmasks that isolate the parts of a flag value */ 83#define FLG_MASK_SHOW 0x00ffffff 84#define FLG_MASK_CTL 0x3f000000 85#define FLG_MASK_CALC 0xc0000000 86 87/* 88 * Mask that selects the show flags that do not require the ELF 89 * object to have a section header array. 90 */ 91#define FLG_MASK_SHOW_NOSHDR (FLG_SHOW_EHDR | FLG_SHOW_PHDR) 92 93/* 94 * Masks to select the flags that require the ELF object to 95 * have a section header array, within each flag type. 96 */ 97#define FLG_MASK_SHOW_SHDR (FLG_MASK_SHOW & ~FLG_MASK_SHOW_NOSHDR) 98#define FLG_MASK_CALC_SHDR FLG_CALC_CHECKSUM 99 100 101/* Size of buffer used for formatting an index into textual representation */ 102#define MAXNDXSIZE 10 103 104typedef struct cache { 105 Elf_Scn *c_scn; 106 Shdr *c_shdr; 107 Elf_Data *c_data; 108 char *c_name; 109 int c_ndx; /* Section index */ 110} Cache; 111 112typedef struct got_info { 113 Word g_reltype; /* it will never happen, but */ 114 /* support mixed relocations */ 115 void *g_rel; 116 const char *g_symname; 117} Got_info; 118 119extern const Cache cache_init; 120 121extern void failure(const char *, const char *); 122extern const char *demangle(const char *, uint_t); 123 124 125/* 126 * Flags for the match() function: 127 * MATCH_F_STRICT 128 * A strict match requires an explicit match to 129 * a user specified match (-I, -N, -T) option. A 130 * non-strict match also succeeds if the match 131 * list is empty. 132 * 133 * MATCH_F_PHDR 134 * The match item is a program header. If this 135 * flag is not set, the match item is a section 136 * header. 137 * 138 * MATCH_F_NAME 139 * The name parameter contains valid information. 140 * 141 * MATCH_F_NDX 142 * The ndx argument contains valid information 143 * 144 * MATCH_F_TYPE 145 * The type argument contains valid information 146 */ 147typedef enum { 148 MATCH_F_STRICT = 1, 149 MATCH_F_PHDR = 2, 150 MATCH_F_NAME = 4, 151 MATCH_F_NDX = 8, 152 MATCH_F_TYPE = 16 153} match_flags_t; 154 155/* It is common for calls to match() to specify all three arguments */ 156#define MATCH_F_ALL (MATCH_F_NAME | MATCH_F_NDX | MATCH_F_TYPE) 157 158extern int match(match_flags_t, const char *, uint_t, uint_t); 159 160/* 161 * Possible return values from corenote() 162 */ 163typedef enum { 164 CORENOTE_R_OK = 0, /* Note data successfully displayed */ 165 CORENOTE_R_OK_DUMP = 1, /* Note OK, but not handled. Display Hex dump */ 166 CORENOTE_R_BADDATA = 2, /* Note data truncated or otherwise malformed */ 167 CORENOTE_R_BADARCH = 3, /* core file note code does not contain */ 168 /* support for given architecture */ 169 CORENOTE_R_BADTYPE = 4 /* Unknown note type */ 170} corenote_ret_t; 171 172/* 173 * Define various elfdump() functions into their 32-bit and 64-bit variants. 174 */ 175#if defined(_ELF64) 176#define cap cap64 177#define checksum checksum64 178#define dynamic dynamic64 179#define fake_shdr_cache fake_shdr_cache64 180#define fake_shdr_cache_free fake_shdr_cache_free64 181#define got got64 182#define group group64 183#define hash hash64 184#define interp interp64 185#define move move64 186#define note note64 187#define note_entry note_entry64 188#define regular regular64 189#define reloc reloc64 190#define sections sections64 191#define string string64 192#define symbols symbols64 193#define syminfo syminfo64 194#define symlookup symlookup64 195#define unwind unwind64 196#define versions versions64 197#define version_def version_def64 198#define version_need version_need64 199#else 200#define cap cap32 201#define checksum checksum32 202#define dynamic dynamic32 203#define fake_shdr_cache fake_shdr_cache32 204#define fake_shdr_cache_free fake_shdr_cache_free32 205#define got got32 206#define group group32 207#define hash hash32 208#define interp interp32 209#define move move32 210#define note note32 211#define note_entry note_entry32 212#define regular regular32 213#define reloc reloc32 214#define sections sections32 215#define string string32 216#define symbols symbols32 217#define syminfo syminfo32 218#define symlookup symlookup32 219#define unwind unwind32 220#define versions versions32 221#define version_def version_def32 222#define version_need version_need32 223#endif 224 225extern corenote_ret_t corenote(Half, int, Word, const char *, Word); 226extern void dump_eh_frame(uchar_t *, size_t, uint64_t, Half e_machine, 227 uchar_t *e_ident); 228extern void dump_hex_bytes(const void *, size_t, int, int, int); 229 230extern int fake_shdr_cache32(const char *, int, Elf *, Elf32_Ehdr *, 231 Cache **, size_t *); 232extern int fake_shdr_cache64(const char *, int, Elf *, Elf64_Ehdr *, 233 Cache **, size_t *); 234 235extern void fake_shdr_cache_free32(Cache *, size_t); 236extern void fake_shdr_cache_free64(Cache *, size_t); 237 238extern int regular32(const char *, int, Elf *, uint_t, const char *, int, 239 uchar_t); 240extern int regular64(const char *, int, Elf *, uint_t, const char *, int, 241 uchar_t); 242 243#ifdef __cplusplus 244} 245#endif 246 247#endif /* __ELFDUMP_H */ 248