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.
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.
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]
23 * Copyright (c) 1992, 2010, Oracle and/or its affiliates. All rights reserved.
27 * String conversion routine for .dynamic tag entries.
31 #include <sys/elf_SPARC.h>
34 #include "dynamic_msg.h"
39 conv_dyn_posflag1_strings(Conv_fmt_flags_t fmt_flags
)
41 #define POSSZ CONV_EXPN_FIELD_DEF_PREFIX_SIZE + \
42 MSG_DF_P1_LAZYLOAD_CF_SIZE + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
43 MSG_DF_P1_GROUPPERM_CF_SIZE + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
44 MSG_DF_P1_DEFERRED_CF_SIZE + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
45 CONV_INV_BUFSIZE + CONV_EXPN_FIELD_DEF_SUFFIX_SIZE
48 * Ensure that Conv_dyn_posflag1_buf_t is large enough:
50 * POSSZ is the real minimum size of the buffer required by
51 * conv_dyn_posflag1(). However, Conv_dyn_posflag1_buf_t uses
52 * CONV_DYN_POSFLAG1_BUFSIZE to set the buffer size. We do things
53 * this way because the definition of POSSZ uses
54 * information that is not available in the environment of other
55 * programs that include the conv.h header file.
57 #if (CONV_DYN_POSFLAG1_BUFSIZE != POSSZ) && !defined(__lint)
58 #define REPORT_BUFSIZE POSSZ
59 #include "report_bufsize.h"
60 #error "CONV_DYN_POSFLAG1_BUFSIZE does not match POSSZ"
63 static const Val_desc vda_def
[] = {
64 { DF_P1_LAZYLOAD
, MSG_DF_P1_LAZYLOAD_DEF
},
65 { DF_P1_GROUPPERM
, MSG_DF_P1_GROUPPERM_DEF
},
66 { DF_P1_DEFERRED
, MSG_DF_P1_DEFERRED_DEF
},
69 static const Val_desc vda_cf
[] = {
70 { DF_P1_LAZYLOAD
, MSG_DF_P1_LAZYLOAD_CF
},
71 { DF_P1_GROUPPERM
, MSG_DF_P1_GROUPPERM_CF
},
72 { DF_P1_DEFERRED
, MSG_DF_P1_DEFERRED_CF
},
75 static const Val_desc vda_cfnp
[] = {
76 { DF_P1_LAZYLOAD
, MSG_DF_P1_LAZYLOAD_CFNP
},
77 { DF_P1_GROUPPERM
, MSG_DF_P1_GROUPPERM_CFNP
},
78 { DF_P1_DEFERRED
, MSG_DF_P1_DEFERRED_CFNP
},
81 static const Val_desc vda_nf
[] = {
82 { DF_P1_LAZYLOAD
, MSG_DF_P1_LAZYLOAD_NF
},
83 { DF_P1_GROUPPERM
, MSG_DF_P1_GROUPPERM_NF
},
84 { DF_P1_DEFERRED
, MSG_DF_P1_DEFERRED_NF
},
88 switch (CONV_TYPE_FMT_ALT(fmt_flags
)) {
89 case CONV_FMT_ALT_DUMP
:
90 case CONV_FMT_ALT_CFNP
:
102 conv_iter_dyn_posflag1(Conv_fmt_flags_t fmt_flags
, conv_iter_cb_t func
,
105 return (conv_iter_vd(conv_dyn_posflag1_strings(fmt_flags
),
110 conv_dyn_flag_strings(Conv_fmt_flags_t fmt_flags
)
112 #define FLAGSZ CONV_EXPN_FIELD_DEF_PREFIX_SIZE + \
113 MSG_DF_ORIGIN_CF_SIZE + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
114 MSG_DF_SYMBOLIC_CF_SIZE + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
115 MSG_DF_TEXTREL_CF_SIZE + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
116 MSG_DF_BIND_NOW_CF_SIZE + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
117 MSG_DF_STATIC_TLS_CF_SIZE + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
118 CONV_INV_BUFSIZE + CONV_EXPN_FIELD_DEF_SUFFIX_SIZE
121 * Ensure that Conv_dyn_flag_buf_t is large enough:
123 * FLAGSZ is the real minimum size of the buffer required by
124 * conv_dyn_flag(). However, Conv_dyn_flag_buf_t uses
125 * CONV_DYN_FLAG_BUFSIZE to set the buffer size. We do things this
126 * way because the definition of FLAGSZ uses information that is not
127 * available in the environment of other programs that include the
128 * conv.h header file.
130 #if (CONV_DYN_FLAG_BUFSIZE != FLAGSZ) && !defined(__lint)
131 #define REPORT_BUFSIZE FLAGSZ
132 #include "report_bufsize.h"
133 #error "CONV_DYN_FLAG_BUFSIZE does not match FLAGSZ"
136 static const Val_desc vda_cf
[] = {
137 { DF_ORIGIN
, MSG_DF_ORIGIN_CF
},
138 { DF_SYMBOLIC
, MSG_DF_SYMBOLIC_CF
},
139 { DF_TEXTREL
, MSG_DF_TEXTREL_CF
},
140 { DF_BIND_NOW
, MSG_DF_BIND_NOW_CF
},
141 { DF_STATIC_TLS
, MSG_DF_STATIC_TLS_CF
},
144 static const Val_desc vda_cfnp
[] = {
145 { DF_ORIGIN
, MSG_DF_ORIGIN_CFNP
},
146 { DF_SYMBOLIC
, MSG_DF_SYMBOLIC_CFNP
},
147 { DF_TEXTREL
, MSG_DF_TEXTREL_CFNP
},
148 { DF_BIND_NOW
, MSG_DF_BIND_NOW_CFNP
},
149 { DF_STATIC_TLS
, MSG_DF_STATIC_TLS_CFNP
},
152 static const Val_desc vda_nf
[] = {
153 { DF_ORIGIN
, MSG_DF_ORIGIN_NF
},
154 { DF_SYMBOLIC
, MSG_DF_SYMBOLIC_NF
},
155 { DF_TEXTREL
, MSG_DF_TEXTREL_NF
},
156 { DF_BIND_NOW
, MSG_DF_BIND_NOW_NF
},
157 { DF_STATIC_TLS
, MSG_DF_STATIC_TLS_NF
},
161 switch (CONV_TYPE_FMT_ALT(fmt_flags
)) {
162 case CONV_FMT_ALT_CF
:
164 case CONV_FMT_ALT_NF
:
172 conv_iter_dyn_flag(Conv_fmt_flags_t fmt_flags
, conv_iter_cb_t func
,
175 return (conv_iter_vd(conv_dyn_flag_strings(fmt_flags
), func
, uvalue
));
179 conv_dyn_flag1_strings(Conv_fmt_flags_t fmt_flags
)
181 #define FLAG1SZ CONV_EXPN_FIELD_DEF_PREFIX_SIZE + \
182 MSG_DF_1_NOW_CF_SIZE + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
183 MSG_DF_1_GLOBAL_CF_SIZE + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
184 MSG_DF_1_GROUP_CF_SIZE + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
185 MSG_DF_1_NODELETE_CF_SIZE + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
186 MSG_DF_1_LOADFLTR_CF_SIZE + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
187 MSG_DF_1_INITFIRST_CF_SIZE + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
188 MSG_DF_1_NOOPEN_CF_SIZE + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
189 MSG_DF_1_ORIGIN_CF_SIZE + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
190 MSG_DF_1_DIRECT_CF_SIZE + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
191 MSG_DF_1_TRANS_CF_SIZE + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
192 MSG_DF_1_INTERPOSE_CF_SIZE + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
193 MSG_DF_1_NODEFLIB_CF_SIZE + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
194 MSG_DF_1_NODUMP_CF_SIZE + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
195 MSG_DF_1_CONFALT_CF_SIZE + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
196 MSG_DF_1_ENDFILTEE_CF_SIZE + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
197 MSG_DF_1_DISPRELPND_CF_SIZE + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
198 MSG_DF_1_DISPRELDNE_CF_SIZE + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
199 MSG_DF_1_NODIRECT_CF_SIZE + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
200 MSG_DF_1_IGNMULDEF_CF_SIZE + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
201 MSG_DF_1_NOKSYMS_CF_SIZE + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
202 MSG_DF_1_NOHDR_CF_SIZE + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
203 MSG_DF_1_NORELOC_CF_SIZE + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
204 MSG_DF_1_SYMINTPOSE_CF_SIZE + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
205 MSG_DF_1_GLOBAUDIT_CF_SIZE + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
206 MSG_DF_1_SINGLETON_CF_SIZE + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
207 CONV_INV_BUFSIZE + CONV_EXPN_FIELD_DEF_SUFFIX_SIZE
210 * Ensure that Conv_dyn_flag1_buf_t is large enough:
212 * FLAG1SZ is the real minimum size of the buffer required by
213 * conv_dyn_flag1(). However, Conv_dyn_flag1_buf_t uses
214 * CONV_DYN_FLAG1_BUFSIZE to set the buffer size. We do things this
215 * way because the definition of FLAG1SZ uses information that is not
216 * available in the environment of other programs that include the
217 * conv.h header file.
219 #if (CONV_DYN_FLAG1_BUFSIZE != FLAG1SZ) && !defined(__lint)
220 #define REPORT_BUFSIZE FLAG1SZ
221 #include "report_bufsize.h"
222 #error "CONV_DYN_FLAG1_BUFSIZE does not match FLAG1SZ"
225 static const Val_desc vda_def
[] = {
226 { DF_1_NOW
, MSG_DF_1_NOW_CFNP
},
227 { DF_1_GLOBAL
, MSG_DF_1_GLOBAL_CFNP
},
228 { DF_1_GROUP
, MSG_DF_1_GROUP_CFNP
},
229 { DF_1_NODELETE
, MSG_DF_1_NODELETE_CFNP
},
230 { DF_1_LOADFLTR
, MSG_DF_1_LOADFLTR_CFNP
},
231 { DF_1_INITFIRST
, MSG_DF_1_INITFIRST_CFNP
},
232 { DF_1_NOOPEN
, MSG_DF_1_NOOPEN_CFNP
},
233 { DF_1_ORIGIN
, MSG_DF_1_ORIGIN_CFNP
},
234 { DF_1_DIRECT
, MSG_DF_1_DIRECT_CFNP
},
235 { DF_1_TRANS
, MSG_DF_1_TRANS_CFNP
},
236 { DF_1_INTERPOSE
, MSG_DF_1_INTERPOSE_DEF
},
237 { DF_1_NODEFLIB
, MSG_DF_1_NODEFLIB_CFNP
},
238 { DF_1_NODUMP
, MSG_DF_1_NODUMP_CFNP
},
239 { DF_1_CONFALT
, MSG_DF_1_CONFALT_CFNP
},
240 { DF_1_ENDFILTEE
, MSG_DF_1_ENDFILTEE_CFNP
},
241 { DF_1_DISPRELDNE
, MSG_DF_1_DISPRELDNE_DEF
},
242 { DF_1_DISPRELPND
, MSG_DF_1_DISPRELPND_DEF
},
243 { DF_1_NODIRECT
, MSG_DF_1_NODIRECT_CFNP
},
244 { DF_1_IGNMULDEF
, MSG_DF_1_IGNMULDEF_DEF
},
245 { DF_1_NOKSYMS
, MSG_DF_1_NOKSYMS_CFNP
},
246 { DF_1_NOHDR
, MSG_DF_1_NOHDR_CFNP
},
247 { DF_1_EDITED
, MSG_DF_1_EDITED_CFNP
},
248 { DF_1_NORELOC
, MSG_DF_1_NORELOC_CFNP
},
249 { DF_1_SYMINTPOSE
, MSG_DF_1_SYMINTPOSE_DEF
},
250 { DF_1_GLOBAUDIT
, MSG_DF_1_GLOBAUDIT_DEF
},
251 { DF_1_SINGLETON
, MSG_DF_1_SINGLETON_DEF
},
254 static const Val_desc vda_cf
[] = {
255 { DF_1_NOW
, MSG_DF_1_NOW_CF
},
256 { DF_1_GLOBAL
, MSG_DF_1_GLOBAL_CF
},
257 { DF_1_GROUP
, MSG_DF_1_GROUP_CF
},
258 { DF_1_NODELETE
, MSG_DF_1_NODELETE_CF
},
259 { DF_1_LOADFLTR
, MSG_DF_1_LOADFLTR_CF
},
260 { DF_1_INITFIRST
, MSG_DF_1_INITFIRST_CF
},
261 { DF_1_NOOPEN
, MSG_DF_1_NOOPEN_CF
},
262 { DF_1_ORIGIN
, MSG_DF_1_ORIGIN_CF
},
263 { DF_1_DIRECT
, MSG_DF_1_DIRECT_CF
},
264 { DF_1_TRANS
, MSG_DF_1_TRANS_CF
},
265 { DF_1_INTERPOSE
, MSG_DF_1_INTERPOSE_CF
},
266 { DF_1_NODEFLIB
, MSG_DF_1_NODEFLIB_CF
},
267 { DF_1_NODUMP
, MSG_DF_1_NODUMP_CF
},
268 { DF_1_CONFALT
, MSG_DF_1_CONFALT_CF
},
269 { DF_1_ENDFILTEE
, MSG_DF_1_ENDFILTEE_CF
},
270 { DF_1_DISPRELDNE
, MSG_DF_1_DISPRELDNE_CF
},
271 { DF_1_DISPRELPND
, MSG_DF_1_DISPRELPND_CF
},
272 { DF_1_NODIRECT
, MSG_DF_1_NODIRECT_CF
},
273 { DF_1_IGNMULDEF
, MSG_DF_1_IGNMULDEF_CF
},
274 { DF_1_NOKSYMS
, MSG_DF_1_NOKSYMS_CF
},
275 { DF_1_NOHDR
, MSG_DF_1_NOHDR_CF
},
276 { DF_1_EDITED
, MSG_DF_1_EDITED_CF
},
277 { DF_1_NORELOC
, MSG_DF_1_NORELOC_CF
},
278 { DF_1_SYMINTPOSE
, MSG_DF_1_SYMINTPOSE_CF
},
279 { DF_1_GLOBAUDIT
, MSG_DF_1_GLOBAUDIT_CF
},
280 { DF_1_SINGLETON
, MSG_DF_1_SINGLETON_CF
},
283 static const Val_desc vda_cfnp
[] = {
284 { DF_1_NOW
, MSG_DF_1_NOW_CFNP
},
285 { DF_1_GLOBAL
, MSG_DF_1_GLOBAL_CFNP
},
286 { DF_1_GROUP
, MSG_DF_1_GROUP_CFNP
},
287 { DF_1_NODELETE
, MSG_DF_1_NODELETE_CFNP
},
288 { DF_1_LOADFLTR
, MSG_DF_1_LOADFLTR_CFNP
},
289 { DF_1_INITFIRST
, MSG_DF_1_INITFIRST_CFNP
},
290 { DF_1_NOOPEN
, MSG_DF_1_NOOPEN_CFNP
},
291 { DF_1_ORIGIN
, MSG_DF_1_ORIGIN_CFNP
},
292 { DF_1_DIRECT
, MSG_DF_1_DIRECT_CFNP
},
293 { DF_1_TRANS
, MSG_DF_1_TRANS_CFNP
},
294 { DF_1_INTERPOSE
, MSG_DF_1_INTERPOSE_CFNP
},
295 { DF_1_NODEFLIB
, MSG_DF_1_NODEFLIB_CFNP
},
296 { DF_1_NODUMP
, MSG_DF_1_NODUMP_CFNP
},
297 { DF_1_CONFALT
, MSG_DF_1_CONFALT_CFNP
},
298 { DF_1_ENDFILTEE
, MSG_DF_1_ENDFILTEE_CFNP
},
299 { DF_1_DISPRELDNE
, MSG_DF_1_DISPRELDNE_CFNP
},
300 { DF_1_DISPRELPND
, MSG_DF_1_DISPRELPND_CFNP
},
301 { DF_1_NODIRECT
, MSG_DF_1_NODIRECT_CFNP
},
302 { DF_1_IGNMULDEF
, MSG_DF_1_IGNMULDEF_CFNP
},
303 { DF_1_NOKSYMS
, MSG_DF_1_NOKSYMS_CFNP
},
304 { DF_1_NOHDR
, MSG_DF_1_NOHDR_CFNP
},
305 { DF_1_EDITED
, MSG_DF_1_EDITED_CFNP
},
306 { DF_1_NORELOC
, MSG_DF_1_NORELOC_CFNP
},
307 { DF_1_SYMINTPOSE
, MSG_DF_1_SYMINTPOSE_CFNP
},
308 { DF_1_GLOBAUDIT
, MSG_DF_1_GLOBAUDIT_CFNP
},
309 { DF_1_SINGLETON
, MSG_DF_1_SINGLETON_CFNP
},
312 static const Val_desc vda_nf
[] = {
313 { DF_1_NOW
, MSG_DF_1_NOW_NF
},
314 { DF_1_GLOBAL
, MSG_DF_1_GLOBAL_NF
},
315 { DF_1_GROUP
, MSG_DF_1_GROUP_NF
},
316 { DF_1_NODELETE
, MSG_DF_1_NODELETE_NF
},
317 { DF_1_LOADFLTR
, MSG_DF_1_LOADFLTR_NF
},
318 { DF_1_INITFIRST
, MSG_DF_1_INITFIRST_NF
},
319 { DF_1_NOOPEN
, MSG_DF_1_NOOPEN_NF
},
320 { DF_1_ORIGIN
, MSG_DF_1_ORIGIN_NF
},
321 { DF_1_DIRECT
, MSG_DF_1_DIRECT_NF
},
322 { DF_1_TRANS
, MSG_DF_1_TRANS_NF
},
323 { DF_1_INTERPOSE
, MSG_DF_1_INTERPOSE_NF
},
324 { DF_1_NODEFLIB
, MSG_DF_1_NODEFLIB_NF
},
325 { DF_1_NODUMP
, MSG_DF_1_NODUMP_NF
},
326 { DF_1_CONFALT
, MSG_DF_1_CONFALT_NF
},
327 { DF_1_ENDFILTEE
, MSG_DF_1_ENDFILTEE_NF
},
328 { DF_1_DISPRELDNE
, MSG_DF_1_DISPRELDNE_NF
},
329 { DF_1_DISPRELPND
, MSG_DF_1_DISPRELPND_NF
},
330 { DF_1_NODIRECT
, MSG_DF_1_NODIRECT_NF
},
331 { DF_1_IGNMULDEF
, MSG_DF_1_IGNMULDEF_NF
},
332 { DF_1_NOKSYMS
, MSG_DF_1_NOKSYMS_NF
},
333 { DF_1_NOHDR
, MSG_DF_1_NOHDR_NF
},
334 { DF_1_EDITED
, MSG_DF_1_EDITED_NF
},
335 { DF_1_NORELOC
, MSG_DF_1_NORELOC_NF
},
336 { DF_1_SYMINTPOSE
, MSG_DF_1_SYMINTPOSE_NF
},
337 { DF_1_GLOBAUDIT
, MSG_DF_1_GLOBAUDIT_NF
},
338 { DF_1_SINGLETON
, MSG_DF_1_SINGLETON_NF
},
342 switch (CONV_TYPE_FMT_ALT(fmt_flags
)) {
343 case CONV_FMT_ALT_CF
:
345 case CONV_FMT_ALT_CFNP
:
347 case CONV_FMT_ALT_NF
:
355 conv_iter_dyn_flag1(Conv_fmt_flags_t fmt_flags
, conv_iter_cb_t func
,
358 return (conv_iter_vd(conv_dyn_flag1_strings(fmt_flags
), func
, uvalue
));
362 conv_dyn_feature1_strings(Conv_fmt_flags_t fmt_flags
)
364 #define FEATSZ CONV_EXPN_FIELD_DEF_PREFIX_SIZE + \
365 MSG_DTF_1_PARINIT_CF_SIZE + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
366 MSG_DTF_1_CONFEXP_CF_SIZE + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
367 CONV_INV_BUFSIZE + CONV_EXPN_FIELD_DEF_SUFFIX_SIZE
370 * Ensure that Conv_dyn_feature1_buf_t is large enough:
372 * FEATSZ is the real min size of the buffer required by
373 * conv_dyn_feature1(). However, Conv_dyn_feature1_buf_t uses
374 * CONV_DYN_FEATURE1_BUFSIZE to set the buffer size. We do things
375 * this way because the definition of FEATSZ uses information that
376 * is not available in the environment of other programs that include
377 * the conv.h header file.
379 #if (CONV_DYN_FEATURE1_BUFSIZE != FEATSZ) && !defined(__lint)
380 #define REPORT_BUFSIZE FEATSZ
381 #include "report_bufsize.h"
382 #error "CONV_DYN_FEATURE1_BUFSIZE does not match FEATSZ"
385 static const Val_desc vda_cf
[] = {
386 { DTF_1_PARINIT
, MSG_DTF_1_PARINIT_CF
},
387 { DTF_1_CONFEXP
, MSG_DTF_1_CONFEXP_CF
},
390 static const Val_desc vda_cfnp
[] = {
391 { DTF_1_PARINIT
, MSG_DTF_1_PARINIT_CFNP
},
392 { DTF_1_CONFEXP
, MSG_DTF_1_CONFEXP_CFNP
},
395 static const Val_desc vda_nf
[] = {
396 { DTF_1_PARINIT
, MSG_DTF_1_PARINIT_NF
},
397 { DTF_1_CONFEXP
, MSG_DTF_1_CONFEXP_NF
},
401 switch (CONV_TYPE_FMT_ALT(fmt_flags
)) {
402 case CONV_FMT_ALT_CF
:
404 case CONV_FMT_ALT_NF
:
412 conv_iter_dyn_feature1(Conv_fmt_flags_t fmt_flags
, conv_iter_cb_t func
,
415 return (conv_iter_vd(conv_dyn_feature1_strings(fmt_flags
),
420 conv_dyn_tag_strings(conv_iter_osabi_t osabi
, Half mach
,
421 Conv_fmt_flags_t fmt_flags
)
424 * Maximum # of items that can be in the returned array. Size this
425 * by counting the maximum depth in the switch statement that fills
426 * retarr at the end of this function.
431 * Generic dynamic tags:
432 * - Note hole between DT_FLAGS and DT_PREINIT_ARRAY (tag 32).
433 * We use a 0, which is the signal for "not defined".
434 * - This range has alternative names for dump, requiring an
437 static const Msg tags_null_cf
[] = {
438 MSG_DT_NULL_CF
, MSG_DT_NEEDED_CF
,
439 MSG_DT_PLTRELSZ_CF
, MSG_DT_PLTGOT_CF
,
440 MSG_DT_HASH_CF
, MSG_DT_STRTAB_CF
,
441 MSG_DT_SYMTAB_CF
, MSG_DT_RELA_CF
,
442 MSG_DT_RELASZ_CF
, MSG_DT_RELAENT_CF
,
443 MSG_DT_STRSZ_CF
, MSG_DT_SYMENT_CF
,
444 MSG_DT_INIT_CF
, MSG_DT_FINI_CF
,
445 MSG_DT_SONAME_CF
, MSG_DT_RPATH_CF
,
446 MSG_DT_SYMBOLIC_CF
, MSG_DT_REL_CF
,
447 MSG_DT_RELSZ_CF
, MSG_DT_RELENT_CF
,
448 MSG_DT_PLTREL_CF
, MSG_DT_DEBUG_CF
,
449 MSG_DT_TEXTREL_CF
, MSG_DT_JMPREL_CF
,
450 MSG_DT_BIND_NOW_CF
, MSG_DT_INIT_ARRAY_CF
,
451 MSG_DT_FINI_ARRAY_CF
, MSG_DT_INIT_ARRAYSZ_CF
,
452 MSG_DT_FINI_ARRAYSZ_CF
, MSG_DT_RUNPATH_CF
,
454 MSG_DT_PREINIT_ARRAY_CF
, MSG_DT_PREINIT_ARRAYSZ_CF
456 static const Msg tags_null_cfnp
[] = {
457 MSG_DT_NULL_CFNP
, MSG_DT_NEEDED_CFNP
,
458 MSG_DT_PLTRELSZ_CFNP
, MSG_DT_PLTGOT_CFNP
,
459 MSG_DT_HASH_CFNP
, MSG_DT_STRTAB_CFNP
,
460 MSG_DT_SYMTAB_CFNP
, MSG_DT_RELA_CFNP
,
461 MSG_DT_RELASZ_CFNP
, MSG_DT_RELAENT_CFNP
,
462 MSG_DT_STRSZ_CFNP
, MSG_DT_SYMENT_CFNP
,
463 MSG_DT_INIT_CFNP
, MSG_DT_FINI_CFNP
,
464 MSG_DT_SONAME_CFNP
, MSG_DT_RPATH_CFNP
,
465 MSG_DT_SYMBOLIC_CFNP
, MSG_DT_REL_CFNP
,
466 MSG_DT_RELSZ_CFNP
, MSG_DT_RELENT_CFNP
,
467 MSG_DT_PLTREL_CFNP
, MSG_DT_DEBUG_CFNP
,
468 MSG_DT_TEXTREL_CFNP
, MSG_DT_JMPREL_CFNP
,
469 MSG_DT_BIND_NOW_CFNP
, MSG_DT_INIT_ARRAY_CFNP
,
470 MSG_DT_FINI_ARRAY_CFNP
, MSG_DT_INIT_ARRAYSZ_CFNP
,
471 MSG_DT_FINI_ARRAYSZ_CFNP
, MSG_DT_RUNPATH_CFNP
,
472 MSG_DT_FLAGS_CFNP
, 0,
473 MSG_DT_PREINIT_ARRAY_CFNP
, MSG_DT_PREINIT_ARRAYSZ_CFNP
475 static const Msg tags_null_nf
[] = {
476 MSG_DT_NULL_NF
, MSG_DT_NEEDED_NF
,
477 MSG_DT_PLTRELSZ_NF
, MSG_DT_PLTGOT_NF
,
478 MSG_DT_HASH_NF
, MSG_DT_STRTAB_NF
,
479 MSG_DT_SYMTAB_NF
, MSG_DT_RELA_NF
,
480 MSG_DT_RELASZ_NF
, MSG_DT_RELAENT_NF
,
481 MSG_DT_STRSZ_NF
, MSG_DT_SYMENT_NF
,
482 MSG_DT_INIT_NF
, MSG_DT_FINI_NF
,
483 MSG_DT_SONAME_NF
, MSG_DT_RPATH_NF
,
484 MSG_DT_SYMBOLIC_NF
, MSG_DT_REL_NF
,
485 MSG_DT_RELSZ_NF
, MSG_DT_RELENT_NF
,
486 MSG_DT_PLTREL_NF
, MSG_DT_DEBUG_NF
,
487 MSG_DT_TEXTREL_NF
, MSG_DT_JMPREL_NF
,
488 MSG_DT_BIND_NOW_NF
, MSG_DT_INIT_ARRAY_NF
,
489 MSG_DT_FINI_ARRAY_NF
, MSG_DT_INIT_ARRAYSZ_NF
,
490 MSG_DT_FINI_ARRAYSZ_NF
, MSG_DT_RUNPATH_NF
,
492 MSG_DT_PREINIT_ARRAY_NF
, MSG_DT_PREINIT_ARRAYSZ_NF
494 static const Msg tags_null_dmp
[] = {
495 MSG_DT_NULL_CFNP
, MSG_DT_NEEDED_CFNP
,
496 MSG_DT_PLTRELSZ_DMP
, MSG_DT_PLTGOT_CFNP
,
497 MSG_DT_HASH_CFNP
, MSG_DT_STRTAB_CFNP
,
498 MSG_DT_SYMTAB_CFNP
, MSG_DT_RELA_CFNP
,
499 MSG_DT_RELASZ_CFNP
, MSG_DT_RELAENT_CFNP
,
500 MSG_DT_STRSZ_CFNP
, MSG_DT_SYMENT_CFNP
,
501 MSG_DT_INIT_CFNP
, MSG_DT_FINI_CFNP
,
502 MSG_DT_SONAME_CFNP
, MSG_DT_RPATH_CFNP
,
503 MSG_DT_SYMBOLIC_DMP
, MSG_DT_REL_CFNP
,
504 MSG_DT_RELSZ_CFNP
, MSG_DT_RELENT_CFNP
,
505 MSG_DT_PLTREL_CFNP
, MSG_DT_DEBUG_CFNP
,
506 MSG_DT_TEXTREL_CFNP
, MSG_DT_JMPREL_CFNP
,
507 MSG_DT_BIND_NOW_CFNP
, MSG_DT_INIT_ARRAY_CFNP
,
508 MSG_DT_FINI_ARRAY_CFNP
, MSG_DT_INIT_ARRAYSZ_CFNP
,
509 MSG_DT_FINI_ARRAYSZ_CFNP
, MSG_DT_RUNPATH_CFNP
,
510 MSG_DT_FLAGS_CFNP
, 0,
511 MSG_DT_PREINIT_ARRAY_CFNP
, MSG_DT_PREINIT_ARRAYSZ_CFNP
513 static const conv_ds_msg_t ds_null_cf
= {
514 CONV_DS_MSG_INIT(DT_NULL
, tags_null_cf
) };
515 static const conv_ds_msg_t ds_null_cfnp
= {
516 CONV_DS_MSG_INIT(DT_NULL
, tags_null_cfnp
) };
517 static const conv_ds_msg_t ds_null_nf
= {
518 CONV_DS_MSG_INIT(DT_NULL
, tags_null_nf
) };
519 static const conv_ds_msg_t ds_null_dmp
= {
520 CONV_DS_MSG_INIT(DT_NULL
, tags_null_dmp
) };
523 * DT_SPARC_REGISTER was originally assigned 0x7000001. It is processor
524 * specific, and should have been in the range DT_LOPROC-DT_HIPROC
525 * instead of here. When the error was fixed,
526 * DT_DEPRECATED_SPARC_REGISTER was created to maintain backward
529 static const Msg tags_sdreg_cf
[] = {
530 MSG_DT_DEP_SPARC_REG_CF
};
531 static const Msg tags_sdreg_cfnp
[] = {
532 MSG_DT_DEP_SPARC_REG_CFNP
};
533 static const Msg tags_sdreg_nf
[] = {
534 MSG_DT_DEP_SPARC_REG_NF
};
536 static const conv_ds_msg_t ds_sdreg_cf
= {
537 CONV_DS_MSG_INIT(DT_DEPRECATED_SPARC_REGISTER
, tags_sdreg_cf
) };
538 static const conv_ds_msg_t ds_sdreg_cfnp
= {
539 CONV_DS_MSG_INIT(DT_DEPRECATED_SPARC_REGISTER
, tags_sdreg_cfnp
) };
540 static const conv_ds_msg_t ds_sdreg_nf
= {
541 CONV_DS_MSG_INIT(DT_DEPRECATED_SPARC_REGISTER
, tags_sdreg_nf
) };
545 * SUNW: DT_LOOS -> DT_HIOS range. Note holes between DT_SUNW_TLSSORTSZ,
546 * DT_SUNW_STRPAD, and DT_SUNW_LDMACH. We handle the outliers
547 * separately below as single values.
549 static const Msg tags_sunw_auxiliary_cf
[] = {
550 MSG_DT_SUNW_AUXILIARY_CF
, MSG_DT_SUNW_RTLDINF_CF
,
551 MSG_DT_SUNW_FILTER_CF
, MSG_DT_SUNW_CAP_CF
,
552 MSG_DT_SUNW_SYMTAB_CF
, MSG_DT_SUNW_SYMSZ_CF
,
553 MSG_DT_SUNW_SORTENT_CF
, MSG_DT_SUNW_SYMSORT_CF
,
554 MSG_DT_SUNW_SYMSORTSZ_CF
, MSG_DT_SUNW_TLSSORT_CF
,
555 MSG_DT_SUNW_TLSSORTSZ_CF
, MSG_DT_SUNW_CAPINFO_CF
,
556 MSG_DT_SUNW_STRPAD_CF
, MSG_DT_SUNW_CAPCHAIN_CF
,
557 MSG_DT_SUNW_LDMACH_CF
, 0,
558 MSG_DT_SUNW_CAPCHAINENT_CF
, 0,
559 MSG_DT_SUNW_CAPCHAINSZ_CF
, 0,
563 static const Msg tags_sunw_auxiliary_cfnp
[] = {
564 MSG_DT_SUNW_AUXILIARY_CFNP
, MSG_DT_SUNW_RTLDINF_CFNP
,
565 MSG_DT_SUNW_FILTER_CFNP
, MSG_DT_SUNW_CAP_CFNP
,
566 MSG_DT_SUNW_SYMTAB_CFNP
, MSG_DT_SUNW_SYMSZ_CFNP
,
567 MSG_DT_SUNW_SORTENT_CFNP
, MSG_DT_SUNW_SYMSORT_CFNP
,
568 MSG_DT_SUNW_SYMSORTSZ_CFNP
, MSG_DT_SUNW_TLSSORT_CFNP
,
569 MSG_DT_SUNW_TLSSORTSZ_CFNP
, MSG_DT_SUNW_CAPINFO_CFNP
,
570 MSG_DT_SUNW_STRPAD_CFNP
, MSG_DT_SUNW_CAPCHAIN_CFNP
,
571 MSG_DT_SUNW_LDMACH_CFNP
, 0,
572 MSG_DT_SUNW_CAPCHAINENT_CFNP
, 0,
573 MSG_DT_SUNW_CAPCHAINSZ_CFNP
, 0,
575 MSG_DT_SUNW_ASLR_CFNP
577 static const Msg tags_sunw_auxiliary_nf
[] = {
578 MSG_DT_SUNW_AUXILIARY_NF
, MSG_DT_SUNW_RTLDINF_NF
,
579 MSG_DT_SUNW_FILTER_NF
, MSG_DT_SUNW_CAP_NF
,
580 MSG_DT_SUNW_SYMTAB_NF
, MSG_DT_SUNW_SYMSZ_NF
,
581 MSG_DT_SUNW_SORTENT_NF
, MSG_DT_SUNW_SYMSORT_NF
,
582 MSG_DT_SUNW_SYMSORTSZ_NF
, MSG_DT_SUNW_TLSSORT_NF
,
583 MSG_DT_SUNW_TLSSORTSZ_NF
, MSG_DT_SUNW_CAPINFO_NF
,
584 MSG_DT_SUNW_STRPAD_NF
, MSG_DT_SUNW_CAPCHAIN_NF
,
585 MSG_DT_SUNW_LDMACH_NF
, 0,
586 MSG_DT_SUNW_CAPCHAINENT_NF
, 0,
587 MSG_DT_SUNW_CAPCHAINSZ_NF
, 0,
591 static const conv_ds_msg_t ds_sunw_auxiliary_cf
= {
592 CONV_DS_MSG_INIT(DT_SUNW_AUXILIARY
, tags_sunw_auxiliary_cf
) };
593 static const conv_ds_msg_t ds_sunw_auxiliary_cfnp
= {
594 CONV_DS_MSG_INIT(DT_SUNW_AUXILIARY
, tags_sunw_auxiliary_cfnp
) };
595 static const conv_ds_msg_t ds_sunw_auxiliary_nf
= {
596 CONV_DS_MSG_INIT(DT_SUNW_AUXILIARY
, tags_sunw_auxiliary_nf
) };
599 * GNU: (In DT_VALRNGLO section) DT_GNU_PRELINKED - DT_GNU_LIBLISTSZ
601 static const Msg tags_gnu_prelinked_cf
[] = {
602 MSG_DT_GNU_PRELINKED_CF
, MSG_DT_GNU_CONFLICTSZ_CF
,
603 MSG_DT_GNU_LIBLISTSZ_CF
605 static const Msg tags_gnu_prelinked_cfnp
[] = {
606 MSG_DT_GNU_PRELINKED_CFNP
, MSG_DT_GNU_CONFLICTSZ_CFNP
,
607 MSG_DT_GNU_LIBLISTSZ_CFNP
609 static const Msg tags_gnu_prelinked_nf
[] = {
610 MSG_DT_GNU_PRELINKED_NF
, MSG_DT_GNU_CONFLICTSZ_NF
,
611 MSG_DT_GNU_LIBLISTSZ_NF
613 static const conv_ds_msg_t ds_gnu_prelinked_cf
= {
614 CONV_DS_MSG_INIT(DT_GNU_PRELINKED
, tags_gnu_prelinked_cf
) };
615 static const conv_ds_msg_t ds_gnu_prelinked_cfnp
= {
616 CONV_DS_MSG_INIT(DT_GNU_PRELINKED
, tags_gnu_prelinked_cfnp
) };
617 static const conv_ds_msg_t ds_gnu_prelinked_nf
= {
618 CONV_DS_MSG_INIT(DT_GNU_PRELINKED
, tags_gnu_prelinked_nf
) };
621 * SUNW: DT_VALRNGLO - DT_VALRNGHI range.
623 static const Msg tags_checksum_cf
[] = {
624 MSG_DT_CHECKSUM_CF
, MSG_DT_PLTPADSZ_CF
,
625 MSG_DT_MOVEENT_CF
, MSG_DT_MOVESZ_CF
,
626 MSG_DT_FEATURE_1_CF
, MSG_DT_POSFLAG_1_CF
,
627 MSG_DT_SYMINSZ_CF
, MSG_DT_SYMINENT_CF
629 static const Msg tags_checksum_cfnp
[] = {
630 MSG_DT_CHECKSUM_CFNP
, MSG_DT_PLTPADSZ_CFNP
,
631 MSG_DT_MOVEENT_CFNP
, MSG_DT_MOVESZ_CFNP
,
632 MSG_DT_FEATURE_1_CFNP
, MSG_DT_POSFLAG_1_CFNP
,
633 MSG_DT_SYMINSZ_CFNP
, MSG_DT_SYMINENT_CFNP
635 static const Msg tags_checksum_nf
[] = {
636 MSG_DT_CHECKSUM_NF
, MSG_DT_PLTPADSZ_NF
,
637 MSG_DT_MOVEENT_NF
, MSG_DT_MOVESZ_NF
,
638 MSG_DT_FEATURE_1_NF
, MSG_DT_POSFLAG_1_NF
,
639 MSG_DT_SYMINSZ_NF
, MSG_DT_SYMINENT_NF
641 static const conv_ds_msg_t ds_checksum_cf
= {
642 CONV_DS_MSG_INIT(DT_CHECKSUM
, tags_checksum_cf
) };
643 static const conv_ds_msg_t ds_checksum_cfnp
= {
644 CONV_DS_MSG_INIT(DT_CHECKSUM
, tags_checksum_cfnp
) };
645 static const conv_ds_msg_t ds_checksum_nf
= {
646 CONV_DS_MSG_INIT(DT_CHECKSUM
, tags_checksum_nf
) };
649 * GNU: (In DT_ADDRRNGLO section) DT_GNU_HASH - DT_GNU_LIBLIST
651 static const Msg tags_gnu_hash_cf
[] = {
652 MSG_DT_GNU_HASH_CF
, MSG_DT_TLSDESC_PLT_CF
,
653 MSG_DT_TLSDESC_GOT_CF
, MSG_DT_GNU_CONFLICT_CF
,
654 MSG_DT_GNU_LIBLIST_CF
656 static const Msg tags_gnu_hash_cfnp
[] = {
657 MSG_DT_GNU_HASH_CFNP
, MSG_DT_TLSDESC_PLT_CFNP
,
658 MSG_DT_TLSDESC_GOT_CFNP
, MSG_DT_GNU_CONFLICT_CFNP
,
659 MSG_DT_GNU_LIBLIST_CFNP
661 static const Msg tags_gnu_hash_nf
[] = {
662 MSG_DT_GNU_HASH_NF
, MSG_DT_TLSDESC_PLT_NF
,
663 MSG_DT_TLSDESC_GOT_NF
, MSG_DT_GNU_CONFLICT_NF
,
664 MSG_DT_GNU_LIBLIST_NF
666 static const conv_ds_msg_t ds_gnu_hash_cf
= {
667 CONV_DS_MSG_INIT(DT_GNU_HASH
, tags_gnu_hash_cf
) };
668 static const conv_ds_msg_t ds_gnu_hash_cfnp
= {
669 CONV_DS_MSG_INIT(DT_GNU_HASH
, tags_gnu_hash_cfnp
) };
670 static const conv_ds_msg_t ds_gnu_hash_nf
= {
671 CONV_DS_MSG_INIT(DT_GNU_HASH
, tags_gnu_hash_nf
) };
674 * SUNW: DT_ADDRRNGLO - DT_ADDRRNGHI range.
676 static const Msg tags_config_cf
[] = {
677 MSG_DT_CONFIG_CF
, MSG_DT_DEPAUDIT_CF
,
678 MSG_DT_AUDIT_CF
, MSG_DT_PLTPAD_CF
,
679 MSG_DT_MOVETAB_CF
, MSG_DT_SYMINFO_CF
681 static const Msg tags_config_cfnp
[] = {
682 MSG_DT_CONFIG_CFNP
, MSG_DT_DEPAUDIT_CFNP
,
683 MSG_DT_AUDIT_CFNP
, MSG_DT_PLTPAD_CFNP
,
684 MSG_DT_MOVETAB_CFNP
, MSG_DT_SYMINFO_CFNP
686 static const Msg tags_config_nf
[] = {
687 MSG_DT_CONFIG_NF
, MSG_DT_DEPAUDIT_NF
,
688 MSG_DT_AUDIT_NF
, MSG_DT_PLTPAD_NF
,
689 MSG_DT_MOVETAB_NF
, MSG_DT_SYMINFO_NF
691 static const conv_ds_msg_t ds_config_cf
= {
692 CONV_DS_MSG_INIT(DT_CONFIG
, tags_config_cf
) };
693 static const conv_ds_msg_t ds_config_cfnp
= {
694 CONV_DS_MSG_INIT(DT_CONFIG
, tags_config_cfnp
) };
695 static const conv_ds_msg_t ds_config_nf
= {
696 CONV_DS_MSG_INIT(DT_CONFIG
, tags_config_nf
) };
699 * SUNW: generic range. Note hole between DT_VERSYM and DT_RELACOUNT.
701 static const Msg tags_versym_cf
[] = { MSG_DT_VERSYM_CF
};
702 static const Msg tags_versym_cfnp
[] = { MSG_DT_VERSYM_CFNP
};
703 static const Msg tags_versym_nf
[] = { MSG_DT_VERSYM_NF
};
704 static const conv_ds_msg_t ds_versym_cf
= {
705 CONV_DS_MSG_INIT(DT_VERSYM
, tags_versym_cf
) };
706 static const conv_ds_msg_t ds_versym_cfnp
= {
707 CONV_DS_MSG_INIT(DT_VERSYM
, tags_versym_cfnp
) };
708 static const conv_ds_msg_t ds_versym_nf
= {
709 CONV_DS_MSG_INIT(DT_VERSYM
, tags_versym_nf
) };
711 static const Msg tags_relacount_cf
[] = {
712 MSG_DT_RELACOUNT_CF
, MSG_DT_RELCOUNT_CF
,
713 MSG_DT_FLAGS_1_CF
, MSG_DT_VERDEF_CF
,
714 MSG_DT_VERDEFNUM_CF
, MSG_DT_VERNEED_CF
,
717 static const Msg tags_relacount_cfnp
[] = {
718 MSG_DT_RELACOUNT_CFNP
, MSG_DT_RELCOUNT_CFNP
,
719 MSG_DT_FLAGS_1_CFNP
, MSG_DT_VERDEF_CFNP
,
720 MSG_DT_VERDEFNUM_CFNP
, MSG_DT_VERNEED_CFNP
,
721 MSG_DT_VERNEEDNUM_CFNP
723 static const Msg tags_relacount_nf
[] = {
724 MSG_DT_RELACOUNT_NF
, MSG_DT_RELCOUNT_NF
,
725 MSG_DT_FLAGS_1_NF
, MSG_DT_VERDEF_NF
,
726 MSG_DT_VERDEFNUM_NF
, MSG_DT_VERNEED_NF
,
729 static const conv_ds_msg_t ds_relacount_cf
= {
730 CONV_DS_MSG_INIT(DT_RELACOUNT
, tags_relacount_cf
) };
731 static const conv_ds_msg_t ds_relacount_cfnp
= {
732 CONV_DS_MSG_INIT(DT_RELACOUNT
, tags_relacount_cfnp
) };
733 static const conv_ds_msg_t ds_relacount_nf
= {
734 CONV_DS_MSG_INIT(DT_RELACOUNT
, tags_relacount_nf
) };
737 * DT_LOPROC - DT_HIPROC range: solaris/sparc-only
739 static const Msg tags_sparc_reg_cf
[] = { MSG_DT_SPARC_REGISTER_CF
};
740 static const Msg tags_sparc_reg_cfnp
[] = { MSG_DT_SPARC_REGISTER_CFNP
};
741 static const Msg tags_sparc_reg_nf
[] = { MSG_DT_SPARC_REGISTER_NF
};
742 static const Msg tags_sparc_reg_dmp
[] = { MSG_DT_SPARC_REGISTER_DMP
};
743 static const conv_ds_msg_t ds_sparc_reg_cf
= {
744 CONV_DS_MSG_INIT(DT_SPARC_REGISTER
, tags_sparc_reg_cf
) };
745 static const conv_ds_msg_t ds_sparc_reg_cfnp
= {
746 CONV_DS_MSG_INIT(DT_SPARC_REGISTER
, tags_sparc_reg_cfnp
) };
747 static const conv_ds_msg_t ds_sparc_reg_nf
= {
748 CONV_DS_MSG_INIT(DT_SPARC_REGISTER
, tags_sparc_reg_nf
) };
749 static const conv_ds_msg_t ds_sparc_reg_dmp
= {
750 CONV_DS_MSG_INIT(DT_SPARC_REGISTER
, tags_sparc_reg_dmp
) };
753 * DT_LOPROC - DT_HIPROC range: Solaris osabi, all hardware
755 static const Msg tags_auxiliary_cf
[] = {
756 MSG_DT_AUXILIARY_CF
, MSG_DT_USED_CF
,
759 static const Msg tags_auxiliary_cfnp
[] = {
760 MSG_DT_AUXILIARY_CFNP
, MSG_DT_USED_CFNP
,
763 static const Msg tags_auxiliary_nf
[] = {
764 MSG_DT_AUXILIARY_NF
, MSG_DT_USED_NF
,
767 static const conv_ds_msg_t ds_auxiliary_cf
= {
768 CONV_DS_MSG_INIT(DT_AUXILIARY
, tags_auxiliary_cf
) };
769 static const conv_ds_msg_t ds_auxiliary_cfnp
= {
770 CONV_DS_MSG_INIT(DT_AUXILIARY
, tags_auxiliary_cfnp
) };
771 static const conv_ds_msg_t ds_auxiliary_nf
= {
772 CONV_DS_MSG_INIT(DT_AUXILIARY
, tags_auxiliary_nf
) };
775 static const conv_ds_t
*retarr
[MAX_RET
];
778 int fmt_osabi
= CONV_TYPE_FMT_ALT(fmt_flags
);
779 int mach_sparc
, osabi_solaris
, osabi_linux
;
783 osabi_solaris
= (osabi
== ELFOSABI_NONE
) ||
784 (osabi
== ELFOSABI_SOLARIS
) || (osabi
== CONV_OSABI_ALL
);
785 osabi_linux
= (osabi
== ELFOSABI_LINUX
) || (osabi
== CONV_OSABI_ALL
);
786 mach_sparc
= (mach
== EM_SPARC
) || (mach
== EM_SPARCV9
) ||
787 (mach
== EM_SPARC32PLUS
) || (mach
== CONV_MACH_ALL
);
790 * Fill in retarr with the descriptors for the messages that
791 * apply to the current osabi. Note that we order these items such
792 * that the more common are placed at the beginning, and the less
793 * likely at the end. This should speed the common case.
795 * Note that the CFNP and DMP styles are very similar, so they
796 * are combined in 'default', and fmt_osabi is consulted when there
800 case CONV_FMT_ALT_CF
:
801 retarr
[ndx
++] = CONV_DS_ADDR(ds_null_cf
);
803 retarr
[ndx
++] = CONV_DS_ADDR(ds_sunw_auxiliary_cf
);
804 retarr
[ndx
++] = CONV_DS_ADDR(ds_checksum_cf
);
805 retarr
[ndx
++] = CONV_DS_ADDR(ds_config_cf
);
806 retarr
[ndx
++] = CONV_DS_ADDR(ds_versym_cf
);
807 retarr
[ndx
++] = CONV_DS_ADDR(ds_relacount_cf
);
809 retarr
[ndx
++] = CONV_DS_ADDR(ds_auxiliary_cf
);
811 retarr
[ndx
++] = CONV_DS_ADDR(ds_sparc_reg_cf
);
812 retarr
[ndx
++] = CONV_DS_ADDR(ds_sdreg_cf
);
816 retarr
[ndx
++] = CONV_DS_ADDR(ds_gnu_prelinked_cf
);
817 retarr
[ndx
++] = CONV_DS_ADDR(ds_gnu_hash_cf
);
821 case CONV_FMT_ALT_NF
:
822 retarr
[ndx
++] = CONV_DS_ADDR(ds_null_nf
);
824 retarr
[ndx
++] = CONV_DS_ADDR(ds_sunw_auxiliary_nf
);
825 retarr
[ndx
++] = CONV_DS_ADDR(ds_checksum_nf
);
826 retarr
[ndx
++] = CONV_DS_ADDR(ds_config_nf
);
827 retarr
[ndx
++] = CONV_DS_ADDR(ds_versym_nf
);
828 retarr
[ndx
++] = CONV_DS_ADDR(ds_relacount_nf
);
830 retarr
[ndx
++] = CONV_DS_ADDR(ds_auxiliary_nf
);
832 retarr
[ndx
++] = CONV_DS_ADDR(ds_sparc_reg_nf
);
833 retarr
[ndx
++] = CONV_DS_ADDR(ds_sdreg_nf
);
837 retarr
[ndx
++] = CONV_DS_ADDR(ds_gnu_prelinked_nf
);
838 retarr
[ndx
++] = CONV_DS_ADDR(ds_gnu_hash_nf
);
843 * The default style for the generic range is CFNP,
844 * while dump has a couple of different strings.
847 retarr
[ndx
++] = (fmt_osabi
== CONV_FMT_ALT_DUMP
) ?
848 CONV_DS_ADDR(ds_null_dmp
) : CONV_DS_ADDR(ds_null_cfnp
);
850 retarr
[ndx
++] = CONV_DS_ADDR(ds_sunw_auxiliary_cfnp
);
851 retarr
[ndx
++] = CONV_DS_ADDR(ds_checksum_cfnp
);
852 retarr
[ndx
++] = CONV_DS_ADDR(ds_config_cfnp
);
853 retarr
[ndx
++] = CONV_DS_ADDR(ds_versym_cfnp
);
854 retarr
[ndx
++] = CONV_DS_ADDR(ds_relacount_cfnp
);
856 retarr
[ndx
++] = CONV_DS_ADDR(ds_auxiliary_cfnp
);
859 * The default style for DT_SPARC_REGISTER
860 * is the dump style, which omits the 'SPARC_'.
861 * CFNP keeps the prefix.
864 (fmt_osabi
== CONV_FMT_ALT_CFNP
) ?
865 CONV_DS_ADDR(ds_sparc_reg_cfnp
) :
866 CONV_DS_ADDR(ds_sparc_reg_dmp
);
867 retarr
[ndx
++] = CONV_DS_ADDR(ds_sdreg_cfnp
);
871 retarr
[ndx
++] = CONV_DS_ADDR(ds_gnu_prelinked_cfnp
);
872 retarr
[ndx
++] = CONV_DS_ADDR(ds_gnu_hash_cfnp
);
877 retarr
[ndx
++] = NULL
;
878 assert(ndx
<= MAX_RET
);
883 conv_iter_dyn_tag(conv_iter_osabi_t osabi
, Half mach
,
884 Conv_fmt_flags_t fmt_flags
, conv_iter_cb_t func
, void *uvalue
)
886 return (conv_iter_ds(osabi
, mach
,
887 conv_dyn_tag_strings(osabi
, mach
, fmt_flags
), func
, uvalue
));
891 #define BINDTSZ CONV_EXPN_FIELD_DEF_PREFIX_SIZE + \
892 MSG_BND_NEEDED_SIZE + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
893 MSG_BND_REFER_SIZE + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
894 MSG_BND_FILTER_SIZE + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
895 CONV_INV_BUFSIZE + CONV_EXPN_FIELD_DEF_SUFFIX_SIZE
898 * Ensure that Conv_bnd_type_buf_t is large enough:
900 * BINDTSZ is the real minimum size of the buffer required by conv_bnd_type().
901 * However, Conv_bnd_type_buf_t uses CONV_BND_TYPE_BUFSIZE to set the
902 * buffer size. We do things this way because the definition of BINDTSZ uses
903 * information that is not available in the environment of other programs
904 * that include the conv.h header file.
906 #if (CONV_BND_TYPE_BUFSIZE != BINDTSZ) && !defined(__lint)
907 #define REPORT_BUFSIZE BINDTSZ
908 #include "report_bufsize.h"
909 #error "CONV_BND_TYPE_BUFSIZE does not match BINDTSZ"
913 conv_bnd_type(uint_t flags
, Conv_bnd_type_buf_t
*bnd_type_buf
)
915 static const Val_desc vda
[] = {
916 { BND_NEEDED
, MSG_BND_NEEDED
},
917 { BND_REFER
, MSG_BND_REFER
},
918 { BND_FILTER
, MSG_BND_FILTER
},
921 static CONV_EXPN_FIELD_ARG conv_arg
= {
922 NULL
, sizeof (bnd_type_buf
->buf
) };
925 return (MSG_ORIG(MSG_STR_EMPTY
));
927 conv_arg
.buf
= bnd_type_buf
->buf
;
928 conv_arg
.oflags
= conv_arg
.rflags
= flags
;
929 (void) conv_expn_field(&conv_arg
, vda
, 0);
931 return ((const char *)bnd_type_buf
->buf
);
935 * Note, conv_bnd_obj() is called with either:
936 * LML_FLG_OBJADDED (possibly with LML_FLG_OBJREEVAL added), or
937 * LML_FLG_OBJDELETED, or
940 #define BINDOSZ CONV_EXPN_FIELD_DEF_PREFIX_SIZE + \
941 MSG_BND_ADDED_SIZE + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
942 MSG_BND_REEVAL_SIZE + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
943 CONV_INV_BUFSIZE + CONV_EXPN_FIELD_DEF_SUFFIX_SIZE
946 * Ensure that Conv_bnd_obj_buf_t is large enough:
948 * BINDOSZ is the real minimum size of the buffer required by conv_bnd_obj().
949 * However, Conv_bnd_obj_buf_t uses CONV_BND_OBJ_BUFSIZE to set the
950 * buffer size. We do things this way because the definition of BINDOSZ uses
951 * information that is not available in the environment of other programs
952 * that include the conv.h header file.
954 #if (CONV_BND_OBJ_BUFSIZE != BINDOSZ) && !defined(__lint)
955 #define REPORT_BUFSIZE BINDOSZ
956 #include "report_bufsize.h"
957 #error "CONV_BND_OBJ_BUFSIZE does not match BINDOSZ"
961 conv_bnd_obj(uint_t flags
, Conv_bnd_obj_buf_t
*bnd_obj_buf
)
963 static const Val_desc vda
[] = {
964 { LML_FLG_OBJADDED
, MSG_BND_ADDED
},
965 { LML_FLG_OBJREEVAL
, MSG_BND_REEVAL
},
966 { LML_FLG_OBJDELETED
, MSG_BND_DELETED
},
967 { LML_FLG_ATEXIT
, MSG_BND_ATEXIT
},
970 static CONV_EXPN_FIELD_ARG conv_arg
= {
971 NULL
, sizeof (bnd_obj_buf
->buf
) };
973 if ((flags
& (LML_FLG_OBJADDED
| LML_FLG_OBJREEVAL
|
974 LML_FLG_OBJDELETED
| LML_FLG_ATEXIT
)) == 0)
975 return (MSG_ORIG(MSG_BND_REVISIT
));
978 * Note, we're not worried about unknown flags for this family, only
979 * the selected flags are of interest, so we leave conv_arg.rflags
982 conv_arg
.buf
= bnd_obj_buf
->buf
;
983 conv_arg
.oflags
= flags
;
984 (void) conv_expn_field(&conv_arg
, vda
, 0);
986 return ((const char *)bnd_obj_buf
->buf
);