4 * Copyright (c) 2007 John Birrell (jb@freebsd.org)
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28 * $FreeBSD: src/lib/libdwarf/dwarf_dump.c,v 1.1.4.1 2009/08/03 08:13:06 kensmith Exp $
33 #include "_libdwarf.h"
36 get_sht_desc(uint32_t sh_type
)
42 return "program defined information";
44 return "symbol table section";
46 return "string table section";
48 return "relocation section with addends";
50 return "symbol hash table section";
52 return "dynamic section";
54 return "note section";
56 return "no space section";
58 return "relocation section - no addends";
60 return "reserved - purpose unknown";
62 return "dynamic symbol table section";
64 return "Initialization function pointers.";
66 return "Termination function pointers.";
67 case SHT_PREINIT_ARRAY
:
68 return "Pre-initialization function ptrs.";
70 return "Section group.";
71 case SHT_SYMTAB_SHNDX
:
72 return "Section indexes (see SHN_XINDEX).";
74 return "Symbol versions provided";
76 return "Symbol versions required";
78 return "Symbol version table";
79 case SHT_AMD64_UNWIND
:
80 return "AMD64 unwind";
87 get_attr_desc(uint32_t attr
)
90 case DW_AT_abstract_origin
:
91 return "DW_AT_abstract_origin";
92 case DW_AT_accessibility
:
93 return "DW_AT_accessibility";
94 case DW_AT_address_class
:
95 return "DW_AT_address_class";
96 case DW_AT_artificial
:
97 return "DW_AT_artificial";
98 case DW_AT_base_types
:
99 return "DW_AT_base_types";
100 case DW_AT_bit_offset
:
101 return "DW_AT_bit_offset";
103 return "DW_AT_bit_size";
104 case DW_AT_byte_size
:
105 return "DW_AT_byte_size";
106 case DW_AT_calling_convention
:
107 return "DW_AT_calling_convention";
108 case DW_AT_common_reference
:
109 return "DW_AT_common_reference";
111 return "DW_AT_comp_dir";
112 case DW_AT_const_value
:
113 return "DW_AT_const_value";
114 case DW_AT_containing_type
:
115 return "DW_AT_containing_type";
117 return "DW_AT_count";
118 case DW_AT_data_member_location
:
119 return "DW_AT_data_member_location";
120 case DW_AT_decl_column
:
121 return "DW_AT_decl_column";
122 case DW_AT_decl_file
:
123 return "DW_AT_decl_file";
124 case DW_AT_decl_line
:
125 return "DW_AT_decl_line";
126 case DW_AT_declaration
:
127 return "DW_AT_declaration";
128 case DW_AT_default_value
:
129 return "DW_AT_default_value";
131 return "DW_AT_discr";
132 case DW_AT_discr_list
:
133 return "DW_AT_discr_list";
134 case DW_AT_discr_value
:
135 return "DW_AT_discr_value";
136 case DW_AT_element_list
:
137 return "DW_AT_element_list";
139 return "DW_AT_encoding";
141 return "DW_AT_external";
142 case DW_AT_frame_base
:
143 return "DW_AT_frame_base";
145 return "DW_AT_friend";
147 return "DW_AT_high_pc";
148 case DW_AT_identifier_case
:
149 return "DW_AT_identifier_case";
151 return "DW_AT_import";
153 return "DW_AT_inline";
154 case DW_AT_is_optional
:
155 return "DW_AT_is_optional";
157 return "DW_AT_language";
159 return "DW_AT_location";
161 return "DW_AT_low_pc";
162 case DW_AT_lower_bound
:
163 return "DW_AT_lower_bound";
164 case DW_AT_macro_info
:
165 return "DW_AT_macro_info";
167 return "DW_AT_member";
170 case DW_AT_namelist_item
:
171 return "DW_AT_namelist_item";
173 return "DW_AT_ordering";
175 return "DW_AT_priority";
177 return "DW_AT_producer";
178 case DW_AT_prototyped
:
179 return "DW_AT_prototyped";
180 case DW_AT_return_addr
:
181 return "DW_AT_return_addr";
183 return "DW_AT_segment";
185 return "DW_AT_sibling";
186 case DW_AT_specification
:
187 return "DW_AT_specification";
188 case DW_AT_start_scope
:
189 return "DW_AT_start_scope";
190 case DW_AT_static_link
:
191 return "DW_AT_static_link";
192 case DW_AT_stmt_list
:
193 return "DW_AT_stmt_list";
194 case DW_AT_stride_size
:
195 return "DW_AT_stride_size";
196 case DW_AT_string_length
:
197 return "DW_AT_string_length";
198 case DW_AT_subscr_data
:
199 return "DW_AT_subscr_data";
202 case DW_AT_upper_bound
:
203 return "DW_AT_upper_bound";
204 case DW_AT_use_location
:
205 return "DW_AT_use_location";
206 case DW_AT_variable_parameter
:
207 return "DW_AT_variable_parameter";
208 case DW_AT_virtuality
:
209 return "DW_AT_virtuality";
210 case DW_AT_visibility
:
211 return "DW_AT_visibility";
212 case DW_AT_vtable_elem_location
:
213 return "DW_AT_vtable_elem_location";
218 return "Unknown attribute";
222 get_form_desc(uint32_t form
)
226 return "DW_FORM_addr";
228 return "DW_FORM_block";
230 return "DW_FORM_block1";
232 return "DW_FORM_block2";
234 return "DW_FORM_block4";
236 return "DW_FORM_data1";
238 return "DW_FORM_data2";
240 return "DW_FORM_data4";
242 return "DW_FORM_data8";
244 return "DW_FORM_flag";
245 case DW_FORM_indirect
:
246 return "DW_FORM_indirect";
248 return "DW_FORM_ref1";
250 return "DW_FORM_ref2";
252 return "DW_FORM_ref4";
254 return "DW_FORM_ref8";
255 case DW_FORM_ref_addr
:
256 return "DW_FORM_ref_addr";
257 case DW_FORM_ref_udata
:
258 return "DW_FORM_ref_udata";
260 return "DW_FORM_sdata";
262 return "DW_FORM_string";
264 return "DW_FORM_strp";
266 return "DW_FORM_udata";
271 return "Unknown attribute";
275 get_tag_desc(uint32_t tag
)
278 case DW_TAG_access_declaration
:
279 return "DW_TAG_access_declaration";
280 case DW_TAG_array_type
:
281 return "DW_TAG_array_type";
282 case DW_TAG_base_type
:
283 return "DW_TAG_base_type";
284 case DW_TAG_catch_block
:
285 return "DW_TAG_catch_block";
286 case DW_TAG_class_type
:
287 return "DW_TAG_class_type";
288 case DW_TAG_common_block
:
289 return "DW_TAG_common_block";
290 case DW_TAG_common_inclusion
:
291 return "DW_TAG_common_inclusion";
292 case DW_TAG_compile_unit
:
293 return "DW_TAG_compile_unit";
294 case DW_TAG_condition
:
295 return "DW_TAG_condition";
296 case DW_TAG_const_type
:
297 return "DW_TAG_const_type";
298 case DW_TAG_constant
:
299 return "DW_TAG_constant";
300 case DW_TAG_dwarf_procedure
:
301 return "DW_TAG_dwarf_procedure";
302 case DW_TAG_entry_point
:
303 return "DW_TAG_entry_point";
304 case DW_TAG_enumeration_type
:
305 return "DW_TAG_enumeration_type";
306 case DW_TAG_enumerator
:
307 return "DW_TAG_enumerator";
308 case DW_TAG_formal_parameter
:
309 return "DW_TAG_formal_parameter";
311 return "DW_TAG_friend";
312 case DW_TAG_imported_declaration
:
313 return "DW_TAG_imported_declaration";
314 case DW_TAG_imported_module
:
315 return "DW_TAG_imported_module";
316 case DW_TAG_imported_unit
:
317 return "DW_TAG_imported_unit";
318 case DW_TAG_inheritance
:
319 return "DW_TAG_inheritance";
320 case DW_TAG_inlined_subroutine
:
321 return "DW_TAG_inlined_subroutine";
322 case DW_TAG_interface_type
:
323 return "DW_TAG_interface_type";
325 return "DW_TAG_label";
326 case DW_TAG_lexical_block
:
327 return "DW_TAG_lexical_block";
329 return "DW_TAG_member";
331 return "DW_TAG_module";
332 case DW_TAG_namelist
:
333 return "DW_TAG_namelist";
334 case DW_TAG_namelist_item
:
335 return "DW_TAG_namelist_item";
336 case DW_TAG_namespace
:
337 return "DW_TAG_namespace";
338 case DW_TAG_packed_type
:
339 return "DW_TAG_packed_type";
340 case DW_TAG_partial_unit
:
341 return "DW_TAG_partial_unit";
342 case DW_TAG_pointer_type
:
343 return "DW_TAG_pointer_type";
344 case DW_TAG_ptr_to_member_type
:
345 return "DW_TAG_ptr_to_member_type";
346 case DW_TAG_reference_type
:
347 return "DW_TAG_reference_type";
348 case DW_TAG_restrict_type
:
349 return "DW_TAG_restrict_type";
350 case DW_TAG_set_type
:
351 return "DW_TAG_set_type";
352 case DW_TAG_shared_type
:
353 return "DW_TAG_shared_type";
354 case DW_TAG_string_type
:
355 return "DW_TAG_string_type";
356 case DW_TAG_structure_type
:
357 return "DW_TAG_structure_type";
358 case DW_TAG_subprogram
:
359 return "DW_TAG_subprogram";
360 case DW_TAG_subrange_type
:
361 return "DW_TAG_subrange_type";
362 case DW_TAG_subroutine_type
:
363 return "DW_TAG_subroutine_type";
364 case DW_TAG_template_type_parameter
:
365 return "DW_TAG_template_type_parameter";
366 case DW_TAG_template_value_parameter
:
367 return "DW_TAG_template_value_parameter";
368 case DW_TAG_thrown_type
:
369 return "DW_TAG_thrown_type";
370 case DW_TAG_try_block
:
371 return "DW_TAG_try_block";
373 return "DW_TAG_typedef";
374 case DW_TAG_union_type
:
375 return "DW_TAG_union_type";
376 case DW_TAG_unspecified_parameters
:
377 return "DW_TAG_unspecified_parameters";
378 case DW_TAG_unspecified_type
:
379 return "DW_TAG_unspecified_type";
380 case DW_TAG_variable
:
381 return "DW_TAG_variable";
383 return "DW_TAG_variant";
384 case DW_TAG_variant_part
:
385 return "DW_TAG_variant_part";
386 case DW_TAG_volatile_type
:
387 return "DW_TAG_volatile_type";
388 case DW_TAG_with_stmt
:
389 return "DW_TAG_with_stmt";
394 return "Unknown tag";
398 dwarf_dump_abbrev(Dwarf_Debug dbg
)
404 printf("Contents of the .debug_abbrev section:\n\nEntry Tag\n");
406 STAILQ_FOREACH(cu
, &dbg
->dbg_cu
, cu_next
) {
407 STAILQ_FOREACH(a
, &cu
->cu_abbrev
, a_next
) {
408 printf("%5lu %-30s [%s children]\n",
409 (u_long
) a
->a_entry
, get_tag_desc(a
->a_tag
),
410 (a
->a_children
== DW_CHILDREN_yes
) ? "has" : "no");
412 STAILQ_FOREACH(at
, &a
->a_attrib
, at_next
)
413 printf(" %-30s %s\n", get_attr_desc(at
->at_attrib
),
414 get_form_desc(at
->at_form
));
422 case DW_INL_not_inlined
:
423 printf (_("(not inlined)"));
426 printf (_("(inlined)"));
428 case DW_INL_declared_not_inlined
:
429 printf (_("(declared as inline but ignored)"));
431 case DW_INL_declared_inlined
:
432 printf (_("(declared as inline and inlined)"));
435 printf (_(" (Unknown inline attribute value: %lx)"), uvalue
);
443 case DW_LANG_C
: printf ("(non-ANSI C)"); break;
444 case DW_LANG_C89
: printf ("(ANSI C)"); break;
445 case DW_LANG_C_plus_plus
: printf ("(C++)"); break;
446 case DW_LANG_Fortran77
: printf ("(FORTRAN 77)"); break;
447 case DW_LANG_Fortran90
: printf ("(Fortran 90)"); break;
448 case DW_LANG_Modula2
: printf ("(Modula 2)"); break;
449 case DW_LANG_Pascal83
: printf ("(ANSI Pascal)"); break;
450 case DW_LANG_Ada83
: printf ("(Ada)"); break;
451 case DW_LANG_Cobol74
: printf ("(Cobol 74)"); break;
452 case DW_LANG_Cobol85
: printf ("(Cobol 85)"); break;
453 /* DWARF 2.1 values. */
454 case DW_LANG_C99
: printf ("(ANSI C99)"); break;
455 case DW_LANG_Ada95
: printf ("(ADA 95)"); break;
456 case DW_LANG_Fortran95
: printf ("(Fortran 95)"); break;
457 /* MIPS extension. */
458 case DW_LANG_Mips_Assembler
: printf ("(MIPS assembler)"); break;
460 case DW_LANG_Upc
: printf ("(Unified Parallel C)"); break;
462 printf ("(Unknown: %lx)", uvalue
);
470 case DW_ATE_void
: printf ("(void)"); break;
471 case DW_ATE_address
: printf ("(machine address)"); break;
472 case DW_ATE_boolean
: printf ("(boolean)"); break;
473 case DW_ATE_complex_float
: printf ("(complex float)"); break;
474 case DW_ATE_float
: printf ("(float)"); break;
475 case DW_ATE_signed
: printf ("(signed)"); break;
476 case DW_ATE_signed_char
: printf ("(signed char)"); break;
477 case DW_ATE_unsigned
: printf ("(unsigned)"); break;
478 case DW_ATE_unsigned_char
: printf ("(unsigned char)"); break;
479 /* DWARF 2.1 value. */
480 case DW_ATE_imaginary_float
: printf ("(imaginary float)"); break;
482 if (uvalue
>= DW_ATE_lo_user
483 && uvalue
<= DW_ATE_hi_user
)
484 printf ("(user defined type)");
486 printf ("(unknown type)");
491 case DW_AT_accessibility
:
494 case DW_ACCESS_public
: printf ("(public)"); break;
495 case DW_ACCESS_protected
: printf ("(protected)"); break;
496 case DW_ACCESS_private
: printf ("(private)"); break;
498 printf ("(unknown accessibility)");
503 case DW_AT_visibility
:
506 case DW_VIS_local
: printf ("(local)"); break;
507 case DW_VIS_exported
: printf ("(exported)"); break;
508 case DW_VIS_qualified
: printf ("(qualified)"); break;
509 default: printf ("(unknown visibility)"); break;
513 case DW_AT_virtuality
:
516 case DW_VIRTUALITY_none
: printf ("(none)"); break;
517 case DW_VIRTUALITY_virtual
: printf ("(virtual)"); break;
518 case DW_VIRTUALITY_pure_virtual
:printf ("(pure_virtual)"); break;
519 default: printf ("(unknown virtuality)"); break;
523 case DW_AT_identifier_case
:
526 case DW_ID_case_sensitive
: printf ("(case_sensitive)"); break;
527 case DW_ID_up_case
: printf ("(up_case)"); break;
528 case DW_ID_down_case
: printf ("(down_case)"); break;
529 case DW_ID_case_insensitive
: printf ("(case_insensitive)"); break;
530 default: printf ("(unknown case)"); break;
534 case DW_AT_calling_convention
:
537 case DW_CC_normal
: printf ("(normal)"); break;
538 case DW_CC_program
: printf ("(program)"); break;
539 case DW_CC_nocall
: printf ("(nocall)"); break;
541 if (uvalue
>= DW_CC_lo_user
542 && uvalue
<= DW_CC_hi_user
)
543 printf ("(user defined)");
545 printf ("(unknown convention)");
552 case -1: printf ("(undefined)"); break;
553 case 0: printf ("(row major)"); break;
554 case 1: printf ("(column major)"); break;
558 case DW_AT_frame_base
:
560 case DW_AT_data_member_location
:
561 case DW_AT_vtable_elem_location
:
562 case DW_AT_allocated
:
563 case DW_AT_associated
:
564 case DW_AT_data_location
:
566 case DW_AT_upper_bound
:
567 case DW_AT_lower_bound
:
571 decode_location_expression (block_start
, pointer_size
, uvalue
);
574 else if (form
== DW_FORM_data4
|| form
== DW_FORM_data8
)
577 printf ("location list");
584 dwarf_dump_av_attr(Dwarf_Die die __unused
, Dwarf_AttrValue av
)
586 switch (av
->av_attrib
) {
587 case DW_AT_accessibility
:
590 case DW_AT_calling_convention
:
596 case DW_AT_identifier_case
:
608 case DW_AT_virtuality
:
611 case DW_AT_visibility
:
614 case DW_AT_frame_base
:
616 case DW_AT_data_member_location
:
617 case DW_AT_vtable_elem_location
:
618 case DW_AT_upper_bound
:
619 case DW_AT_lower_bound
:
628 dwarf_dump_av(Dwarf_Die die
, Dwarf_AttrValue av
)
632 printf(" %-30s : %-16s ",
633 get_attr_desc(av
->av_attrib
),
634 get_form_desc(av
->av_form
));
636 switch (av
->av_form
) {
638 printf("0x%llx", (unsigned long long) av
->u
[0].u64
);
644 printf("%lu byte block:", (u_long
) av
->u
[0].u64
);
645 for (i
= 0; i
< av
->u
[0].u64
; i
++)
646 printf(" %02x", av
->u
[1].u8p
[i
]);
653 printf("%llu", (unsigned long long) av
->u
[0].u64
);
659 case DW_FORM_ref_udata
:
660 printf("<%llx>", (unsigned long long) (av
->u
[0].u64
+
661 die
->die_cu
->cu_offset
));
664 printf("%s", av
->u
[0].s
);
667 printf("(indirect string, offset 0x%llx): %s",
668 (unsigned long long) av
->u
[0].u64
, av
->u
[1].s
);
671 printf("unknown form");
675 /* Dump any extra attribute-specific information. */
676 dwarf_dump_av_attr(die
, av
);
682 dwarf_dump_die_at_offset(Dwarf_Debug dbg
, Dwarf_Off off
)
690 STAILQ_FOREACH(cu
, &dbg
->dbg_cu
, cu_next
) {
691 STAILQ_FOREACH(die
, &cu
->cu_die
, die_next
) {
692 if ((off_t
) die
->die_offset
== off
) {
701 dwarf_dump_die(Dwarf_Die die
)
705 printf("<%d><%llx>: Abbrev number: %llu (%s)\n",
706 die
->die_level
, (unsigned long long) die
->die_offset
,
707 (unsigned long long) die
->die_abnum
,
708 get_tag_desc(die
->die_a
->a_tag
));
710 STAILQ_FOREACH(av
, &die
->die_attrval
, av_next
)
711 dwarf_dump_av(die
, av
);
715 dwarf_dump_raw(Dwarf_Debug dbg
)
718 char *p
= (char *) dbg
;
721 printf("dbg %p\n",dbg
);
726 for (i
= 0; i
< (int) sizeof(*dbg
); i
++) {
727 if (*p
>= 0x20 && *p
< 0x7f) {
728 printf(" %c",*p
++ & 0xff);
730 printf(" %02x",*p
++ & 0xff);
735 STAILQ_FOREACH(cu
, &dbg
->dbg_cu
, cu_next
) {
737 printf("cu %p\n",cu
);
738 for (i
= 0; i
< (int) sizeof(*cu
); i
++) {
739 if (*p
>= 0x20 && *p
< 0x7f) {
740 printf(" %c",*p
++ & 0xff);
742 printf(" %02x",*p
++ & 0xff);
750 dwarf_dump_tree_dies(Dwarf_Debug dbg
, Dwarf_Die die
, Dwarf_Error
*error
)
758 if ((ret
= dwarf_child(die
, &child
, error
) == DWARF_E_NO_ENTRY
)) {
760 } else if (ret
!= DWARF_E_NONE
) {
761 printf("Error %s\n", dwarf_errmsg(error
));
764 dwarf_dump_tree_dies(dbg
, child
, error
);
766 if (dwarf_siblingof(dbg
, die
, &die
, error
) != DWARF_E_NONE
)
769 } while (die
!= NULL
);
773 dwarf_dump_tree(Dwarf_Debug dbg
)
778 Dwarf_Half cu_pointer_size
;
779 Dwarf_Half cu_version
;
780 Dwarf_Unsigned cu_abbrev_offset
;
781 Dwarf_Unsigned cu_header_length
;
782 Dwarf_Unsigned cu_next_offset
;
784 STAILQ_FOREACH(cu
, &dbg
->dbg_cu
, cu_next
) {
785 printf ("\nCompilation Unit @ offset %llx:\n",
786 (unsigned long long) cu
->cu_offset
);
787 printf (" Length: %lu\n", (u_long
) cu
->cu_length
);
788 printf (" Version: %hu\n", cu
->cu_version
);
789 printf (" Abbrev Offset: %lu\n", (u_long
) cu
->cu_abbrev_offset
);
790 printf (" Pointer Size: %u\n", (u_int
) cu
->cu_pointer_size
);
792 if (dwarf_next_cu_header(dbg
, &cu_header_length
,
793 &cu_version
, &cu_abbrev_offset
, &cu_pointer_size
,
794 &cu_next_offset
, &error
) != DWARF_E_NONE
) {
795 printf("Error %s\n", dwarf_errmsg(&error
));
799 if (dwarf_siblingof(dbg
, NULL
, &die
, &error
) != DWARF_E_NONE
) {
800 printf("Error %s\n", dwarf_errmsg(&error
));
804 dwarf_dump_tree_dies(dbg
, die
, &error
);
810 dwarf_dump_info(Dwarf_Debug dbg
)
815 printf("Contents of the .debug_info section:\n");
817 STAILQ_FOREACH(cu
, &dbg
->dbg_cu
, cu_next
) {
818 printf ("\nCompilation Unit @ offset %llx:\n",
819 (unsigned long long) cu
->cu_offset
);
820 printf (" Length: %lu\n", (u_long
) cu
->cu_length
);
821 printf (" Version: %hu\n", cu
->cu_version
);
822 printf (" Abbrev Offset: %lu\n", (u_long
) cu
->cu_abbrev_offset
);
823 printf (" Pointer Size: %u\n", (u_int
) cu
->cu_pointer_size
);
825 STAILQ_FOREACH(die
, &cu
->cu_die
, die_next
)
832 dwarf_dump_shstrtab(Dwarf_Debug dbg
)
837 printf("---------------------\nSection header string table contents:\n");
838 while ((name
= elf_strptr(dbg
->dbg_elf
, dbg
->dbg_stnum
, indx
)) != NULL
) {
839 printf("%5d '%s'\n",indx
,name
);
840 indx
+= strlen(name
) + 1;
845 dwarf_dump_strtab(Dwarf_Debug dbg
)
850 printf("---------------------\nString table contents:\n");
851 while ((name
= elf_strptr(dbg
->dbg_elf
, dbg
->dbg_s
[DWARF_strtab
].s_shnum
, indx
)) != NULL
) {
852 printf("%5d '%s'\n",indx
,name
);
853 indx
+= strlen(name
) + 1;
858 dwarf_dump_dbgstr(Dwarf_Debug dbg
)
863 printf("---------------------\nDebug string table contents:\n");
864 while ((name
= elf_strptr(dbg
->dbg_elf
, dbg
->dbg_s
[DWARF_debug_str
].s_shnum
, indx
)) != NULL
) {
865 printf("%5d '%s'\n",indx
,name
);
866 indx
+= strlen(name
) + 1;
871 dwarf_dump_symtab(Dwarf_Debug dbg
)
877 printf("---------------------\nSymbol table contents:\n");
878 while (gelf_getsym(dbg
->dbg_s
[DWARF_symtab
].s_data
, indx
++, &sym
) != NULL
) {
879 if ((name
= elf_strptr(dbg
->dbg_elf
, dbg
->dbg_s
[DWARF_strtab
].s_shnum
, sym
.st_name
)) == NULL
)
880 printf("sym.st_name %u indx %d sym.st_size %lu\n",sym
.st_name
,indx
,(u_long
) sym
.st_size
);
882 printf("'%s' sym.st_name %u indx %d sym.st_size %lu\n",name
,sym
.st_name
,indx
,(u_long
) sym
.st_size
);
887 dwarf_dump(Dwarf_Debug dbg
)
889 dwarf_dump_strtab(dbg
);
890 dwarf_dump_shstrtab(dbg
);
891 dwarf_dump_dbgstr(dbg
);
892 dwarf_dump_symtab(dbg
);
893 dwarf_dump_info(dbg
);