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 2010 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  */
26 
27 #include	<stdio.h>
28 #include	<debug.h>
29 #include	"msg.h"
30 #include	"_debug.h"
31 
32 void
Dbg_ver_avail_title(Lm_list * lml,const char * file)33 Dbg_ver_avail_title(Lm_list *lml, const char *file)
34 {
35 	if (DBG_NOTCLASS(DBG_C_VERSIONS))
36 		return;
37 
38 	Dbg_util_nl(lml, DBG_NL_STD);
39 	dbg_print(lml, MSG_INTL(MSG_VER_AVAIL_1), file);
40 	dbg_print(lml, MSG_INTL(MSG_VER_AVAIL_2));
41 }
42 
43 void
Dbg_ver_def_title(Lm_list * lml,const char * file)44 Dbg_ver_def_title(Lm_list *lml, const char *file)
45 {
46 	if (DBG_NOTCLASS(DBG_C_VERSIONS))
47 		return;
48 
49 	Dbg_util_nl(lml, DBG_NL_STD);
50 	dbg_print(lml, MSG_INTL(MSG_VER_DEF_TITLE), file);
51 	Elf_ver_def_title(lml);
52 }
53 
54 void
Dbg_ver_need_title(Lm_list * lml,const char * file)55 Dbg_ver_need_title(Lm_list *lml, const char *file)
56 {
57 	if (DBG_NOTCLASS(DBG_C_VERSIONS))
58 		return;
59 
60 	Dbg_util_nl(lml, DBG_NL_STD);
61 	dbg_print(lml, MSG_INTL(MSG_VER_NEED_TITLE), file);
62 	Elf_ver_need_title(lml, 0);
63 }
64 
65 void
Dbg_ver_need_entry(Lm_list * lml,Half cnt,const char * file,const char * version)66 Dbg_ver_need_entry(Lm_list *lml, Half cnt, const char *file,
67     const char *version)
68 {
69 	if (DBG_NOTCLASS(DBG_C_VERSIONS))
70 		return;
71 
72 	if (cnt)
73 		Elf_ver_line_4(lml, version);
74 	else
75 		Elf_ver_line_5(lml, file, version);
76 }
77 
78 void
Dbg_ver_symbol(Lm_list * lml,const char * name)79 Dbg_ver_symbol(Lm_list *lml, const char *name)
80 {
81 	static Boolean	ver_symbol_title = TRUE;
82 
83 	if (DBG_NOTCLASS(DBG_C_VERSIONS | DBG_C_SYMBOLS))
84 		return;
85 
86 	if (DBG_NOTCLASS(DBG_C_VERSIONS))
87 		if (ver_symbol_title) {
88 			ver_symbol_title = FALSE;
89 			Dbg_util_nl(lml, DBG_NL_STD);
90 			dbg_print(lml, MSG_INTL(MSG_SYM_VERSION));
91 		}
92 
93 	Dbg_syms_created(lml, name);
94 }
95 
96 /*
97  * This function doesn't test for any specific debugging category, thus it will
98  * be generated for any debugging family.
99  */
100 void
Dbg_ver_nointerface(Lm_list * lml,const char * name)101 Dbg_ver_nointerface(Lm_list *lml, const char *name)
102 {
103 	Dbg_util_nl(lml, DBG_NL_STD);
104 	dbg_print(lml, MSG_INTL(MSG_VER_NOINTERFACE), name);
105 	Dbg_util_nl(lml, DBG_NL_STD);
106 }
107 
108 void
Dbg_ver_desc_entry(Lm_list * lml,Ver_desc * vdp)109 Dbg_ver_desc_entry(Lm_list *lml, Ver_desc *vdp)
110 {
111 	Conv_ver_flags_buf_t	ver_flags_buf;
112 	const char		*dep;
113 	Ver_desc		*_vdp, *__vdp;
114 	Aliste 			idx;
115 	char			index[10];
116 
117 	if (DBG_NOTCLASS(DBG_C_VERSIONS))
118 		return;
119 
120 	if (vdp->vd_deps) {
121 		_vdp = (Ver_desc *)vdp->vd_deps->apl_data[0];
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, 0, &ver_flags_buf));
130 
131 	/*
132 	 * Loop through the dependency list in case there are more that one
133 	 * dependency.
134 	 */
135 	for (APLIST_TRAVERSE(vdp->vd_deps, idx, __vdp)) {
136 		if (_vdp == __vdp)
137 			continue;
138 		Elf_ver_line_4(lml, __vdp->vd_name);
139 	}
140 }
141 
142 void
Dbg_ver_avail_entry(Lm_list * lml,Ver_index * vip,const char * select)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
Elf_ver_def_title(Lm_list * lml)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
Elf_ver_need_title(Lm_list * lml,int gnuver)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
Elf_ver_line_1(Lm_list * lml,const char * index,const char * name,const char * dep,const char * flags)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
Elf_ver_line_2(Lm_list * lml,const char * name,const char * dep)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
Elf_ver_line_3(Lm_list * lml,const char * name,const char * dep,const char * flags)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
Elf_ver_line_4(Lm_list * lml,const char * version)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
Elf_ver_line_5(Lm_list * lml,const char * file,const char * version)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 
223 /*
224  * Called after final call to Dbg_ver_need() to inject final newline.
225  */
226 void
Dbg_ver_need_done(Lm_list * lml)227 Dbg_ver_need_done(Lm_list *lml)
228 {
229 	if (DBG_NOTCLASS(DBG_C_VERSIONS))
230 		return;
231 
232 	Dbg_util_nl(lml, DBG_NL_STD);
233 }
234