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
  37 extern "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 
 104 typedef 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 
 112 typedef 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 
 119 extern  const Cache      cache_init;
 120 
 121 extern  void            failure(const char *, const char *);
 122 extern  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  */
 147 typedef 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 
 158 extern int      match(match_flags_t, const char *, uint_t, uint_t);
 159 
 160 /*
 161  * Possible return values from corenote()
 162  */
 163 typedef 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 
 225 extern  corenote_ret_t  corenote(Half, int, Word, const char *, Word);
 226 extern  void    dump_eh_frame(const char *, char *, uchar_t *, size_t, uint64_t,
 227                     Half e_machine, uchar_t *e_ident, uint64_t gotaddr);
 228 extern  void    dump_hex_bytes(const void *, size_t, int, int, int);
 229 
 230 extern  int     fake_shdr_cache32(const char *, int, Elf *, Elf32_Ehdr *,
 231                     Cache **, size_t *);
 232 extern  int     fake_shdr_cache64(const char *, int, Elf *, Elf64_Ehdr *,
 233                     Cache **, size_t *);
 234 
 235 extern  void    fake_shdr_cache_free32(Cache *, size_t);
 236 extern  void    fake_shdr_cache_free64(Cache *, size_t);
 237 
 238 extern  int     regular32(const char *, int, Elf *, uint_t, const char *, int,
 239                     uchar_t);
 240 extern  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 */