syms.c revision 11827:d7ef53deac3f
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
35void
36Dbg_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
46void
47Dbg_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
58static	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
70void
71Dbg_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
106void
107Dbg_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
119void
120Dbg_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
170void
171Dbg_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
180void
181Dbg_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
191void
192Dbg_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
201void
202Dbg_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
212void
213Dbg_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
230void
231Dbg_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
240void
241Dbg_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
266void
267Dbg_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
283void
284Dbg_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
300void
301Dbg_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
314void
315Dbg_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
324void
325Dbg_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
334void
335Dbg_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
352void
353Dbg_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
374void
375Dbg_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
384void
385Dbg_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
396void
397Dbg_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
408void
409Dbg_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
421void
422Dbg_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
434void
435Dbg_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
448void
449Dbg_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
464void
465Dbg_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
484void
485Dbg_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
493void
494Dbg_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
518void
519Dbg_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
535void
536Dbg_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
563void
564Dbg_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
605void
606Dbg_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
616void
617Dbg_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
629void
630Dbg_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 */
657void
658Elf_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
677void
678Elf_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
709void
710Dbg_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