map.c revision 4734:a4708faa3e85
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	"msg.h"
29#include	"_debug.h"
30#include	"libld.h"
31
32static const char
33	*Dbg_decl =	NULL;
34
35void
36Dbg_map_set_atsign(Boolean new)
37{
38	if (DBG_NOTCLASS(DBG_C_MAP))
39		return;
40
41	if (new)
42		Dbg_decl = MSG_INTL(MSG_MAP_SEG_DECL_4);
43	else
44		Dbg_decl = MSG_INTL(MSG_MAP_SEG_DECL_5);
45}
46
47void
48Dbg_map_set_equal(Boolean new)
49{
50	if (DBG_NOTCLASS(DBG_C_MAP))
51		return;
52
53	if (new)
54		Dbg_decl = MSG_INTL(MSG_MAP_SEG_DECL_1);
55	else
56		Dbg_decl = MSG_INTL(MSG_MAP_SEG_DECL_2);
57}
58
59void
60Dbg_map_version(Lm_list *lml, const char *version, const char *name, int scope)
61{
62	const char	*str, *scp;
63
64	if (DBG_NOTCLASS(DBG_C_MAP | DBG_C_SYMBOLS))
65		return;
66
67	str = MSG_INTL(MSG_MAP_SYM_SCOPE);
68	if (scope)
69		scp = MSG_ORIG(MSG_SYM_GLOBAL);
70	else
71		scp = MSG_ORIG(MSG_SYM_LOCAL);
72
73	if (version)
74		dbg_print(lml, MSG_INTL(MSG_MAP_SYM_VER_1), str, version,
75		    Dbg_demangle_name(name), scp);
76	else
77		dbg_print(lml, MSG_INTL(MSG_MAP_SYM_VER_2), str,
78		    Dbg_demangle_name(name), scp);
79}
80
81void
82Dbg_map_size_new(Lm_list *lml, const char *name)
83{
84	if (DBG_NOTCLASS(DBG_C_MAP))
85		return;
86
87	dbg_print(lml, MSG_INTL(MSG_MAP_SYM_SIZE), Dbg_demangle_name(name),
88	    MSG_INTL(MSG_STR_ADD));
89}
90
91void
92Dbg_map_size_old(Ofl_desc *ofl, Sym_desc *sdp)
93{
94	Conv_inv_buf_t	inv_buf;
95	Lm_list		*lml = ofl->ofl_lml;
96
97	if (DBG_NOTCLASS(DBG_C_MAP))
98		return;
99
100	dbg_print(lml, MSG_INTL(MSG_MAP_SYM_SIZE), sdp->sd_name,
101	    MSG_INTL(MSG_STR_UP_1));
102
103	if (DBG_NOTDETAIL())
104		return;
105
106	Elf_syms_table_entry(lml, ELF_DBG_LD, MSG_INTL(MSG_STR_UP_2),
107	    ofl->ofl_dehdr->e_machine, sdp->sd_sym,
108	    sdp->sd_aux ? sdp->sd_aux->sa_overndx : 0, 0, NULL,
109	    conv_def_tag(sdp->sd_ref, &inv_buf));
110}
111
112void
113Dbg_map_symbol(Ofl_desc *ofl, Sym_desc *sdp)
114{
115	Conv_inv_buf_t	inv_buf;
116	Lm_list		*lml = ofl->ofl_lml;
117
118	if (DBG_NOTCLASS(DBG_C_MAP))
119		return;
120	if (DBG_NOTDETAIL())
121		return;
122
123	/*
124	 * Provide for printing mapfile entered symbols when symbol debugging
125	 * hasn't been enabled.
126	 */
127	if (DBG_NOTCLASS(DBG_C_SYMBOLS))
128		Elf_syms_table_entry(lml, ELF_DBG_LD, MSG_INTL(MSG_STR_ENTERED),
129		    ofl->ofl_dehdr->e_machine, sdp->sd_sym,
130		    sdp->sd_aux ? sdp->sd_aux->sa_overndx : 0, 0, NULL,
131		    conv_def_tag(sdp->sd_ref, &inv_buf));
132}
133
134void
135Dbg_map_dash(Lm_list *lml, const char *name, Sdf_desc *sdf)
136{
137	const char	*str;
138
139	if (DBG_NOTCLASS(DBG_C_MAP))
140		return;
141
142	if (sdf->sdf_flags & FLG_SDF_SONAME)
143		str = MSG_INTL(MSG_MAP_CNT_DEF_1);
144	else
145		str = MSG_INTL(MSG_MAP_CNT_DEF_2);
146
147	dbg_print(lml, str, name, sdf->sdf_soname);
148}
149
150void
151Dbg_map_sort_orig(Lm_list *lml, Sg_desc *sgp)
152{
153	const char	*str;
154
155	if (DBG_NOTCLASS(DBG_C_MAP))
156		return;
157	if (DBG_NOTDETAIL())
158		return;
159
160	if (sgp->sg_name && *sgp->sg_name)
161		str = sgp->sg_name;
162	else
163		str = MSG_INTL(MSG_STR_NULL);
164
165	dbg_print(lml, MSG_INTL(MSG_MAP_SORTSEG), str);
166}
167
168void
169Dbg_map_sort_fini(Lm_list *lml, Sg_desc *sgp)
170{
171	const char	*str;
172
173	if (DBG_NOTCLASS(DBG_C_MAP))
174		return;
175	if (DBG_NOTDETAIL())
176		return;
177
178	if (sgp->sg_name && *sgp->sg_name)
179		str = sgp->sg_name;
180	else
181		str = MSG_INTL(MSG_STR_NULL);
182
183	dbg_print(lml, MSG_INTL(MSG_MAP_SEGSORT), str);
184}
185
186void
187Dbg_map_parse(Lm_list *lml, const char *file)
188{
189	if (DBG_NOTCLASS(DBG_C_MAP))
190		return;
191
192	Dbg_util_nl(lml, DBG_NL_STD);
193	dbg_print(lml, MSG_INTL(MSG_MAP_MAPFILE), file);
194}
195
196void
197Dbg_map_ent(Lm_list *lml, Boolean new, Ent_desc *enp, Ofl_desc *ofl)
198{
199	if (DBG_NOTCLASS(DBG_C_MAP))
200		return;
201
202	dbg_print(lml, MSG_INTL(MSG_MAP_MAP_DIR));
203	Dbg_ent_entry(lml, ofl->ofl_dehdr->e_machine, enp);
204	if (new)
205		Dbg_decl = MSG_INTL(MSG_MAP_SEG_DECL_3);
206}
207
208void
209Dbg_map_pipe(Lm_list *lml, Sg_desc *sgp, const char *sec_name, const Word ndx)
210{
211	if (DBG_NOTCLASS(DBG_C_MAP))
212		return;
213
214	dbg_print(lml, MSG_INTL(MSG_MAP_SEC_ORDER), sgp->sg_name, sec_name,
215	    EC_WORD(ndx));
216}
217
218void
219Dbg_map_seg(Ofl_desc *ofl, int ndx, Sg_desc *sgp)
220{
221	Lm_list	*lml = ofl->ofl_lml;
222
223	if (DBG_NOTCLASS(DBG_C_MAP))
224		return;
225
226	if (Dbg_decl) {
227		dbg_print(lml, MSG_ORIG(MSG_FMT_STR), Dbg_decl);
228		Dbg_seg_desc_entry(ofl->ofl_lml,
229		    ofl->ofl_dehdr->e_machine, ndx, sgp);
230		Dbg_util_nl(lml, DBG_NL_STD);
231		Dbg_decl = NULL;
232	}
233}
234