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