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 2007 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 #pragma ident "%Z%%M% %I% %E% SMI" 27 28 #include <link.h> 29 #include <debug.h> 30 #include "msg.h" 31 #include "_debug.h" 32 33 void 34 Dbg_ver_avail_title(Lm_list *lml, const char *file) 35 { 36 if (DBG_NOTCLASS(DBG_C_VERSIONS)) 37 return; 38 39 Dbg_util_nl(lml, DBG_NL_STD); 40 dbg_print(lml, MSG_INTL(MSG_VER_AVAIL_1), file); 41 dbg_print(lml, MSG_INTL(MSG_VER_AVAIL_2)); 42 } 43 44 void 45 Dbg_ver_def_title(Lm_list *lml, const char *file) 46 { 47 if (DBG_NOTCLASS(DBG_C_VERSIONS)) 48 return; 49 50 Dbg_util_nl(lml, DBG_NL_STD); 51 dbg_print(lml, MSG_INTL(MSG_VER_DEF_TITLE), file); 52 Elf_ver_def_title(lml); 53 } 54 55 void 56 Dbg_ver_need_title(Lm_list *lml, const char *file) 57 { 58 if (DBG_NOTCLASS(DBG_C_VERSIONS)) 59 return; 60 61 Dbg_util_nl(lml, DBG_NL_STD); 62 dbg_print(lml, MSG_INTL(MSG_VER_NEED_TITLE), file); 63 Elf_ver_need_title(lml, 0); 64 } 65 66 void 67 Dbg_ver_need_entry(Lm_list *lml, Half cnt, const char *file, 68 const char *version) 69 { 70 if (DBG_NOTCLASS(DBG_C_VERSIONS)) 71 return; 72 73 if (cnt) 74 Elf_ver_line_4(lml, version); 75 else 76 Elf_ver_line_5(lml, file, version); 77 } 78 79 void 80 Dbg_ver_symbol(Lm_list *lml, const char *name) 81 { 82 static Boolean ver_symbol_title = TRUE; 83 84 if (DBG_NOTCLASS(DBG_C_VERSIONS | DBG_C_SYMBOLS)) 85 return; 86 87 if (DBG_NOTCLASS(DBG_C_VERSIONS)) 88 if (ver_symbol_title) { 89 ver_symbol_title = FALSE; 90 Dbg_util_nl(lml, DBG_NL_STD); 91 dbg_print(lml, MSG_INTL(MSG_SYM_VERSION)); 92 } 93 94 Dbg_syms_created(lml, name); 95 } 96 97 /* 98 * This function doesn't test for any specific debugging category, thus it will 99 * be generated for any debugging family. 100 */ 101 void 102 Dbg_ver_nointerface(Lm_list *lml, const char *name) 103 { 104 Dbg_util_nl(lml, DBG_NL_STD); 105 dbg_print(lml, MSG_INTL(MSG_VER_NOINTERFACE), name); 106 Dbg_util_nl(lml, DBG_NL_STD); 107 } 108 109 void 110 Dbg_ver_desc_entry(Lm_list *lml, Ver_desc *vdp) 111 { 112 const char *dep; 113 Ver_desc *_vdp, *__vdp; 114 Listnode * lnp; 115 char index[10]; 116 117 if (DBG_NOTCLASS(DBG_C_VERSIONS)) 118 return; 119 120 if (vdp->vd_deps.head) { 121 _vdp = (Ver_desc *)vdp->vd_deps.head->data; 122 dep = _vdp->vd_name; 123 } else { 124 _vdp = 0; 125 dep = MSG_ORIG(MSG_STR_EMPTY); 126 } 127 (void) sprintf(index, MSG_ORIG(MSG_FMT_INDEX), vdp->vd_ndx); 128 Elf_ver_line_1(lml, index, vdp->vd_name, dep, 129 conv_ver_flags(vdp->vd_flags)); 130 131 /* 132 * Loop through the dependency list in case there are more that one 133 * dependency. 134 */ 135 for (LIST_TRAVERSE(&vdp->vd_deps, lnp, __vdp)) { 136 if (_vdp == __vdp) 137 continue; 138 Elf_ver_line_4(lml, __vdp->vd_name); 139 } 140 } 141 142 void 143 Dbg_ver_avail_entry(Lm_list *lml, Ver_index *vip, const char *select) 144 { 145 if (DBG_NOTCLASS(DBG_C_VERSIONS)) 146 return; 147 148 if (select) { 149 if (DBG_NOTLONG()) 150 dbg_print(lml, MSG_ORIG(MSG_VER_SELECTED), 151 vip->vi_name, select); 152 else 153 dbg_print(lml, MSG_ORIG(MSG_VER_L_SELECTED), 154 vip->vi_name, select); 155 } else { 156 if (DBG_NOTLONG()) 157 dbg_print(lml, MSG_ORIG(MSG_VER_ALL), vip->vi_name); 158 else 159 dbg_print(lml, MSG_ORIG(MSG_VER_L_ALL), vip->vi_name); 160 } 161 } 162 163 void 164 Elf_ver_def_title(Lm_list *lml) 165 { 166 dbg_print(lml, MSG_INTL(MSG_VER_DEF)); 167 } 168 169 /* 170 * entry: 171 * gnuver - If True (non-zero), the version rules used by the 172 * GNU ld are assumed. If False (0), Solaris ld rules apply. 173 */ 174 void 175 Elf_ver_need_title(Lm_list *lml, int gnuver) 176 { 177 if (gnuver) 178 dbg_print(lml, MSG_INTL(MSG_VER_NEED_GNUVER)); 179 else 180 dbg_print(lml, MSG_INTL(MSG_VER_NEED)); 181 } 182 183 void 184 Elf_ver_line_1(Lm_list *lml, const char *index, const char *name, 185 const char *dep, const char *flags) 186 { 187 if (DBG_NOTLONG()) 188 dbg_print(lml, MSG_INTL(MSG_VER_LINE_1), index, name, 189 dep, flags); 190 else 191 dbg_print(lml, MSG_INTL(MSG_VER_LLINE_1), index, name, 192 dep, flags); 193 } 194 195 void 196 Elf_ver_line_2(Lm_list *lml, const char *name, const char *dep) 197 { 198 dbg_print(lml, MSG_INTL(MSG_VER_LINE_2), name, dep); 199 } 200 201 void 202 Elf_ver_line_3(Lm_list *lml, const char *name, const char *dep, 203 const char *flags) 204 { 205 dbg_print(lml, MSG_INTL(MSG_VER_LINE_3), name, dep, flags); 206 } 207 208 void 209 Elf_ver_line_4(Lm_list *lml, const char *version) 210 { 211 dbg_print(lml, MSG_INTL(MSG_VER_LINE_4), version); 212 } 213 214 void 215 Elf_ver_line_5(Lm_list *lml, const char *file, const char *version) 216 { 217 if (DBG_NOTLONG()) 218 dbg_print(lml, MSG_INTL(MSG_VER_LINE_5), file, version); 219 else 220 dbg_print(lml, MSG_INTL(MSG_VER_LLINE_5), file, version); 221 } 222