17c478bd9Sstevel@tonic-gate /* 27c478bd9Sstevel@tonic-gate * CDDL HEADER START 37c478bd9Sstevel@tonic-gate * 47c478bd9Sstevel@tonic-gate * The contents of this file are subject to the terms of the 55aefb655Srie * Common Development and Distribution License (the "License"). 65aefb655Srie * You may not use this file except in compliance with the License. 77c478bd9Sstevel@tonic-gate * 87c478bd9Sstevel@tonic-gate * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 97c478bd9Sstevel@tonic-gate * or http://www.opensolaris.org/os/licensing. 107c478bd9Sstevel@tonic-gate * See the License for the specific language governing permissions 117c478bd9Sstevel@tonic-gate * and limitations under the License. 127c478bd9Sstevel@tonic-gate * 137c478bd9Sstevel@tonic-gate * When distributing Covered Code, include this CDDL HEADER in each 147c478bd9Sstevel@tonic-gate * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 157c478bd9Sstevel@tonic-gate * If applicable, add the following below this CDDL HEADER, with the 167c478bd9Sstevel@tonic-gate * fields enclosed by brackets "[]" replaced with your own identifying 177c478bd9Sstevel@tonic-gate * information: Portions Copyright [yyyy] [name of copyright owner] 187c478bd9Sstevel@tonic-gate * 197c478bd9Sstevel@tonic-gate * CDDL HEADER END 207c478bd9Sstevel@tonic-gate */ 215aefb655Srie 227c478bd9Sstevel@tonic-gate /* 23*69112eddSAli Bahrami * Copyright 2010 Sun Microsystems, Inc. All rights reserved. 245aefb655Srie * Use is subject to license terms. 257c478bd9Sstevel@tonic-gate */ 267c478bd9Sstevel@tonic-gate 277c478bd9Sstevel@tonic-gate #include "msg.h" 287c478bd9Sstevel@tonic-gate #include "_debug.h" 297c478bd9Sstevel@tonic-gate #include "libld.h" 307c478bd9Sstevel@tonic-gate 317c478bd9Sstevel@tonic-gate 32*69112eddSAli Bahrami /* 33*69112eddSAli Bahrami * Report change in input enable status caused by evaluating 34*69112eddSAli Bahrami * $if/$elif control directives. 35*69112eddSAli Bahrami */ 367c478bd9Sstevel@tonic-gate void 37*69112eddSAli Bahrami Dbg_map_pass(Lm_list *lml, Boolean enable, const char *file, 38*69112eddSAli Bahrami Lineno lineno, const char *directive) 395aefb655Srie { 40*69112eddSAli Bahrami const char *fmt; 41*69112eddSAli Bahrami 425aefb655Srie if (DBG_NOTCLASS(DBG_C_MAP)) 435aefb655Srie return; 445aefb655Srie 45*69112eddSAli Bahrami fmt = enable ? MSG_INTL(MSG_MAP_PASS) : MSG_INTL(MSG_MAP_NOPASS); 46*69112eddSAli Bahrami dbg_print(lml, fmt, file, EC_LINENO(lineno), directive); 475aefb655Srie } 485aefb655Srie 49*69112eddSAli Bahrami /* 50*69112eddSAli Bahrami * Report entry/removal of boolean identifier from conditional expression 51*69112eddSAli Bahrami * known values. 52*69112eddSAli Bahrami */ 535aefb655Srie void 54*69112eddSAli Bahrami Dbg_map_cexp_id(Lm_list *lml, Boolean add, const char *file, 55*69112eddSAli Bahrami Lineno lineno, const char *id) 565aefb655Srie { 57*69112eddSAli Bahrami const char *fmt; 58*69112eddSAli Bahrami 595aefb655Srie if (DBG_NOTCLASS(DBG_C_MAP)) 605aefb655Srie return; 615aefb655Srie 62*69112eddSAli Bahrami fmt = add ? MSG_INTL(MSG_MAP_ID_ADD) : MSG_INTL(MSG_MAP_ID_CLEAR); 63*69112eddSAli Bahrami dbg_print(lml, fmt, file, EC_LINENO(lineno), id); 645aefb655Srie } 655aefb655Srie 665aefb655Srie void 675aefb655Srie Dbg_map_version(Lm_list *lml, const char *version, const char *name, int scope) 687c478bd9Sstevel@tonic-gate { 697c478bd9Sstevel@tonic-gate const char *str, *scp; 707c478bd9Sstevel@tonic-gate 715aefb655Srie if (DBG_NOTCLASS(DBG_C_MAP | DBG_C_SYMBOLS)) 727c478bd9Sstevel@tonic-gate return; 737c478bd9Sstevel@tonic-gate 747c478bd9Sstevel@tonic-gate str = MSG_INTL(MSG_MAP_SYM_SCOPE); 757c478bd9Sstevel@tonic-gate if (scope) 767c478bd9Sstevel@tonic-gate scp = MSG_ORIG(MSG_SYM_GLOBAL); 777c478bd9Sstevel@tonic-gate else 787c478bd9Sstevel@tonic-gate scp = MSG_ORIG(MSG_SYM_LOCAL); 797c478bd9Sstevel@tonic-gate 807c478bd9Sstevel@tonic-gate if (version) 815aefb655Srie dbg_print(lml, MSG_INTL(MSG_MAP_SYM_VER_1), str, version, 825aefb655Srie Dbg_demangle_name(name), scp); 837c478bd9Sstevel@tonic-gate else 845aefb655Srie dbg_print(lml, MSG_INTL(MSG_MAP_SYM_VER_2), str, 855aefb655Srie Dbg_demangle_name(name), scp); 867c478bd9Sstevel@tonic-gate } 877c478bd9Sstevel@tonic-gate 887c478bd9Sstevel@tonic-gate void 89*69112eddSAli Bahrami Dbg_map_size_new(Lm_list *lml, const char *symname, const char *segname, 90*69112eddSAli Bahrami Lineno lineno) 917c478bd9Sstevel@tonic-gate { 925aefb655Srie if (DBG_NOTCLASS(DBG_C_MAP)) 937c478bd9Sstevel@tonic-gate return; 947c478bd9Sstevel@tonic-gate 95*69112eddSAli Bahrami Dbg_util_nl(lml, DBG_NL_STD); 96*69112eddSAli Bahrami dbg_print(lml, MSG_INTL(MSG_MAP_SYM_SIZE), EC_LINENO(lineno), segname, 97*69112eddSAli Bahrami Dbg_demangle_name(symname), MSG_INTL(MSG_STR_ADDING)); 987c478bd9Sstevel@tonic-gate } 997c478bd9Sstevel@tonic-gate 1007c478bd9Sstevel@tonic-gate void 101*69112eddSAli Bahrami Dbg_map_size_old(Ofl_desc *ofl, Sym_desc *sdp, const char *segname, 102*69112eddSAli Bahrami Lineno lineno) 1037c478bd9Sstevel@tonic-gate { 104de777a60Sab196087 Conv_inv_buf_t inv_buf; 1055aefb655Srie Lm_list *lml = ofl->ofl_lml; 1065aefb655Srie 1075aefb655Srie if (DBG_NOTCLASS(DBG_C_MAP)) 1087c478bd9Sstevel@tonic-gate return; 1097c478bd9Sstevel@tonic-gate 110*69112eddSAli Bahrami Dbg_util_nl(lml, DBG_NL_STD); 111*69112eddSAli Bahrami dbg_print(lml, MSG_INTL(MSG_MAP_SYM_SIZE), EC_LINENO(lineno), segname, 112*69112eddSAli Bahrami sdp->sd_name, MSG_INTL(MSG_STR_UP_1)); 1137c478bd9Sstevel@tonic-gate 1147c478bd9Sstevel@tonic-gate if (DBG_NOTDETAIL()) 1157c478bd9Sstevel@tonic-gate return; 1167c478bd9Sstevel@tonic-gate 1175aefb655Srie Elf_syms_table_entry(lml, ELF_DBG_LD, MSG_INTL(MSG_STR_UP_2), 1184f680cc6SAli Bahrami ofl->ofl_dehdr->e_ident[EI_OSABI], ofl->ofl_dehdr->e_machine, 1194f680cc6SAli Bahrami sdp->sd_sym, sdp->sd_aux ? sdp->sd_aux->sa_overndx : 0, 0, NULL, 120de777a60Sab196087 conv_def_tag(sdp->sd_ref, &inv_buf)); 1217c478bd9Sstevel@tonic-gate } 1227c478bd9Sstevel@tonic-gate 1237c478bd9Sstevel@tonic-gate void 1245aefb655Srie Dbg_map_symbol(Ofl_desc *ofl, Sym_desc *sdp) 1257c478bd9Sstevel@tonic-gate { 126de777a60Sab196087 Conv_inv_buf_t inv_buf; 1275aefb655Srie Lm_list *lml = ofl->ofl_lml; 1285aefb655Srie 12960758829Srie if (DBG_NOTCLASS(DBG_C_MAP | DBG_C_SYMBOLS)) 1307c478bd9Sstevel@tonic-gate return; 1317c478bd9Sstevel@tonic-gate if (DBG_NOTDETAIL()) 1327c478bd9Sstevel@tonic-gate return; 1337c478bd9Sstevel@tonic-gate 1345aefb655Srie Elf_syms_table_entry(lml, ELF_DBG_LD, MSG_INTL(MSG_STR_ENTERED), 1354f680cc6SAli Bahrami ofl->ofl_dehdr->e_ident[EI_OSABI], ofl->ofl_dehdr->e_machine, 1364f680cc6SAli Bahrami sdp->sd_sym, sdp->sd_aux ? sdp->sd_aux->sa_overndx : 0, 0, NULL, 137de777a60Sab196087 conv_def_tag(sdp->sd_ref, &inv_buf)); 1387c478bd9Sstevel@tonic-gate } 1397c478bd9Sstevel@tonic-gate 140*69112eddSAli Bahrami /* 141*69112eddSAli Bahrami * Object version dependency. In the v1 syntax, this is the 'dash' operator. 142*69112eddSAli Bahrami * In the v2 syntax, the DEPEND_VERSIONS directive. 143*69112eddSAli Bahrami */ 1447c478bd9Sstevel@tonic-gate void 145*69112eddSAli Bahrami Dbg_map_dv(Lm_list *lml, const char *obj_name, Lineno lineno) 1467c478bd9Sstevel@tonic-gate { 1475aefb655Srie if (DBG_NOTCLASS(DBG_C_MAP)) 1487c478bd9Sstevel@tonic-gate return; 1497c478bd9Sstevel@tonic-gate 150*69112eddSAli Bahrami dbg_print(lml, MSG_INTL(MSG_MAP_DV), EC_LINENO(lineno), obj_name); 151*69112eddSAli Bahrami } 152*69112eddSAli Bahrami 153*69112eddSAli Bahrami /* 154*69112eddSAli Bahrami * Add a version to an object dependency 155*69112eddSAli Bahrami */ 156*69112eddSAli Bahrami void 157*69112eddSAli Bahrami Dbg_map_dv_entry(Lm_list *lml, Lineno lineno, int require, const char *version) 158*69112eddSAli Bahrami { 159*69112eddSAli Bahrami const char *attr; 160*69112eddSAli Bahrami 161*69112eddSAli Bahrami if (DBG_NOTCLASS(DBG_C_MAP)) 162*69112eddSAli Bahrami return; 163*69112eddSAli Bahrami 164*69112eddSAli Bahrami attr = require ? MSG_INTL(MSG_STR_REQUIRE) : MSG_INTL(MSG_STR_ALLOW); 165*69112eddSAli Bahrami dbg_print(lml, MSG_INTL(MSG_MAP_DV_ENTRY), attr, version, 166*69112eddSAli Bahrami EC_LINENO(lineno)); 1677c478bd9Sstevel@tonic-gate } 1687c478bd9Sstevel@tonic-gate 1697c478bd9Sstevel@tonic-gate void 170*69112eddSAli Bahrami Dbg_map_sort_title(Lm_list *lml, Boolean orig) 1717c478bd9Sstevel@tonic-gate { 1725aefb655Srie if (DBG_NOTCLASS(DBG_C_MAP)) 1737c478bd9Sstevel@tonic-gate return; 1747c478bd9Sstevel@tonic-gate if (DBG_NOTDETAIL()) 1757c478bd9Sstevel@tonic-gate return; 1767c478bd9Sstevel@tonic-gate 177*69112eddSAli Bahrami if (orig) { 17857ef7aa9SRod Evans Dbg_util_nl(lml, DBG_NL_STD); 17957ef7aa9SRod Evans dbg_print(lml, MSG_INTL(MSG_MAP_SORT_TITLE)); 180*69112eddSAli Bahrami dbg_print(lml, MSG_INTL(MSG_MAP_SORT_TITLE_O)); 181*69112eddSAli Bahrami } else { 182*69112eddSAli Bahrami dbg_print(lml, MSG_INTL(MSG_MAP_SORT_TITLE_S)); 183*69112eddSAli Bahrami } 1847c478bd9Sstevel@tonic-gate } 1857c478bd9Sstevel@tonic-gate 1867c478bd9Sstevel@tonic-gate void 187*69112eddSAli Bahrami Dbg_map_sort_seg(Lm_list *lml, uchar_t osabi, Half mach, Sg_desc *sgp) 1887c478bd9Sstevel@tonic-gate { 189*69112eddSAli Bahrami const char *type_str; 190*69112eddSAli Bahrami Conv_inv_buf_t inv_buf; 1917c478bd9Sstevel@tonic-gate 1925aefb655Srie if (DBG_NOTCLASS(DBG_C_MAP)) 1937c478bd9Sstevel@tonic-gate return; 1947c478bd9Sstevel@tonic-gate if (DBG_NOTDETAIL()) 1957c478bd9Sstevel@tonic-gate return; 1967c478bd9Sstevel@tonic-gate 197*69112eddSAli Bahrami type_str = conv_phdr_type(osabi, mach, sgp->sg_phdr.p_type, 198*69112eddSAli Bahrami 0, &inv_buf); 1997c478bd9Sstevel@tonic-gate 200*69112eddSAli Bahrami if (sgp->sg_name) { 201*69112eddSAli Bahrami if (sgp->sg_flags & FLG_SG_P_VADDR) { 202*69112eddSAli Bahrami dbg_print(lml, MSG_ORIG(MSG_MAP_SORT_SEG_V), 203*69112eddSAli Bahrami type_str, sgp->sg_name, 204*69112eddSAli Bahrami EC_ADDR(sgp->sg_phdr.p_vaddr)); 205*69112eddSAli Bahrami } else if (sgp->sg_flags & FLG_SG_ORDERED) { 206*69112eddSAli Bahrami /* 207*69112eddSAli Bahrami * All FLG_SG_ORDERED have adjacent sg_id values 208*69112eddSAli Bahrami * that start at SGID_TEXT. Subtract out the base 209*69112eddSAli Bahrami * in order to present the order values based at 0. 210*69112eddSAli Bahrami */ 211*69112eddSAli Bahrami dbg_print(lml, MSG_ORIG(MSG_MAP_SORT_SEG_O), 212*69112eddSAli Bahrami type_str, sgp->sg_name, 213*69112eddSAli Bahrami EC_WORD(sgp->sg_id - SGID_TEXT)); 214*69112eddSAli Bahrami } else { 215*69112eddSAli Bahrami dbg_print(lml, MSG_ORIG(MSG_MAP_SORT_SEG_NAME), 216*69112eddSAli Bahrami type_str, sgp->sg_name); 217*69112eddSAli Bahrami } 218*69112eddSAli Bahrami } else { 219*69112eddSAli Bahrami dbg_print(lml, MSG_ORIG(MSG_MAP_SORT_SEG), type_str); 220*69112eddSAli Bahrami } 2217c478bd9Sstevel@tonic-gate } 2227c478bd9Sstevel@tonic-gate 2237c478bd9Sstevel@tonic-gate void 224*69112eddSAli Bahrami Dbg_map_parse(Lm_list *lml, const char *file, int version) 225*69112eddSAli Bahrami { 226*69112eddSAli Bahrami Conv_inv_buf_t inv_buf; 227*69112eddSAli Bahrami 228*69112eddSAli Bahrami if (DBG_NOTCLASS(DBG_C_MAP)) 229*69112eddSAli Bahrami return; 230*69112eddSAli Bahrami 231*69112eddSAli Bahrami Dbg_util_nl(lml, DBG_NL_STD); 232*69112eddSAli Bahrami dbg_print(lml, MSG_INTL(MSG_MAP_MAPFILE), file, EC_WORD(version), 233*69112eddSAli Bahrami conv_mapfile_version(version, 0, &inv_buf)); 234*69112eddSAli Bahrami } 235*69112eddSAli Bahrami 236*69112eddSAli Bahrami void 237*69112eddSAli Bahrami Dbg_map_ent(Lm_list *lml, Ent_desc *enp, Ofl_desc *ofl, Lineno lineno) 2387c478bd9Sstevel@tonic-gate { 2395aefb655Srie if (DBG_NOTCLASS(DBG_C_MAP)) 2407c478bd9Sstevel@tonic-gate return; 2417c478bd9Sstevel@tonic-gate 2425aefb655Srie Dbg_util_nl(lml, DBG_NL_STD); 243*69112eddSAli Bahrami dbg_print(lml, MSG_INTL(MSG_MAP_EC), EC_LINENO(lineno)); 2444f680cc6SAli Bahrami Dbg_ent_entry(lml, ofl->ofl_dehdr->e_ident[EI_OSABI], 2454f680cc6SAli Bahrami ofl->ofl_dehdr->e_machine, enp); 2467c478bd9Sstevel@tonic-gate } 2477c478bd9Sstevel@tonic-gate 2487c478bd9Sstevel@tonic-gate void 249*69112eddSAli Bahrami Dbg_map_ent_ord_title(Lm_list *lml, const char *segname) 2507c478bd9Sstevel@tonic-gate { 2515aefb655Srie if (DBG_NOTCLASS(DBG_C_MAP)) 2527c478bd9Sstevel@tonic-gate return; 2537c478bd9Sstevel@tonic-gate 254*69112eddSAli Bahrami Dbg_util_nl(lml, DBG_NL_STD); 255*69112eddSAli Bahrami dbg_print(lml, MSG_INTL(MSG_MAP_ENT_ORD_TITLE), segname); 2567c478bd9Sstevel@tonic-gate } 2577c478bd9Sstevel@tonic-gate 2587c478bd9Sstevel@tonic-gate void 259*69112eddSAli Bahrami Dbg_map_seg_os_order(Lm_list *lml, Sg_desc *sgp, const char *sec_name, 260*69112eddSAli Bahrami Word ndx, Lineno lineno) 261*69112eddSAli Bahrami { 262*69112eddSAli Bahrami if (DBG_NOTCLASS(DBG_C_MAP)) 263*69112eddSAli Bahrami return; 264*69112eddSAli Bahrami 265*69112eddSAli Bahrami dbg_print(lml, MSG_INTL(MSG_MAP_OS_ORDER), EC_LINENO(lineno), 266*69112eddSAli Bahrami sgp->sg_name, sec_name, EC_WORD(ndx)); 267*69112eddSAli Bahrami } 268*69112eddSAli Bahrami 269*69112eddSAli Bahrami void 270*69112eddSAli Bahrami Dbg_map_seg(Ofl_desc *ofl, dbg_state_t dbg_state, int ndx, Sg_desc *sgp, 271*69112eddSAli Bahrami Lineno lineno) 2727c478bd9Sstevel@tonic-gate { 2735aefb655Srie Lm_list *lml = ofl->ofl_lml; 2745aefb655Srie 2755aefb655Srie if (DBG_NOTCLASS(DBG_C_MAP)) 2767c478bd9Sstevel@tonic-gate return; 2777c478bd9Sstevel@tonic-gate 2785aefb655Srie Dbg_util_nl(lml, DBG_NL_STD); 279*69112eddSAli Bahrami dbg_print(lml, MSG_INTL(MSG_MAP_SEG), EC_LINENO(lineno), 280*69112eddSAli Bahrami Dbg_state_str(dbg_state)); 281*69112eddSAli Bahrami Dbg_seg_desc_entry(ofl->ofl_lml, ofl->ofl_dehdr->e_ident[EI_OSABI], 282*69112eddSAli Bahrami ofl->ofl_dehdr->e_machine, ndx, sgp, FALSE); 283*69112eddSAli Bahrami Dbg_util_nl(lml, DBG_NL_STD); 2847c478bd9Sstevel@tonic-gate } 285*69112eddSAli Bahrami 286*69112eddSAli Bahrami void 287*69112eddSAli Bahrami Dbg_map_seg_order(Ofl_desc *ofl, uchar_t osabi, Half mach, 288*69112eddSAli Bahrami dbg_state_t dbg_state, Lineno lineno) 289*69112eddSAli Bahrami { 290*69112eddSAli Bahrami Lm_list *lml = ofl->ofl_lml; 291*69112eddSAli Bahrami Aliste idx; 292*69112eddSAli Bahrami Sg_desc *sgp; 293*69112eddSAli Bahrami Conv_inv_buf_t inv_buf; 294*69112eddSAli Bahrami const char *type_str; 295*69112eddSAli Bahrami 296*69112eddSAli Bahrami if (DBG_NOTCLASS(DBG_C_MAP)) 297*69112eddSAli Bahrami return; 298*69112eddSAli Bahrami 299*69112eddSAli Bahrami Dbg_util_nl(lml, DBG_NL_STD); 300*69112eddSAli Bahrami dbg_print(lml, MSG_INTL(MSG_MAP_SEG_ORDER), EC_LINENO(lineno), 301*69112eddSAli Bahrami EC_XWORD(aplist_nitems(ofl->ofl_segs_order)), 302*69112eddSAli Bahrami Dbg_state_str(dbg_state)); 303*69112eddSAli Bahrami for (APLIST_TRAVERSE(ofl->ofl_segs_order, idx, sgp)) { 304*69112eddSAli Bahrami type_str = conv_phdr_type(osabi, mach, sgp->sg_phdr.p_type, 305*69112eddSAli Bahrami 0, &inv_buf); 306*69112eddSAli Bahrami dbg_print(lml, MSG_ORIG(MSG_MAP_SORT_SEG_NAME), type_str, 307*69112eddSAli Bahrami sgp->sg_name); 308*69112eddSAli Bahrami } 309*69112eddSAli Bahrami Dbg_util_nl(lml, DBG_NL_STD); 310*69112eddSAli Bahrami } 311*69112eddSAli Bahrami 312*69112eddSAli Bahrami void 313*69112eddSAli Bahrami Dbg_map_post_title(Lm_list *lml) 314*69112eddSAli Bahrami { 315*69112eddSAli Bahrami if (DBG_NOTCLASS(DBG_C_MAP)) 316*69112eddSAli Bahrami return; 317*69112eddSAli Bahrami 318*69112eddSAli Bahrami Dbg_util_nl(lml, DBG_NL_STD); 319*69112eddSAli Bahrami dbg_print(lml, MSG_INTL(MSG_MAP_POST_TITLE)); 320*69112eddSAli Bahrami } 321*69112eddSAli Bahrami 322*69112eddSAli Bahrami void 323*69112eddSAli Bahrami Dbg_map_hdr_noalloc(Lm_list *lml, Lineno lineno) 324*69112eddSAli Bahrami { 325*69112eddSAli Bahrami if (DBG_NOTCLASS(DBG_C_MAP)) 326*69112eddSAli Bahrami return; 327*69112eddSAli Bahrami 328*69112eddSAli Bahrami Dbg_util_nl(lml, DBG_NL_STD); 329*69112eddSAli Bahrami dbg_print(lml, MSG_INTL(MSG_MAP_HDR_NOALLOC), EC_LINENO(lineno)); 3307c478bd9Sstevel@tonic-gate } 331