/* Get all the data in .debug_static_vars */ extern void print_static_vars(Dwarf_Debug dbg) { Dwarf_Var *varbuf = NULL; Dwarf_Signed count = 0; Dwarf_Signed i = 0; Dwarf_Off die_off = 0; Dwarf_Off cu_off = 0; char *name = 0; int gvres = 0; Dwarf_Error err = 0; current_section_id = DEBUG_STATIC_VARS; if (!do_print_dwarf) { return; } /* No need to get the real section name, this section not used in modern compilers. */ printf("\n.debug_static_vars\n"); gvres = dwarf_get_vars(dbg, &varbuf, &count, &err); if (gvres == DW_DLV_ERROR) { print_error(dbg, "dwarf_get_vars", gvres, err); } else if (gvres == DW_DLV_NO_ENTRY) { /* no static vars */ } else { Dwarf_Unsigned maxoff = get_info_max_offset(dbg); for (i = 0; i < count; i++) { int vnres = 0; int cures3 = 0; Dwarf_Off global_cu_off = 0; vnres = dwarf_var_name_offsets(varbuf[i], &name, &die_off, &cu_off, &err); deal_with_name_offset_err(dbg, "dwarf_var_name_offsets", name, die_off, vnres, err); cures3 = dwarf_var_cu_offset(varbuf[i], &global_cu_off, &err); if (cures3 != DW_DLV_OK) { print_error(dbg, "dwarf_global_cu_offset", cures3, err); } print_pubname_style_entry(dbg, "static-var", name, die_off, cu_off, global_cu_off, maxoff); /* print associated die too? */ } dwarf_vars_dealloc(dbg, varbuf, count); } } /* print_static_vars */
/* Get all the data in .debug_pubnames */ void print_pubnames(Dwarf_Debug dbg) { Dwarf_Global *globbuf = NULL; Dwarf_Signed count = 0; Dwarf_Signed i = 0; Dwarf_Off die_off = 0; Dwarf_Off cu_off = 0; /* Offset to previous CU */ Dwarf_Off prev_cu_off = elf_max_address; char *name = 0; int res = 0; current_section_id = DEBUG_PUBNAMES; if (do_print_dwarf) { printf("\n.debug_pubnames\n"); } res = dwarf_get_globals(dbg, &globbuf, &count, &err); if (res == DW_DLV_ERROR) { print_error(dbg, "dwarf_get_globals", res, err); } else if (res == DW_DLV_NO_ENTRY) { /* (err == 0 && count == DW_DLV_NOCOUNT) means there are no pubnames. */ } else { Dwarf_Unsigned maxoff = get_info_max_offset(dbg); for (i = 0; i < count; i++) { int nres = 0; int cures3 = 0; Dwarf_Off global_cu_off = 0; nres = dwarf_global_name_offsets(globbuf[i], &name, &die_off, &cu_off, &err); deal_with_name_offset_err(dbg, "dwarf_global_name_offsets", name, die_off, nres, err); cures3 = dwarf_global_cu_offset(globbuf[i], &global_cu_off, &err); if (cures3 != DW_DLV_OK) { print_error(dbg, "dwarf_global_cu_offset", cures3, err); } if (check_pubname_attr) { Dwarf_Bool has_attr; int ares; int dres; Dwarf_Die die; /* We are processing a new set of pubnames for a different CU; get the producer ID, at 'cu_off' to see if we need to skip these pubnames */ if (cu_off != prev_cu_off) { /* Record offset for previous CU */ prev_cu_off = cu_off; dres = dwarf_offdie(dbg, cu_off, &die, &err); if (dres != DW_DLV_OK) { print_error(dbg, "print pubnames: dwarf_offdie a", dres,err); } { /* Get producer name for this CU and update compiler list */ struct esb_s producername; esb_constructor(&producername); get_producer_name(dbg,die,err,&producername); update_compiler_target(esb_get_string(&producername)); esb_destructor(&producername); } dwarf_dealloc(dbg, die, DW_DLA_DIE); } /* get die at die_off */ dres = dwarf_offdie(dbg, die_off, &die, &err); if (dres != DW_DLV_OK) { print_error(dbg, "print pubnames: dwarf_offdie b", dres, err); } ares = dwarf_hasattr(die, DW_AT_external, &has_attr, &err); if (ares == DW_DLV_ERROR) { print_error(dbg, "hassattr on DW_AT_external", ares, err); } /* Check for specific compiler */ if (checking_this_compiler()) { DWARF_CHECK_COUNT(pubname_attr_result,1); if (ares == DW_DLV_OK && has_attr) { /* Should the value of flag be examined? */ } else { DWARF_CHECK_ERROR2(pubname_attr_result,name, "pubname does not have DW_AT_external"); } } dwarf_dealloc(dbg, die, DW_DLA_DIE); } /* Now print pubname, after the test */ if (do_print_dwarf || (record_dwarf_error && check_verbose_mode)) { print_pubname_style_entry(dbg, "global", name, die_off, cu_off, global_cu_off, maxoff); record_dwarf_error = FALSE; /* Clear error condition */ } } dwarf_globals_dealloc(dbg, globbuf, count); } } /* print_pubnames() */
/* Get all the data in .debug_static_funcs On error, this allows some dwarf memory leaks. */ extern void print_static_funcs(Dwarf_Debug dbg) { Dwarf_Func *funcbuf = NULL; Dwarf_Signed count = 0; Dwarf_Signed i = 0; Dwarf_Off die_off = 0; Dwarf_Off cu_off = 0; int gfres = 0; printf("\n.debug_static_func\n"); gfres = dwarf_get_funcs(dbg, &funcbuf, &count, &err); if (gfres == DW_DLV_ERROR) { print_error(dbg, "dwarf_get_funcs", gfres, err); } else if (gfres == DW_DLV_NO_ENTRY) { /* no static funcs */ } else { Dwarf_Unsigned maxoff = get_info_max_offset(dbg); for (i = 0; i < count; i++) { int fnres; int cures3; Dwarf_Unsigned global_cu_off = 0; char *name = 0; fnres = dwarf_func_name_offsets(funcbuf[i], &name, &die_off, &cu_off, &err); deal_with_name_offset_err(dbg, "dwarf_func_name_offsets", name, die_off, fnres, err); cures3 = dwarf_func_cu_offset(funcbuf[i], &global_cu_off, &err); if (cures3 != DW_DLV_OK) { print_error(dbg, "dwarf_global_cu_offset", cures3, err); } print_pubname_style_entry(dbg, "static-func", name, die_off, cu_off, global_cu_off, maxoff); /* print associated die too? */ if (check_pubname_attr) { Dwarf_Bool has_attr; int ares; int dres; Dwarf_Die die; /* get die at die_off */ dres = dwarf_offdie(dbg, die_off, &die, &err); if (dres != DW_DLV_OK) { print_error(dbg, "dwarf_offdie", dres, err); } ares = dwarf_hasattr(die, DW_AT_external, &has_attr, &err); if (ares == DW_DLV_ERROR) { print_error(dbg, "hassattr on DW_AT_external", ares, err); } pubname_attr_result.checks++; if (ares == DW_DLV_OK && has_attr) { /* Should the value of flag be examined? */ } else { DWARF_CHECK_ERROR2(pubname_attr_result,name, "pubname does not have DW_AT_external") } dwarf_dealloc(dbg, die, DW_DLA_DIE); } } dwarf_funcs_dealloc(dbg, funcbuf, count); } } /* print_static_funcs() */
/* get all the data in .debug_types */ extern void print_types(Dwarf_Debug dbg, enum type_type_e type_type) { Dwarf_Type *typebuf = NULL; Dwarf_Signed count = 0; Dwarf_Signed i = 0; char *name = NULL; int gtres = 0; char *section_name = NULL; char *offset_err_name = NULL; char *section_open_name = NULL; char *print_name_prefix = NULL; int (*get_types) (Dwarf_Debug, Dwarf_Type **, Dwarf_Signed *, Dwarf_Error *) = 0; int (*get_offset) (Dwarf_Type, char **, Dwarf_Off *, Dwarf_Off *, Dwarf_Error *) = NULL; int (*get_cu_offset) (Dwarf_Type, Dwarf_Off *, Dwarf_Error *) = NULL; void (*dealloctype) (Dwarf_Debug, Dwarf_Type *, Dwarf_Signed) = NULL; /* Do nothing if in check mode */ if (!do_print_dwarf) { return; } if (type_type == DWARF_PUBTYPES) { section_name = ".debug_pubtypes"; offset_err_name = "dwarf_pubtype_name_offsets"; section_open_name = "dwarf_get_pubtypes"; print_name_prefix = "pubtype"; get_types = dwarf_get_pubtypes; get_offset = dwarf_pubtype_name_offsets; get_cu_offset = dwarf_pubtype_cu_offset; dealloctype = dwarf_pubtypes_dealloc; } else { /* SGI_TYPENAME */ section_name = ".debug_typenames"; offset_err_name = "dwarf_type_name_offsets"; section_open_name = "dwarf_get_types"; print_name_prefix = "type"; get_types = dwarf_get_types; get_offset = dwarf_type_name_offsets; get_cu_offset = dwarf_type_cu_offset; dealloctype = dwarf_types_dealloc; } gtres = get_types(dbg, &typebuf, &count, &err); if (gtres == DW_DLV_ERROR) { print_error(dbg, section_open_name, gtres, err); } else if (gtres == DW_DLV_NO_ENTRY) { /* no types */ } else { Dwarf_Unsigned maxoff = get_info_max_offset(dbg); /* Before July 2005, the section name was printed unconditionally, now only prints if non-empty section really exists. */ printf("\n%s\n", section_name); for (i = 0; i < count; i++) { int tnres = 0; int cures3 = 0; Dwarf_Off die_off = 0; Dwarf_Off cu_off = 0; Dwarf_Off global_cu_off = 0; tnres = get_offset(typebuf[i], &name, &die_off, &cu_off, &err); deal_with_name_offset_err(dbg, offset_err_name, name, die_off, tnres, err); cures3 = get_cu_offset(typebuf[i], &global_cu_off, &err); if (cures3 != DW_DLV_OK) { print_error(dbg, "dwarf_var_cu_offset", cures3, err); } print_pubname_style_entry(dbg, print_name_prefix, name, die_off, cu_off, global_cu_off, maxoff); /* print associated die too? */ } dealloctype(dbg, typebuf, count); } } /* print_types() */