Home | History | Annotate | Download | only in common
      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(uchar_t *, size_t, uint64_t, Half e_machine,
    227 		    uchar_t *e_ident);
    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 */
    248