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_ident[EI_OSABI], ofl->ofl_dehdr->e_machine, 107 sdp->sd_sym, 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_ident[EI_OSABI], ofl->ofl_dehdr->e_machine, 124 sdp->sd_sym, sdp->sd_aux ? 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) 130 { 131 if (DBG_NOTCLASS(DBG_C_MAP)) 132 return; 133 134 dbg_print(lml, MSG_INTL(MSG_MAP_CNT_DEF), name); 135 } 136 137 void 138 Dbg_map_sort(Lm_list *lml) 139 { 140 if (DBG_NOTCLASS(DBG_C_MAP)) 141 return; 142 if (DBG_NOTDETAIL()) 143 return; 144 145 Dbg_util_nl(lml, DBG_NL_STD); 146 dbg_print(lml, MSG_INTL(MSG_MAP_SORT_TITLE)); 147 } 148 149 void 150 Dbg_map_sort_seg(Lm_list *lml, Sg_desc *sgp, int orig) 151 { 152 const char *str; 153 154 if (DBG_NOTCLASS(DBG_C_MAP)) 155 return; 156 if (DBG_NOTDETAIL()) 157 return; 158 159 if (sgp->sg_name && *sgp->sg_name) 160 str = sgp->sg_name; 161 else 162 str = MSG_INTL(MSG_STR_NULL); 163 164 if (orig) 165 dbg_print(lml, MSG_INTL(MSG_MAP_SORT_ORIG), str); 166 else 167 dbg_print(lml, MSG_INTL(MSG_MAP_SORT_FINAL), str); 168 } 169 170 void 171 Dbg_map_parse(Lm_list *lml, const char *file) 172 { 173 if (DBG_NOTCLASS(DBG_C_MAP)) 174 return; 175 176 Dbg_util_nl(lml, DBG_NL_STD); 177 dbg_print(lml, MSG_INTL(MSG_MAP_MAPFILE), file); 178 } 179 180 void 181 Dbg_map_ent(Lm_list *lml, Boolean new, Ent_desc *enp, Ofl_desc *ofl) 182 { 183 if (DBG_NOTCLASS(DBG_C_MAP)) 184 return; 185 186 dbg_print(lml, MSG_INTL(MSG_MAP_MAP_DIR)); 187 Dbg_ent_entry(lml, ofl->ofl_dehdr->e_ident[EI_OSABI], 188 ofl->ofl_dehdr->e_machine, enp); 189 if (new) 190 Dbg_decl = MSG_INTL(MSG_MAP_SEG_DECL_3); 191 } 192 193 void 194 Dbg_map_pipe(Lm_list *lml, Sg_desc *sgp, const char *sec_name, const Word ndx) 195 { 196 if (DBG_NOTCLASS(DBG_C_MAP)) 197 return; 198 199 dbg_print(lml, MSG_INTL(MSG_MAP_SEC_ORDER), sgp->sg_name, sec_name, 200 EC_WORD(ndx)); 201 } 202 203 void 204 Dbg_map_seg(Ofl_desc *ofl, int ndx, Sg_desc *sgp) 205 { 206 Lm_list *lml = ofl->ofl_lml; 207 208 if (DBG_NOTCLASS(DBG_C_MAP)) 209 return; 210 211 if (Dbg_decl) { 212 dbg_print(lml, MSG_ORIG(MSG_FMT_STR), Dbg_decl); 213 Dbg_seg_desc_entry(ofl->ofl_lml, 214 ofl->ofl_dehdr->e_ident[EI_OSABI], 215 ofl->ofl_dehdr->e_machine, ndx, sgp); 216 Dbg_util_nl(lml, DBG_NL_STD); 217 Dbg_decl = NULL; 218 } 219 } 220