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 #include "msg.h" 28 #include "_debug.h" 29 #include "libld.h" 30 31 static const char 32 *Dbg_decl = NULL; 33 34 void 35 Dbg_map_set_atsign(Boolean new) 36 { 37 if (DBG_NOTCLASS(DBG_C_MAP)) 38 return; 39 40 if (new) 41 Dbg_decl = MSG_INTL(MSG_MAP_SEG_DECL_4); 42 else 43 Dbg_decl = MSG_INTL(MSG_MAP_SEG_DECL_5); 44 } 45 46 void 47 Dbg_map_set_equal(Boolean new) 48 { 49 if (DBG_NOTCLASS(DBG_C_MAP)) 50 return; 51 52 if (new) 53 Dbg_decl = MSG_INTL(MSG_MAP_SEG_DECL_1); 54 else 55 Dbg_decl = MSG_INTL(MSG_MAP_SEG_DECL_2); 56 } 57 58 void 59 Dbg_map_version(Lm_list *lml, const char *version, const char *name, int scope) 60 { 61 const char *str, *scp; 62 63 if (DBG_NOTCLASS(DBG_C_MAP | DBG_C_SYMBOLS)) 64 return; 65 66 str = MSG_INTL(MSG_MAP_SYM_SCOPE); 67 if (scope) 68 scp = MSG_ORIG(MSG_SYM_GLOBAL); 69 else 70 scp = MSG_ORIG(MSG_SYM_LOCAL); 71 72 if (version) 73 dbg_print(lml, MSG_INTL(MSG_MAP_SYM_VER_1), str, version, 74 Dbg_demangle_name(name), scp); 75 else 76 dbg_print(lml, MSG_INTL(MSG_MAP_SYM_VER_2), str, 77 Dbg_demangle_name(name), scp); 78 } 79 80 void 81 Dbg_map_size_new(Lm_list *lml, const char *name) 82 { 83 if (DBG_NOTCLASS(DBG_C_MAP)) 84 return; 85 86 dbg_print(lml, MSG_INTL(MSG_MAP_SYM_SIZE), Dbg_demangle_name(name), 87 MSG_INTL(MSG_STR_ADD)); 88 } 89 90 void 91 Dbg_map_size_old(Ofl_desc *ofl, Sym_desc *sdp) 92 { 93 Conv_inv_buf_t inv_buf; 94 Lm_list *lml = ofl->ofl_lml; 95 96 if (DBG_NOTCLASS(DBG_C_MAP)) 97 return; 98 99 dbg_print(lml, MSG_INTL(MSG_MAP_SYM_SIZE), sdp->sd_name, 100 MSG_INTL(MSG_STR_UP_1)); 101 102 if (DBG_NOTDETAIL()) 103 return; 104 105 Elf_syms_table_entry(lml, ELF_DBG_LD, MSG_INTL(MSG_STR_UP_2), 106 ofl->ofl_dehdr->e_machine, sdp->sd_sym, 107 sdp->sd_aux ? sdp->sd_aux->sa_overndx : 0, 0, NULL, 108 conv_def_tag(sdp->sd_ref, &inv_buf)); 109 } 110 111 void 112 Dbg_map_symbol(Ofl_desc *ofl, Sym_desc *sdp) 113 { 114 Conv_inv_buf_t inv_buf; 115 Lm_list *lml = ofl->ofl_lml; 116 117 if (DBG_NOTCLASS(DBG_C_MAP | DBG_C_SYMBOLS)) 118 return; 119 if (DBG_NOTDETAIL()) 120 return; 121 122 Elf_syms_table_entry(lml, ELF_DBG_LD, MSG_INTL(MSG_STR_ENTERED), 123 ofl->ofl_dehdr->e_machine, sdp->sd_sym, sdp->sd_aux ? 124 sdp->sd_aux->sa_overndx : 0, 0, NULL, 125 conv_def_tag(sdp->sd_ref, &inv_buf)); 126 } 127 128 void 129 Dbg_map_dash(Lm_list *lml, const char *name, Sdf_desc *sdf) 130 { 131 const char *str; 132 133 if (DBG_NOTCLASS(DBG_C_MAP)) 134 return; 135 136 if (sdf->sdf_flags & FLG_SDF_SONAME) 137 str = MSG_INTL(MSG_MAP_CNT_DEF_1); 138 else 139 str = MSG_INTL(MSG_MAP_CNT_DEF_2); 140 141 dbg_print(lml, str, name, sdf->sdf_soname); 142 } 143 144 void 145 Dbg_map_sort(Lm_list *lml) 146 { 147 if (DBG_NOTCLASS(DBG_C_MAP)) 148 return; 149 if (DBG_NOTDETAIL()) 150 return; 151 152 Dbg_util_nl(lml, DBG_NL_STD); 153 dbg_print(lml, MSG_INTL(MSG_MAP_SORT_TITLE)); 154 } 155 156 void 157 Dbg_map_sort_seg(Lm_list *lml, Sg_desc *sgp, int orig) 158 { 159 const char *str; 160 161 if (DBG_NOTCLASS(DBG_C_MAP)) 162 return; 163 if (DBG_NOTDETAIL()) 164 return; 165 166 if (sgp->sg_name && *sgp->sg_name) 167 str = sgp->sg_name; 168 else 169 str = MSG_INTL(MSG_STR_NULL); 170 171 if (orig) 172 dbg_print(lml, MSG_INTL(MSG_MAP_SORT_ORIG), str); 173 else 174 dbg_print(lml, MSG_INTL(MSG_MAP_SORT_FINAL), str); 175 } 176 177 void 178 Dbg_map_parse(Lm_list *lml, const char *file) 179 { 180 if (DBG_NOTCLASS(DBG_C_MAP)) 181 return; 182 183 Dbg_util_nl(lml, DBG_NL_STD); 184 dbg_print(lml, MSG_INTL(MSG_MAP_MAPFILE), file); 185 } 186 187 void 188 Dbg_map_ent(Lm_list *lml, Boolean new, Ent_desc *enp, Ofl_desc *ofl) 189 { 190 if (DBG_NOTCLASS(DBG_C_MAP)) 191 return; 192 193 dbg_print(lml, MSG_INTL(MSG_MAP_MAP_DIR)); 194 Dbg_ent_entry(lml, ofl->ofl_dehdr->e_machine, enp); 195 if (new) 196 Dbg_decl = MSG_INTL(MSG_MAP_SEG_DECL_3); 197 } 198 199 void 200 Dbg_map_pipe(Lm_list *lml, Sg_desc *sgp, const char *sec_name, const Word ndx) 201 { 202 if (DBG_NOTCLASS(DBG_C_MAP)) 203 return; 204 205 dbg_print(lml, MSG_INTL(MSG_MAP_SEC_ORDER), sgp->sg_name, sec_name, 206 EC_WORD(ndx)); 207 } 208 209 void 210 Dbg_map_seg(Ofl_desc *ofl, int ndx, Sg_desc *sgp) 211 { 212 Lm_list *lml = ofl->ofl_lml; 213 214 if (DBG_NOTCLASS(DBG_C_MAP)) 215 return; 216 217 if (Dbg_decl) { 218 dbg_print(lml, MSG_ORIG(MSG_FMT_STR), Dbg_decl); 219 Dbg_seg_desc_entry(ofl->ofl_lml, 220 ofl->ofl_dehdr->e_machine, ndx, sgp); 221 Dbg_util_nl(lml, DBG_NL_STD); 222 Dbg_decl = NULL; 223 } 224 } 225