xref: /illumos-gate/usr/src/cmd/sgs/liblddbg/common/syms.c (revision 08278a5e)
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	<dlfcn.h>
29 #include	"msg.h"
30 #include	"_debug.h"
31 #include	"libld.h"
32 
33 #if	!(defined(_ELF64))
34 
35 void
36 Dbg_syms_lookup_aout(Lm_list *lml, const char *name)
37 {
38 	if (DBG_NOTCLASS(DBG_C_SYMBOLS))
39 		return;
40 
41 	dbg_print(lml, MSG_INTL(MSG_SYM_AOUT), Dbg_demangle_name(name));
42 }
43 
44 #endif
45 
46 void
47 Dbg_syms_lookup(Rt_map *lmp, const char *name, const char *type)
48 {
49 	Lm_list	*lml = LIST(lmp);
50 
51 	if (DBG_NOTCLASS(DBG_C_SYMBOLS))
52 		return;
53 
54 	dbg_print(lml, MSG_INTL(MSG_SYM_LOOKUP), Dbg_demangle_name(name),
55 	    NAME(lmp), type);
56 }
57 
58 static	const Msg captype[DBG_CAP_MACH + 1] = {
59 	MSG_CAP_SYM_DEFAULT,		/* MSG_INTL(MSG_CAP_SYM_DEFAULT) */
60 	MSG_CAP_SYM_USED,		/* MSG_INTL(MSG_CAP_SYM_USED) */
61 	MSG_CAP_SYM_CANDIDATE,		/* MSG_INTL(MSG_CAP_SYM_CANDIDATE) */
62 	MSG_CAP_SYM_REJECTED,		/* MSG_INTL(MSG_CAP_SYM_REJECTED) */
63 	MSG_CAP_SYM_HW_1,		/* MSG_INTL(MSG_CAP_SYM_HW_1) */
64 	MSG_CAP_SYM_SF_1,		/* MSG_INTL(MSG_CAP_SYM_SF_1) */
65 	MSG_CAP_SYM_HW_2,		/* MSG_INTL(MSG_CAP_SYM_HW_2) */
66 	MSG_CAP_SYM_PLAT,		/* MSG_INTL(MSG_CAP_SYM_PLAT) */
67 	MSG_CAP_SYM_MACH		/* MSG_INTL(MSG_CAP_SYM_MACH) */
68 };
69 
70 void
71 Dbg_syms_cap_lookup(Rt_map *lmp, uint_t type, const char *name, uint_t ndx,
72     Half mach, Syscapset *scapset)
73 {
74 	Lm_list			*lml = LIST(lmp);
75 	const char		*str = NULL;
76 	Conv_cap_val_buf_t	cap_val_buf;
77 
78 	if (DBG_NOTCLASS(DBG_C_CAP | DBG_C_SYMBOLS))
79 		return;
80 
81 	switch (type) {
82 	case DBG_CAP_HW_1:
83 		str = conv_cap_val_hw1(scapset->sc_hw_1, mach, 0,
84 		    &cap_val_buf.cap_val_hw1_buf);
85 		break;
86 	case DBG_CAP_SF_1:
87 		str = conv_cap_val_sf1(scapset->sc_sf_1, mach, 0,
88 		    &cap_val_buf.cap_val_sf1_buf);
89 		break;
90 	case DBG_CAP_HW_2:
91 		str = conv_cap_val_hw2(scapset->sc_hw_2, mach, 0,
92 		    &cap_val_buf.cap_val_hw2_buf);
93 		break;
94 	case DBG_CAP_MACH:
95 		str = scapset->sc_mach;
96 		break;
97 	case DBG_CAP_PLAT:
98 		str = scapset->sc_plat;
99 		break;
100 	}
101 
102 	dbg_print(lml, MSG_INTL(captype[type]), Dbg_demangle_name(name),
103 	    ndx, str);
104 }
105 
106 void
107 Dbg_syms_ignore_gnuver(Rt_map *lmp, const char *name, Word symndx,
108     Versym verndx)
109 {
110 	Lm_list	*lml = LIST(lmp);
111 
112 	if (DBG_NOTCLASS(DBG_C_SYMBOLS))
113 		return;
114 
115 	dbg_print(lml, MSG_INTL(MSG_SYM_IGNGNUVER), Dbg_demangle_name(name),
116 	    EC_WORD(symndx), EC_HALF(verndx), NAME(lmp));
117 }
118 
119 void
120 Dbg_syms_dlsym(Rt_map *clmp, const char *sym, int *in_nfavl, const char *next,
121     int flag)
122 {
123 	const char	*str, *retry, *from = NAME(clmp);
124 	Lm_list		*lml = LIST(clmp);
125 
126 	if (DBG_NOTCLASS(DBG_C_SYMBOLS))
127 		return;
128 
129 	/*
130 	 * The core functionality of dlsym() can be called twice.  The first
131 	 * attempt can be affected by path names that exist in the "not-found"
132 	 * AVL tree.  Should a "not-found" path name be found, a second attempt
133 	 * is made to locate the required file (in_nfavl is NULL).  This fall-
134 	 * back provides for file system changes while a process executes.
135 	 */
136 	if (in_nfavl)
137 		retry = MSG_ORIG(MSG_STR_EMPTY);
138 	else
139 		retry = MSG_INTL(MSG_STR_RETRY);
140 
141 	switch (flag) {
142 	case DBG_DLSYM_NEXT:
143 		str = MSG_ORIG(MSG_SYM_NEXT);
144 		break;
145 	case DBG_DLSYM_DEFAULT:
146 		str = MSG_ORIG(MSG_SYM_DEFAULT);
147 		break;
148 	case DBG_DLSYM_SELF:
149 		str = MSG_ORIG(MSG_SYM_SELF);
150 		break;
151 	case DBG_DLSYM_PROBE:
152 		str = MSG_ORIG(MSG_SYM_PROBE);
153 		break;
154 	case DBG_DLSYM_SINGLETON:
155 		str = MSG_ORIG(MSG_SYM_SINGLETON);
156 		break;
157 	default:
158 		str = MSG_ORIG(MSG_STR_EMPTY);
159 	}
160 
161 	Dbg_util_nl(lml, DBG_NL_STD);
162 	if (next == 0)
163 		dbg_print(lml, MSG_INTL(MSG_SYM_DLSYM_1),
164 		    Dbg_demangle_name(sym), from, retry, str);
165 	else
166 		dbg_print(lml, MSG_INTL(MSG_SYM_DLSYM_2),
167 		    Dbg_demangle_name(sym), from, next, retry, str);
168 }
169 
170 void
171 Dbg_syms_lazy_rescan(Lm_list *lml, const char *name)
172 {
173 	if (DBG_NOTCLASS(DBG_C_SYMBOLS | DBG_C_FILES))
174 		return;
175 
176 	Dbg_util_nl(lml, DBG_NL_STD);
177 	dbg_print(lml, MSG_INTL(MSG_SYM_LAZY_RESCAN), Dbg_demangle_name(name));
178 }
179 
180 void
181 Dbg_syms_ar_title(Lm_list *lml, const char *file, int again)
182 {
183 	if (DBG_NOTCLASS(DBG_C_SYMBOLS))
184 		return;
185 
186 	Dbg_util_nl(lml, DBG_NL_STD);
187 	dbg_print(lml, MSG_INTL(MSG_SYM_AR_FILE), file,
188 	    again ? MSG_INTL(MSG_STR_AGAIN) : MSG_ORIG(MSG_STR_EMPTY));
189 }
190 
191 void
192 Dbg_syms_ar_entry(Lm_list *lml, Xword ndx, Elf_Arsym *arsym)
193 {
194 	if (DBG_NOTCLASS(DBG_C_SYMBOLS))
195 		return;
196 
197 	dbg_print(lml, MSG_INTL(MSG_SYM_AR_ENTRY), EC_XWORD(ndx),
198 	    Dbg_demangle_name(arsym->as_name));
199 }
200 
201 void
202 Dbg_syms_ar_checking(Lm_list *lml, Xword ndx, Elf_Arsym *arsym,
203     const char *name)
204 {
205 	if (DBG_NOTCLASS(DBG_C_SYMBOLS))
206 		return;
207 
208 	dbg_print(lml, MSG_INTL(MSG_SYM_AR_CHECK), EC_XWORD(ndx),
209 	    Dbg_demangle_name(arsym->as_name), name);
210 }
211 
212 void
213 Dbg_syms_ar_resolve(Lm_list *lml, Xword ndx, Elf_Arsym *arsym,
214     const char *fname, int flag)
215 {
216 	const char	*fmt;
217 
218 	if (DBG_NOTCLASS(DBG_C_SYMBOLS))
219 		return;
220 
221 	if (flag)
222 		fmt = MSG_INTL(MSG_SYM_AR_FORCEDEXRT);
223 	else
224 		fmt = MSG_INTL(MSG_SYM_AR_RESOLVE);
225 
226 	dbg_print(lml, fmt, EC_XWORD(ndx), Dbg_demangle_name(arsym->as_name),
227 	    fname);
228 }
229 
230 void
231 Dbg_syms_spec_title(Lm_list *lml)
232 {
233 	if (DBG_NOTCLASS(DBG_C_SYMBOLS))
234 		return;
235 
236 	Dbg_util_nl(lml, DBG_NL_STD);
237 	dbg_print(lml, MSG_INTL(MSG_SYM_SPECIAL));
238 }
239 
240 void
241 Dbg_syms_discarded(Lm_list *lml, Sym_desc *sdp)
242 {
243 	dbg_isec_name_buf_t	buf;
244 	char			*alloc_mem;
245 	const char		*file;
246 
247 	if (DBG_NOTCLASS(DBG_C_SYMBOLS | DBG_C_UNUSED))
248 		return;
249 	if (DBG_NOTDETAIL())
250 		return;
251 
252 	if ((sdp->sd_file == NULL) || ((file = sdp->sd_file->ifl_name) == NULL))
253 		file = MSG_INTL(MSG_STR_UNKNOWN);
254 
255 	if (sdp->sd_isc) {
256 		dbg_print(lml, MSG_INTL(MSG_SYM_DISCARD_SEC),
257 		    Dbg_demangle_name(sdp->sd_name),
258 		    dbg_fmt_isec_name(sdp->sd_isc, buf, &alloc_mem), file);
259 		if (alloc_mem != NULL)
260 			free(alloc_mem);
261 	} else
262 		dbg_print(lml, MSG_INTL(MSG_SYM_DISCARD_FILE),
263 		    Dbg_demangle_name(sdp->sd_name), file);
264 }
265 
266 void
267 Dbg_syms_dup_discarded(Lm_list *lml, Word ndx, Sym_desc *sdp)
268 {
269 	const char	*file;
270 
271 	if (DBG_NOTCLASS(DBG_C_SYMBOLS | DBG_C_UNUSED))
272 		return;
273 	if (DBG_NOTDETAIL())
274 		return;
275 
276 	if ((sdp->sd_file == NULL) || ((file = sdp->sd_file->ifl_name) == NULL))
277 		file = MSG_INTL(MSG_STR_UNKNOWN);
278 
279 	dbg_print(lml, MSG_INTL(MSG_SYM_DISCARD_DUP), EC_WORD(ndx),
280 	    Dbg_demangle_name(sdp->sd_name), file);
281 }
282 
283 void
284 Dbg_syms_entered(Ofl_desc *ofl, Sym *sym, Sym_desc *sdp)
285 {
286 	Conv_inv_buf_t	inv_buf;
287 	Lm_list		*lml = ofl->ofl_lml;
288 
289 	if (DBG_NOTCLASS(DBG_C_SYMBOLS))
290 		return;
291 	if (DBG_NOTDETAIL())
292 		return;
293 
294 	Elf_syms_table_entry(lml, ELF_DBG_LD, MSG_INTL(MSG_STR_ENTERED),
295 	    ofl->ofl_dehdr->e_ident[EI_OSABI], ofl->ofl_dehdr->e_machine, sym,
296 	    sdp->sd_aux ? sdp->sd_aux->sa_overndx : 0, 0, NULL,
297 	    conv_def_tag(sdp->sd_ref, &inv_buf));
298 }
299 
300 void
301 Dbg_syms_process(Lm_list *lml, Ifl_desc *ifl)
302 {
303 	Conv_inv_buf_t	inv_buf;
304 
305 	if (DBG_NOTCLASS(DBG_C_SYMBOLS))
306 		return;
307 
308 	Dbg_util_nl(lml, DBG_NL_STD);
309 	dbg_print(lml, MSG_INTL(MSG_SYM_PROCESS), ifl->ifl_name,
310 	    conv_ehdr_type(ifl->ifl_ehdr->e_ident[EI_OSABI],
311 	    ifl->ifl_ehdr->e_type, 0, &inv_buf));
312 }
313 
314 void
315 Dbg_syms_entry(Lm_list *lml, Word ndx, Sym_desc *sdp)
316 {
317 	if (DBG_NOTCLASS(DBG_C_SYMBOLS))
318 		return;
319 
320 	dbg_print(lml, MSG_INTL(MSG_SYM_BASIC), EC_WORD(ndx),
321 	    Dbg_demangle_name(sdp->sd_name));
322 }
323 
324 void
325 Dbg_syms_global(Lm_list *lml, Word ndx, const char *name)
326 {
327 	if (DBG_NOTCLASS(DBG_C_SYMBOLS))
328 		return;
329 
330 	dbg_print(lml, MSG_INTL(MSG_SYM_ADDING), EC_WORD(ndx),
331 	    Dbg_demangle_name(name));
332 }
333 
334 void
335 Dbg_syms_cap_convert(Ofl_desc *ofl, Word ndx, const char *name, Sym *sym)
336 {
337 	if (DBG_NOTCLASS(DBG_C_CAP | DBG_C_SYMBOLS))
338 		return;
339 
340 	dbg_print(ofl->ofl_lml, MSG_INTL(MSG_SYM_CAP_ORIG), EC_WORD(ndx),
341 	    Dbg_demangle_name(name));
342 
343 	if (DBG_NOTDETAIL())
344 		return;
345 
346 	Elf_syms_table_entry(ofl->ofl_lml, ELF_DBG_LD,
347 	    MSG_INTL(MSG_STR_ORIGINAL), ofl->ofl_dehdr->e_ident[EI_OSABI],
348 	    ofl->ofl_dehdr->e_machine, sym, 0, 0, NULL,
349 	    MSG_ORIG(MSG_STR_EMPTY));
350 }
351 
352 void
353 Dbg_syms_cap_local(Ofl_desc *ofl, Word ndx, const char *name, Sym *sym,
354     Sym_desc *sdp)
355 {
356 	Conv_inv_buf_t	inv_buf;
357 
358 	if (DBG_NOTCLASS(DBG_C_CAP | DBG_C_SYMBOLS))
359 		return;
360 
361 	dbg_print(ofl->ofl_lml, MSG_INTL(MSG_SYM_CAP_LOCAL), EC_WORD(ndx),
362 	    Dbg_demangle_name(name));
363 
364 	if (DBG_NOTDETAIL())
365 		return;
366 
367 	Elf_syms_table_entry(ofl->ofl_lml, ELF_DBG_LD,
368 	    MSG_INTL(MSG_STR_ENTERED), ofl->ofl_dehdr->e_ident[EI_OSABI],
369 	    ofl->ofl_dehdr->e_machine, sym,
370 	    sdp->sd_aux ? sdp->sd_aux->sa_overndx : 0, 0, NULL,
371 	    conv_def_tag(sdp->sd_ref, &inv_buf));
372 }
373 
374 void
375 Dbg_syms_wrap(Lm_list *lml, Word ndx, const char *orig_name, const char *name)
376 {
377 	if (DBG_NOTCLASS(DBG_C_SYMBOLS))
378 		return;
379 
380 	dbg_print(lml, MSG_INTL(MSG_SYM_WRAP), EC_WORD(ndx),
381 	    Dbg_demangle_name(orig_name), Dbg_demangle_name(name));
382 }
383 
384 void
385 Dbg_syms_sec_title(Lm_list *lml)
386 {
387 	if (DBG_NOTCLASS(DBG_C_SYMBOLS))
388 		return;
389 	if (DBG_NOTDETAIL())
390 		return;
391 
392 	Dbg_util_nl(lml, DBG_NL_STD);
393 	dbg_print(lml, MSG_INTL(MSG_SYM_INDEX));
394 }
395 
396 void
397 Dbg_syms_sec_entry(Lm_list *lml, Word ndx, Sg_desc *sgp, Os_desc *osp)
398 {
399 	if (DBG_NOTCLASS(DBG_C_SYMBOLS))
400 		return;
401 	if (DBG_NOTDETAIL())
402 		return;
403 
404 	dbg_print(lml, MSG_INTL(MSG_SYM_SECTION), EC_WORD(ndx), osp->os_name,
405 	    (*sgp->sg_name ? sgp->sg_name : MSG_INTL(MSG_STR_NULL)));
406 }
407 
408 void
409 Dbg_syms_up_title(Lm_list *lml)
410 {
411 	if (DBG_NOTCLASS(DBG_C_SYMBOLS))
412 		return;
413 	if (DBG_NOTDETAIL())
414 		return;
415 
416 	Dbg_util_nl(lml, DBG_NL_STD);
417 	dbg_print(lml, MSG_INTL(MSG_SYM_FINAL));
418 	Elf_syms_table_title(lml, ELF_DBG_LD);
419 }
420 
421 void
422 Dbg_syms_ignore(Ofl_desc *ofl, Sym_desc *sdp)
423 {
424 	if (DBG_NOTCLASS(DBG_C_SYMBOLS))
425 		return;
426 	if (DBG_NOTDETAIL())
427 		return;
428 
429 	Elf_syms_table_entry(ofl->ofl_lml, ELF_DBG_LD, MSG_INTL(MSG_STR_IGNORE),
430 	    ofl->ofl_dehdr->e_ident[EI_OSABI], ofl->ofl_dehdr->e_machine,
431 	    sdp->sd_sym, 0, 0, NULL, MSG_INTL(MSG_STR_UNUSED));
432 }
433 
434 void
435 Dbg_syms_old(Ofl_desc *ofl, Sym_desc *sdp)
436 {
437 	if (DBG_NOTCLASS(DBG_C_SYMBOLS))
438 		return;
439 	if (DBG_NOTDETAIL())
440 		return;
441 
442 	Elf_syms_table_entry(ofl->ofl_lml, ELF_DBG_LD, MSG_INTL(MSG_STR_OLD),
443 	    ofl->ofl_dehdr->e_ident[EI_OSABI], ofl->ofl_dehdr->e_machine,
444 	    sdp->sd_sym, sdp->sd_aux ? sdp->sd_aux->sa_overndx : 0,
445 	    0, NULL, sdp->sd_name);
446 }
447 
448 void
449 Dbg_syms_new(Ofl_desc *ofl, Sym *sym, Sym_desc *sdp)
450 {
451 	Conv_inv_buf_t	inv_buf;
452 
453 	if (DBG_NOTCLASS(DBG_C_SYMBOLS))
454 		return;
455 	if (DBG_NOTDETAIL())
456 		return;
457 
458 	Elf_syms_table_entry(ofl->ofl_lml, ELF_DBG_LD, MSG_INTL(MSG_STR_NEW),
459 	    ofl->ofl_dehdr->e_ident[EI_OSABI], ofl->ofl_dehdr->e_machine, sym,
460 	    sdp->sd_aux ? sdp->sd_aux->sa_overndx : 0, 0, NULL,
461 	    conv_def_tag(sdp->sd_ref, &inv_buf));
462 }
463 
464 void
465 Dbg_syms_updated(Ofl_desc *ofl, Sym_desc *sdp, const char *name)
466 {
467 	Conv_inv_buf_t	inv_buf;
468 	Lm_list		*lml = ofl->ofl_lml;
469 
470 	if (DBG_NOTCLASS(DBG_C_SYMBOLS))
471 		return;
472 
473 	dbg_print(lml, MSG_INTL(MSG_SYM_UPDATE), name);
474 
475 	if (DBG_NOTDETAIL())
476 		return;
477 
478 	Elf_syms_table_entry(ofl->ofl_lml, ELF_DBG_LD, MSG_ORIG(MSG_STR_EMPTY),
479 	    ofl->ofl_dehdr->e_ident[EI_OSABI], ofl->ofl_dehdr->e_machine,
480 	    sdp->sd_sym, sdp->sd_aux ? sdp->sd_aux->sa_overndx : 0, 0, NULL,
481 	    conv_def_tag(sdp->sd_ref, &inv_buf));
482 }
483 
484 void
485 Dbg_syms_created(Lm_list *lml, const char *name)
486 {
487 	if (DBG_NOTCLASS(DBG_C_SYMBOLS))
488 		return;
489 
490 	dbg_print(lml, MSG_INTL(MSG_SYM_CREATE), Dbg_demangle_name(name));
491 }
492 
493 void
494 Dbg_syms_resolving(Ofl_desc *ofl, Word ndx, const char *name, int row,
495     int col, Sym *osym, Sym *nsym, Sym_desc *sdp, Ifl_desc *ifl)
496 {
497 	Lm_list	*lml = ofl->ofl_lml;
498 	uchar_t	osabi = ofl->ofl_dehdr->e_ident[EI_OSABI];
499 	Half	mach = ofl->ofl_dehdr->e_machine;
500 
501 	if (DBG_NOTCLASS(DBG_C_SYMBOLS))
502 		return;
503 
504 	dbg_print(lml, MSG_INTL(MSG_SYM_RESOLVING), EC_WORD(ndx),
505 	    Dbg_demangle_name(name), row, col);
506 
507 	if (DBG_NOTDETAIL())
508 		return;
509 
510 	Elf_syms_table_entry(ofl->ofl_lml, ELF_DBG_LD, MSG_INTL(MSG_STR_OLD),
511 	    osabi, mach, osym, sdp->sd_aux ? sdp->sd_aux->sa_overndx : 0,
512 	    0, NULL, sdp->sd_file->ifl_name);
513 
514 	Elf_syms_table_entry(ofl->ofl_lml, ELF_DBG_LD, MSG_INTL(MSG_STR_NEW),
515 	    osabi, mach, nsym, 0, 0, NULL, ifl->ifl_name);
516 }
517 
518 void
519 Dbg_syms_resolved(Ofl_desc *ofl, Sym_desc *sdp)
520 {
521 	Conv_inv_buf_t	inv_buf;
522 
523 	if (DBG_NOTCLASS(DBG_C_SYMBOLS))
524 		return;
525 	if (DBG_NOTDETAIL())
526 		return;
527 
528 	Elf_syms_table_entry(ofl->ofl_lml, ELF_DBG_LD,
529 	    MSG_INTL(MSG_STR_RESOLVED), ofl->ofl_dehdr->e_ident[EI_OSABI],
530 	    ofl->ofl_dehdr->e_machine, sdp->sd_sym,
531 	    sdp->sd_aux ? sdp->sd_aux->sa_overndx : 0, 0, NULL,
532 	    conv_def_tag(sdp->sd_ref, &inv_buf));
533 }
534 
535 void
536 Dbg_syms_reloc(Ofl_desc *ofl, Sym_desc *sdp)
537 {
538 	static Boolean	symbol_title = TRUE;
539 	Conv_inv_buf_t	inv_buf;
540 	Lm_list	*lml = ofl->ofl_lml;
541 
542 	if (DBG_NOTCLASS(DBG_C_SYMBOLS))
543 		return;
544 
545 	if (symbol_title) {
546 		Dbg_util_nl(lml, DBG_NL_STD);
547 		dbg_print(lml, MSG_INTL(MSG_SYM_BSS));
548 
549 		symbol_title = FALSE;
550 	}
551 	dbg_print(lml, MSG_INTL(MSG_SYM_UPDATE),
552 	    Dbg_demangle_name(sdp->sd_name));
553 
554 	if (DBG_NOTDETAIL())
555 		return;
556 
557 	Elf_syms_table_entry(lml, ELF_DBG_LD, MSG_ORIG(MSG_SYM_COPY),
558 	    ofl->ofl_dehdr->e_ident[EI_OSABI], ofl->ofl_dehdr->e_machine,
559 	    sdp->sd_sym, sdp->sd_aux ? sdp->sd_aux->sa_overndx : 0, 0, NULL,
560 	    conv_def_tag(sdp->sd_ref, &inv_buf));
561 }
562 
563 void
564 Dbg_syms_reduce(Ofl_desc *ofl, int which, Sym_desc *sdp, int idx,
565     const char *sname)
566 {
567 	static Boolean	sym_reduce_title = TRUE;
568 	static Boolean	sym_retain_title = TRUE;
569 	Boolean		isfromglobal = (which == DBG_SYM_REDUCE_GLOBAL);
570 	Boolean		isfromretain = (which == DBG_SYM_REDUCE_RETAIN);
571 	Lm_list		*lml = ofl->ofl_lml;
572 
573 	if (DBG_NOTCLASS(DBG_C_SYMBOLS | DBG_C_VERSIONS))
574 		return;
575 
576 	if (sym_reduce_title && isfromglobal) {
577 		sym_reduce_title = FALSE;
578 		Dbg_util_nl(lml, DBG_NL_STD);
579 		dbg_print(lml, MSG_INTL(MSG_SYM_REDUCED));
580 	} else if (sym_retain_title && isfromretain) {
581 		sym_retain_title = FALSE;
582 		Dbg_util_nl(lml, DBG_NL_STD);
583 		dbg_print(lml, MSG_INTL(MSG_SYM_RETAINING));
584 	}
585 
586 	if ((sdp->sd_flags & FLG_SY_ELIM) && isfromglobal)
587 		dbg_print(lml, MSG_INTL(MSG_SYM_ELIMINATING),
588 		    Dbg_demangle_name(sdp->sd_name));
589 	else if (isfromglobal)
590 		dbg_print(lml, MSG_INTL(MSG_SYM_REDUCING),
591 		    Dbg_demangle_name(sdp->sd_name));
592 	else
593 		dbg_print(lml, MSG_INTL(MSG_SYM_NOTELIMINATE),
594 		    Dbg_demangle_name(sdp->sd_name), sname, idx);
595 
596 	if (DBG_NOTDETAIL())
597 		return;
598 
599 	Elf_syms_table_entry(ofl->ofl_lml, ELF_DBG_LD, MSG_ORIG(MSG_SYM_LOCAL),
600 	    ofl->ofl_dehdr->e_ident[EI_OSABI], ofl->ofl_dehdr->e_machine,
601 	    sdp->sd_sym, sdp->sd_aux ? sdp->sd_aux->sa_overndx : 0, 0, NULL,
602 	    sdp->sd_file->ifl_name);
603 }
604 
605 void
606 Dbg_syms_dup_sort_addr(Lm_list *lml, const char *secname, const char *symname1,
607     const char *symname2, Addr addr)
608 {
609 	if (DBG_NOTCLASS(DBG_C_SYMBOLS) || DBG_NOTDETAIL())
610 		return;
611 
612 	dbg_print(lml, MSG_INTL(MSG_SYM_DUPSORTADDR), secname,
613 	    symname1, symname2, EC_ADDR(addr));
614 }
615 
616 void
617 Dbg_syminfo_title(Lm_list *lml)
618 {
619 	if (DBG_NOTCLASS(DBG_C_SYMBOLS))
620 		return;
621 	if (DBG_NOTDETAIL())
622 		return;
623 
624 	Dbg_util_nl(lml, DBG_NL_STD);
625 	dbg_print(lml, MSG_INTL(MSG_SYMINFO_INFO));
626 	Elf_syminfo_title(lml);
627 }
628 
629 void
630 Dbg_syminfo_entry(Lm_list *lml, Word ndx, Syminfo *sip, Sym *sym,
631     const char *strtab, Dyn *dyn)
632 {
633 	const char	*needed;
634 
635 	if (DBG_NOTCLASS(DBG_C_SYMBOLS))
636 		return;
637 	if (DBG_NOTDETAIL())
638 		return;
639 
640 	if (sip->si_boundto < SYMINFO_BT_LOWRESERVE)
641 		needed = strtab + dyn[sip->si_boundto].d_un.d_val;
642 	else
643 		needed = 0;
644 
645 	Elf_syminfo_entry(lml, ndx, sip,
646 	    Dbg_demangle_name(strtab + sym->st_name), needed);
647 }
648 
649 /*
650  * Symbol table output can differ slightly depending on the caller.  However,
651  * the final diagnostic is maintained here so hat the various message strings
652  * remain consistent
653  *
654  * elfdump:   index    value       size     type bind oth ver shndx       name
655  * ld:                 value       size     type bind oth ver shndx
656  */
657 void
658 Elf_syms_table_title(Lm_list *lml, int caller)
659 {
660 	if (caller == ELF_DBG_ELFDUMP) {
661 		if (DBG_NOTLONG())
662 			dbg_print(lml, MSG_INTL(MSG_SYM_EFS_TITLE));
663 		else
664 			dbg_print(lml, MSG_INTL(MSG_SYM_EFL_TITLE));
665 		return;
666 	}
667 
668 	if (caller == ELF_DBG_LD) {
669 		if (DBG_NOTLONG())
670 			dbg_print(lml, MSG_INTL(MSG_SYM_LDS_TITLE));
671 		else
672 			dbg_print(lml, MSG_INTL(MSG_SYM_LDL_TITLE));
673 		return;
674 	}
675 }
676 
677 void
678 Elf_syms_table_entry(Lm_list *lml, int caller, const char *prestr,
679     uchar_t osabi, Half mach, Sym *sym, Versym verndx, int gnuver,
680     const char *sec, const char *poststr)
681 {
682 	Conv_inv_buf_t	inv_buf1, inv_buf2, inv_buf3;
683 	Conv_inv_buf_t	inv_buf4, inv_buf5, inv_buf6;
684 	uchar_t		type = ELF_ST_TYPE(sym->st_info);
685 	uchar_t		bind = ELF_ST_BIND(sym->st_info);
686 	const char	*msg;
687 
688 	if ((caller == ELF_DBG_ELFDUMP) ||
689 	    (caller == ELF_DBG_LD)) {
690 		if (DBG_NOTLONG())
691 			msg = MSG_INTL(MSG_SYM_EFS_ENTRY);
692 		else
693 			msg = MSG_INTL(MSG_SYM_EFL_ENTRY);
694 
695 		if (sec == NULL)
696 			sec = conv_sym_shndx(osabi, mach, sym->st_shndx,
697 			    CONV_FMT_DECIMAL, &inv_buf6);
698 
699 		dbg_print(lml, msg, prestr,
700 		    conv_sym_value(mach, type, sym->st_value, &inv_buf1),
701 		    sym->st_size, conv_sym_info_type(mach, type, 0, &inv_buf2),
702 		    conv_sym_info_bind(bind, 0, &inv_buf3),
703 		    conv_sym_other(sym->st_other, &inv_buf4),
704 		    conv_ver_index(verndx, gnuver, &inv_buf5),
705 		    sec, Elf_demangle_name(poststr));
706 	}
707 }
708 
709 void
710 Dbg_syms_cap_title(Ofl_desc *ofl)
711 {
712 	Lm_list	*lml = ofl->ofl_lml;
713 
714 	if (DBG_NOTCLASS(DBG_C_SYMBOLS))
715 		return;
716 	if (DBG_NOTDETAIL())
717 		return;
718 
719 	Dbg_util_nl(lml, DBG_NL_STD);
720 	dbg_print(lml, MSG_INTL(MSG_SYM_CAPABILITIES));
721 	Elf_syms_table_title(lml, ELF_DBG_LD);
722 }
723