/* //tag[@name='DW_TAG_structure_type'] */ #include #include #include #include #include #include static Dwarf_Debug debug; static Dwarf_Error error; struct die_list { Dwarf_Die die; struct die_list *next; }; struct die_list * add_die (Dwarf_Die die, struct die_list *die_list) { struct die_list *new = malloc (sizeof (struct die_list)); assert (new != NULL); new->die = die; new->next = die_list; return new; } struct die_list * collect_all_struct_sub (Dwarf_Die die, struct die_list *die_list) { int ret; Dwarf_Half tagval; Dwarf_Die child_die; ret = dwarf_tag (die, &tagval, NULL); assert (ret == DW_DLV_OK); if (tagval == DW_TAG_structure_type) { Dwarf_Off off; ret = dwarf_dieoffset (die, &off, NULL); assert (ret == DW_DLV_OK); printf ("struct: %d\n", (int)off); die_list = add_die (die, die_list); } /* visit all children */ ret = dwarf_child (die, &child_die, NULL); assert (ret != DW_DLV_ERROR); if (ret == DW_DLV_NO_ENTRY) return die_list; while (1) { Dwarf_Die sibling_die; die_list = collect_all_struct_sub (child_die, die_list); ret = dwarf_siblingof (debug, child_die, &sibling_die, NULL); assert (ret != DW_DLV_ERROR); if (ret == DW_DLV_NO_ENTRY) break; child_die = sibling_die; } return die_list; } struct die_list * collect_all_struct (void) { int ret; Dwarf_Die die; Dwarf_Half tagval; Dwarf_Unsigned next_cu_header; struct die_list *die_list = NULL; while (1) { ret = dwarf_next_cu_header (debug, NULL, NULL, NULL, NULL, &next_cu_header, NULL); if (ret == DW_DLV_NO_ENTRY) break; assert (ret == DW_DLV_OK); ret = dwarf_siblingof (debug, 0, &die, NULL); assert (ret != DW_DLV_ERROR); ret = dwarf_tag (die, &tagval, NULL); assert (ret == DW_DLV_OK); assert (tagval == DW_TAG_compile_unit); die_list = collect_all_struct_sub (die, die_list); } return die_list; } int main (int argc, char *argv []) { int ret; int i; FILE *fp; struct die_list *die_list; if (argc < 2) { fprintf (stderr, "Usage: %s filename\n", argv [0]); exit (1); } fp = fopen (argv [1], "r"); if (fp == NULL) { perror ("fopen"); exit (1); } ret = dwarf_init (fileno(fp), DW_DLC_READ, NULL, NULL, &debug, NULL); assert (ret == DW_DLV_OK); die_list = collect_all_struct (); for (i = 0; ; i++) { if (die_list == NULL) break; printf ("%d\n", (int)die_list->die); die_list = die_list->next; } printf ("%d\n", i); ret = dwarf_finish (debug, NULL); assert (ret == DW_DLV_OK); fclose (fp); }