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 /* LINTLIBRARY */
     27 /* PROTOLIB1 */
     28 
     29 #include	<stdlib.h>
     30 #include	<libelf.h>
     31 #include	<_machelf.h>
     32 #include	<sgs.h>
     33 #include	<libld.h>
     34 #include	<conv.h>
     35 
     36 /*
     37  * Generic miscellaneous interfaces
     38  */
     39 uchar_t		conv_check_native(char **, char **);
     40 const char	*conv_lddstub(int);
     41 int		conv_sys_eclass(void);
     42 int		conv_strproc_isspace(int);
     43 char		*conv_strproc_trim(char *);
     44 Boolean		conv_strproc_extract_value(char *, size_t, int, const char **);
     45 
     46 
     47 /*
     48  * Generic core formatting and iteration functionality
     49  */
     50 conv_iter_ret_t	_conv_iter_ds(conv_iter_osabi_t, Half, const conv_ds_t **,
     51 		    conv_iter_cb_t, void *, const char *);
     52 conv_iter_ret_t	_conv_iter_ds_msg(const conv_ds_msg_t *, conv_iter_cb_t,
     53 		    void *, const char *);
     54 conv_iter_ret_t	_conv_iter_msgarr(Conv_elfvalue_t, const Msg *, size_t,
     55 		    conv_iter_cb_t, void *, const char *);
     56 conv_iter_ret_t	_conv_iter_vd(const Val_desc *, conv_iter_cb_t,
     57 		    void *, const char *);
     58 conv_iter_ret_t	_conv_iter_vd2(conv_iter_osabi_t, Half, const Val_desc2 *,
     59 		    conv_iter_cb_t, void *, const char *);
     60 int		conv_iter_strtol_init(const char *, conv_strtol_uvalue_t *);
     61 conv_iter_ret_t	conv_iter_strtol(const char *, Conv_elfvalue_t, void *);
     62 const char	*_conv_map2str(Conv_inv_buf_t *, Conv_elfvalue_t,
     63 		    Conv_fmt_flags_t, size_t, const Msg *, const char *);
     64 const char	*_conv_map_ds(uchar_t, Half, Conv_elfvalue_t,
     65 		    const conv_ds_t **, Conv_fmt_flags_t, Conv_inv_buf_t *,
     66 		    const char *);
     67 const char	*_conv_map_vd2str(Conv_inv_buf_t *, Conv_elfvalue_t,
     68 		    Conv_fmt_flags_t, const Val_desc *, const char *);
     69 const char	*_conv_map_vd22str(Conv_inv_buf_t *, uchar_t, Half,
     70 		    Conv_elfvalue_t, Conv_fmt_flags_t, const Val_desc2 *,
     71 		    const char *);
     72 
     73 /*
     74  * Generic formatting interfaces.
     75  */
     76 const char	*conv_bnd_obj(uint_t, Conv_bnd_obj_buf_t *);
     77 const char	*conv_bnd_type(uint_t, Conv_bnd_type_buf_t *);
     78 const char	*conv_config_feat(int, Conv_config_feat_buf_t *);
     79 const char	*conv_config_obj(ushort_t, Conv_config_obj_buf_t *);
     80 const char	*conv_config_upm(const char *, const char *,
     81 		    const char *, size_t);
     82 const char	*conv_cnote_auxv_af(Word, Conv_fmt_flags_t,
     83 		    Conv_cnote_auxv_af_buf_t *);
     84 const char	*conv_cnote_auxv_type(Word, Conv_fmt_flags_t, Conv_inv_buf_t *);
     85 const char	*conv_cnote_cc_content(Lword, Conv_fmt_flags_t,
     86 		    Conv_cnote_cc_content_buf_t *);
     87 const char	*conv_cnote_errno(int, Conv_fmt_flags_t, Conv_inv_buf_t *);
     88 const char	*conv_cnote_fault(Word, Conv_fmt_flags_t, Conv_inv_buf_t *);
     89 const char	*conv_cnote_fltset(uint32_t *, int, Conv_fmt_flags_t,
     90 		    Conv_cnote_fltset_buf_t *);
     91 const char	*conv_cnote_old_pr_flags(int, Conv_fmt_flags_t,
     92 		    Conv_cnote_old_pr_flags_buf_t *);
     93 const char	*conv_cnote_pr_dmodel(Word, Conv_fmt_flags_t, Conv_inv_buf_t *);
     94 const char	*conv_cnote_pr_flags(int, Conv_fmt_flags_t,
     95 		    Conv_cnote_pr_flags_buf_t *);
     96 const char	*conv_cnote_proc_flag(int, Conv_fmt_flags_t,
     97 		    Conv_cnote_proc_flag_buf_t *);
     98 const char	*conv_cnote_pr_regname(Half, int, Conv_fmt_flags_t,
     99 		    Conv_inv_buf_t *inv_buf);
    100 const char	*conv_cnote_pr_stype(Word, Conv_fmt_flags_t, Conv_inv_buf_t *);
    101 const char	*conv_cnote_pr_what(short, short, Conv_fmt_flags_t,
    102 		    Conv_inv_buf_t *);
    103 const char	*conv_cnote_pr_why(short, Conv_fmt_flags_t, Conv_inv_buf_t *);
    104 const char	*conv_cnote_priv(int, Conv_fmt_flags_t, Conv_inv_buf_t *);
    105 const char	*conv_cnote_psetid(int, Conv_fmt_flags_t, Conv_inv_buf_t *);
    106 const char	*conv_cnote_sa_flags(int, Conv_fmt_flags_t,
    107 		    Conv_cnote_sa_flags_buf_t *);
    108 const char	*conv_cnote_signal(Word, Conv_fmt_flags_t, Conv_inv_buf_t *);
    109 const char	*conv_cnote_si_code(Half, int, int, Conv_fmt_flags_t,
    110 		    Conv_inv_buf_t *);
    111 const char	*conv_cnote_sigset(uint32_t *, int, Conv_fmt_flags_t,
    112 		    Conv_cnote_sigset_buf_t *);
    113 const char	*conv_cnote_ss_flags(int, Conv_fmt_flags_t,
    114 		    Conv_cnote_ss_flags_buf_t *);
    115 const char	*conv_cnote_syscall(Word, Conv_fmt_flags_t, Conv_inv_buf_t *);
    116 const char	*conv_cnote_sysset(uint32_t *, int, Conv_fmt_flags_t,
    117 		    Conv_cnote_sysset_buf_t *);
    118 const char	*conv_cnote_type(Word, Conv_fmt_flags_t, Conv_inv_buf_t *);
    119 const char	*conv_def_tag(Symref, Conv_inv_buf_t *);
    120 const char	*conv_demangle_name(const char *);
    121 const char	*conv_dl_flag(int, Conv_fmt_flags_t, Conv_dl_flag_buf_t *);
    122 const char	*conv_dl_mode(int, int, Conv_dl_mode_buf_t *);
    123 const char	*conv_dwarf_cfa(uchar_t, Conv_fmt_flags_t, Conv_inv_buf_t *);
    124 const char	*conv_dwarf_ehe(uint_t, Conv_dwarf_ehe_buf_t *);
    125 const char	*conv_dwarf_regname(Half, Word, Conv_fmt_flags_t,
    126 		    int *, Conv_inv_buf_t *);
    127 const char	*conv_ehdr_abivers(uchar_t, Word, Conv_fmt_flags_t,
    128 		    Conv_inv_buf_t *);
    129 const char	*conv_ehdr_class(uchar_t, Conv_fmt_flags_t, Conv_inv_buf_t *);
    130 const char	*conv_ehdr_data(uchar_t, Conv_fmt_flags_t, Conv_inv_buf_t *);
    131 const char	*conv_ehdr_flags(Half, Word, Conv_fmt_flags_t,
    132 		    Conv_ehdr_flags_buf_t *);
    133 const char	*conv_ehdr_mach(Half, Conv_fmt_flags_t, Conv_inv_buf_t *);
    134 const char	*conv_ehdr_osabi(uchar_t, Conv_fmt_flags_t, Conv_inv_buf_t *);
    135 const char	*conv_ehdr_type(uchar_t, Half, Conv_fmt_flags_t,
    136 		    Conv_inv_buf_t *);
    137 const char	*conv_ehdr_vers(Word, Conv_fmt_flags_t, Conv_inv_buf_t *);
    138 const char	*conv_elfdata_type(Elf_Type, Conv_inv_buf_t *);
    139 const char	*conv_grphdl_flags(uint_t, Conv_grphdl_flags_buf_t *);
    140 const char	*conv_grpdesc_flags(uint_t, Conv_grpdesc_flags_buf_t *);
    141 Isa_desc	*conv_isalist(void);
    142 const char	*conv_phdr_flags(uchar_t, Word, Conv_fmt_flags_t,
    143 		    Conv_phdr_flags_buf_t *);
    144 const char	*conv_phdr_type(uchar_t, Half, Word, Conv_fmt_flags_t,
    145 		    Conv_inv_buf_t *);
    146 const char	*conv_reject_desc(Rej_desc *, Conv_reject_desc_buf_t *,
    147 		    Half mach);
    148 const char	*conv_reloc_type(Half, Word, Conv_fmt_flags_t,
    149 		    Conv_inv_buf_t *);
    150 const char	*conv_reloc_type_static(Half, Word, Conv_fmt_flags_t);
    151 const char	*conv_reloc_386_type(Word, Conv_fmt_flags_t, Conv_inv_buf_t *);
    152 const char	*conv_reloc_amd64_type(Word, Conv_fmt_flags_t,
    153 		    Conv_inv_buf_t *);
    154 const char	*conv_reloc_SPARC_type(Word, Conv_fmt_flags_t,
    155 		    Conv_inv_buf_t *);
    156 const char	*conv_sec_type(uchar_t, Half, Word, Conv_fmt_flags_t,
    157 		    Conv_inv_buf_t *);
    158 const char	*conv_seg_flags(Half, Conv_seg_flags_buf_t *);
    159 void		conv_str_to_c_literal(const char *buf, size_t n,
    160 		    Conv_str_to_c_literal_func_t *cb_func, void *uvalue);
    161 const char	*conv_sym_info_bind(uchar_t, Conv_fmt_flags_t,
    162 		    Conv_inv_buf_t *);
    163 const char	*conv_sym_info_type(Half, uchar_t, Conv_fmt_flags_t,
    164 		    Conv_inv_buf_t *);
    165 const char	*conv_sym_shndx(uchar_t, Half, Half, Conv_fmt_flags_t,
    166 		    Conv_inv_buf_t *);
    167 const char	*conv_sym_other(uchar_t, Conv_inv_buf_t *);
    168 const char	*conv_sym_other_vis(uchar_t, Conv_fmt_flags_t,
    169 		    Conv_inv_buf_t *);
    170 const char	*conv_syminfo_boundto(Half, Conv_fmt_flags_t, Conv_inv_buf_t *);
    171 const char	*conv_syminfo_flags(Half, Conv_fmt_flags_t,
    172 		    Conv_syminfo_flags_buf_t *);
    173 const char	*conv_time(struct timeval *, struct timeval *,
    174 		    Conv_time_buf_t *);
    175 Uts_desc	*conv_uts(void);
    176 const char	*conv_ver_flags(Half, Conv_fmt_flags_t, Conv_ver_flags_buf_t *);
    177 const char	*conv_ver_index(Versym, int, Conv_inv_buf_t *);
    178 
    179 
    180 /*
    181  * Generic iteration interfaces.
    182  */
    183 conv_iter_ret_t	conv_iter_cap_tags(Conv_fmt_flags_t, conv_iter_cb_t, void *);
    184 conv_iter_ret_t	conv_iter_cap_val_hw1(Half, Conv_fmt_flags_t,
    185 		    conv_iter_cb_t, void *);
    186 conv_iter_ret_t	conv_iter_cap_val_sf1(Conv_fmt_flags_t, conv_iter_cb_t, void *);
    187 
    188 conv_iter_ret_t	conv_iter_dyn_feature1(Conv_fmt_flags_t,
    189 		    conv_iter_cb_t, void *);
    190 conv_iter_ret_t	conv_iter_dyn_flag(Conv_fmt_flags_t, conv_iter_cb_t, void *);
    191 conv_iter_ret_t	conv_iter_dyn_flag1(Conv_fmt_flags_t, conv_iter_cb_t, void *);
    192 conv_iter_ret_t	conv_iter_dyn_posflag1(Conv_fmt_flags_t,
    193 		    conv_iter_cb_t, void *);
    194 conv_iter_ret_t	conv_iter_dyn_tag(conv_iter_osabi_t, Half,
    195 		    Conv_fmt_flags_t, conv_iter_cb_t, void *);
    196 
    197 conv_iter_ret_t	conv_iter_ehdr_abivers(conv_iter_osabi_t,
    198 		    Conv_fmt_flags_t, conv_iter_cb_t, void *);
    199 conv_iter_ret_t	conv_iter_ehdr_class(Conv_fmt_flags_t, conv_iter_cb_t, void *);
    200 conv_iter_ret_t	conv_iter_ehdr_data(Conv_fmt_flags_t, conv_iter_cb_t, void *);
    201 conv_iter_ret_t	conv_iter_ehdr_eident(Conv_fmt_flags_t, conv_iter_cb_t, void *);
    202 conv_iter_ret_t	conv_iter_ehdr_flags(Half, Conv_fmt_flags_t,
    203 		    conv_iter_cb_t, void *);
    204 conv_iter_ret_t	conv_iter_ehdr_mach(Conv_fmt_flags_t, conv_iter_cb_t, void *);
    205 conv_iter_ret_t	conv_iter_ehdr_osabi(Conv_fmt_flags_t, conv_iter_cb_t, void *);
    206 conv_iter_ret_t	conv_iter_ehdr_type(conv_iter_osabi_t, Conv_fmt_flags_t,
    207 		    conv_iter_cb_t, void *);
    208 conv_iter_ret_t	conv_iter_ehdr_vers(Conv_fmt_flags_t, conv_iter_cb_t, void *);
    209 
    210 conv_iter_ret_t	conv_iter_phdr_flags(conv_iter_osabi_t,
    211 		    Conv_fmt_flags_t, conv_iter_cb_t, void *);
    212 conv_iter_ret_t	conv_iter_phdr_type(conv_iter_osabi_t, Conv_fmt_flags_t,
    213 		    conv_iter_cb_t, void *);
    214 
    215 conv_iter_ret_t	conv_iter_sec_flags(conv_iter_osabi_t, Half,
    216 		    Conv_fmt_flags_t, conv_iter_cb_t, void *);
    217 conv_iter_ret_t	conv_iter_sec_symtab(conv_iter_osabi_t,
    218 		    Conv_fmt_flags_t, conv_iter_cb_t, void *);
    219 conv_iter_ret_t	conv_iter_sec_type(conv_iter_osabi_t, Half,
    220 		    Conv_fmt_flags_t, conv_iter_cb_t, void *);
    221 
    222 conv_iter_ret_t	conv_iter_sym_info_bind(Conv_fmt_flags_t,
    223 		    conv_iter_cb_t, void *);
    224 conv_iter_ret_t	conv_iter_sym_other_vis(Conv_fmt_flags_t,
    225 		    conv_iter_cb_t, void *);
    226 conv_iter_ret_t	conv_iter_sym_shndx(conv_iter_osabi_t, Half,
    227 		    Conv_fmt_flags_t, conv_iter_cb_t, void *);
    228 conv_iter_ret_t	conv_iter_sym_info_type(Half, Conv_fmt_flags_t,
    229 		    conv_iter_cb_t, void *);
    230 
    231 conv_iter_ret_t	conv_iter_syminfo_boundto(Conv_fmt_flags_t,
    232 		    conv_iter_cb_t, void *);
    233 conv_iter_ret_t	conv_iter_syminfo_flags(Conv_fmt_flags_t,
    234 			    conv_iter_cb_t, void *);
    235 
    236 
    237 /*
    238  * ELFCLASS-specific core formatting functionality
    239  */
    240 int		_conv_expn_field(CONV_EXPN_FIELD_ARG *,
    241 		    const Val_desc *, Conv_fmt_flags_t, const char *);
    242 int		_conv_expn_field2(CONV_EXPN_FIELD_ARG *, uchar_t,
    243 		    Half, const Val_desc2 *, Conv_fmt_flags_t, const char *);
    244 const char	*conv_invalid_val(Conv_inv_buf_t *, Xword, Conv_fmt_flags_t);
    245 
    246 
    247 /*
    248  * Define all class specific routines.
    249  */
    250 const char	*conv32_cap_tag(Elf32_Word, Conv_fmt_flags_t,
    251 		    Conv_inv_buf_t *);
    252 const char	*conv64_cap_tag(Elf64_Xword, Conv_fmt_flags_t,
    253 		    Conv_inv_buf_t *);
    254 const char	*conv32_cap_val(Elf32_Word, Elf32_Word, Half,
    255 		    Conv_cap_val_buf_t *);
    256 const char	*conv64_cap_val(Elf64_Xword, Elf64_Xword, Half,
    257 		    Conv_cap_val_buf_t *);
    258 const char	*conv32_cap_val_hw1(Elf32_Word, Half, Conv_fmt_flags_t,
    259 		    Conv_cap_val_hw1_buf_t *);
    260 const char	*conv64_cap_val_hw1(Elf64_Xword, Half, Conv_fmt_flags_t,
    261 		    Conv_cap_val_hw1_buf_t *);
    262 const char	*conv32_cap_val_sf1(Elf32_Word, Half, Conv_fmt_flags_t,
    263 		    Conv_cap_val_sf1_buf_t *);
    264 const char	*conv64_cap_val_sf1(Elf64_Xword, Half, Conv_fmt_flags_t,
    265 		    Conv_cap_val_sf1_buf_t *);
    266 const char	*conv32_dyn_flag1(Elf32_Word, Conv_fmt_flags_t,
    267 		    Conv_dyn_flag1_buf_t *);
    268 const char	*conv64_dyn_flag1(Elf64_Xword, Conv_fmt_flags_t,
    269 		    Conv_dyn_flag1_buf_t *);
    270 const char	*conv32_dyn_flag(Elf32_Word, int, Conv_dyn_flag_buf_t *);
    271 const char	*conv64_dyn_flag(Elf64_Xword, int, Conv_dyn_flag_buf_t *);
    272 const char	*conv32_dyn_posflag1(Elf32_Word, int,
    273 		    Conv_dyn_posflag1_buf_t *);
    274 const char	*conv64_dyn_posflag1(Elf64_Xword, int,
    275 		    Conv_dyn_posflag1_buf_t *);
    276 const char	*conv32_dyn_tag(Elf32_Word, uchar_t, Elf32_Half,
    277 		    Conv_fmt_flags_t, Conv_inv_buf_t *);
    278 const char	*conv64_dyn_tag(Elf64_Xword, uchar_t, Elf64_Half,
    279 		    Conv_fmt_flags_t, Conv_inv_buf_t *);
    280 const char	*conv32_dyn_feature1(Elf32_Word, int,
    281 		    Conv_dyn_feature1_buf_t *);
    282 const char	*conv64_dyn_feature1(Elf64_Xword, int,
    283 		    Conv_dyn_feature1_buf_t *);
    284 const char	*conv32_sec_flags(uchar_t, Half, Elf32_Word, Conv_fmt_flags_t,
    285 		    Conv_sec_flags_buf_t *);
    286 const char	*conv64_sec_flags(uchar_t, Half, Elf64_Xword, Conv_fmt_flags_t,
    287 		    Conv_sec_flags_buf_t *);
    288 const char	*conv32_sec_linkinfo(Elf32_Word, Elf32_Word,
    289 		    Conv_inv_buf_t *);
    290 const char	*conv64_sec_linkinfo(Elf64_Word, Elf64_Xword,
    291 		    Conv_inv_buf_t *);
    292 const char	*conv32_sym_value(Elf32_Half, uchar_t, Elf32_Addr,
    293 		    Conv_inv_buf_t *);
    294 const char	*conv64_sym_value(Elf64_Half, uchar_t, Elf64_Addr,
    295 		    Conv_inv_buf_t *);
    296 const char	*conv32_sym_SPARC_value(Elf32_Addr, int, Conv_inv_buf_t *);
    297 const char	*conv64_sym_SPARC_value(Elf64_Addr, int, Conv_inv_buf_t *);
    298