void SgAsmElfSection::dump(FILE *f, const char *prefix, ssize_t idx) const { char p[4096]; if (idx>=0) { sprintf(p, "%sElfSection[%zd].", prefix, idx); } else { sprintf(p, "%sElfSection.", prefix); } int w = std::max(1, DUMP_FIELD_WIDTH-(int)strlen(p)); SgAsmGenericSection::dump(f, p, -1); if (get_section_entry()) get_section_entry()->dump(f, p, -1); if (get_segment_entry()) get_segment_entry()->dump(f, p, -1); if (p_linked_section) { fprintf(f, "%s%-*s = [%d] \"%s\"\n", p, w, "linked_to", p_linked_section->get_id(), p_linked_section->get_name()->get_string(true).c_str()); } else { fprintf(f, "%s%-*s = NULL\n", p, w, "linked_to"); } if (variantT() == V_SgAsmElfSection) //unless a base class hexdump(f, 0, std::string(p)+"data at ", p_data); }
/* Print some debugging info */ void SgAsmGenericSection::dump(FILE *f, const char *prefix, ssize_t idx) const { char p[4096]; if (idx>=0) { sprintf(p, "%sSection[%zd].", prefix, idx); } else { sprintf(p, "%sSection.", prefix); } const int w = std::max(1, DUMP_FIELD_WIDTH-(int)strlen(p)); fprintf(f, "%s%-*s = \"%s\"", p, w, "name", p_name->get_string(true).c_str()); if (!p_short_name.empty()) fprintf(f, " (%s)", p_short_name.c_str()); fprintf(f, "\n"); fprintf(f, "%s%-*s = %d\n", p, w, "id", p_id); fprintf(f, "%s%-*s = 0x%08"PRIx64" (%"PRIu64") bytes into file\n", p, w, "offset", p_offset, p_offset); fprintf(f, "%s%-*s = 0x%08"PRIx64" (%"PRIu64") bytes\n", p, w, "size", get_size(), get_size()); if (0==get_file_alignment()) { fprintf(f, "%s%-*s = not specified\n", p, w, "file_alignment"); } else { fprintf(f, "%s%-*s = 0x%08"PRIx64" (%"PRIu64") %s\n", p, w, "file_alignment", get_file_alignment(), get_file_alignment(), 0==get_offset()%get_file_alignment()?"satisfied":"NOT SATISFIED"); } fprintf(f, "%s%-*s = %s\n", p, w, "synthesized", p_synthesized?"yes":"no"); if (p_header) { fprintf(f, "%s%-*s = \"%s\"\n", p, w, "header", p_header->get_name()->get_string(true).c_str()); } else { fprintf(f, "%s%-*s = not associated\n", p, w, "header"); } std::string purpose = stringifySgAsmGenericSectionSectionPurpose(p_purpose); fprintf(f, "%s%-*s = %s\n", p, w, "purpose", purpose.c_str()); if (is_mapped()) { fprintf(f, "%s%-*s = rva=0x%08"PRIx64", size=%"PRIu64" bytes\n", p, w, "mapped", p_mapped_preferred_rva, p_mapped_size); if (0==get_mapped_alignment()) { fprintf(f, "%s%-*s = not specified\n", p, w, "mapped_alignment"); } else { fprintf(f, "%s%-*s = 0x%08"PRIx64" (%"PRIu64") %s\n", p, w, "mapped_alignment", get_mapped_alignment(), get_mapped_alignment(), 0==get_mapped_preferred_rva()%get_mapped_alignment()?"satisfied":"NOT SATISFIED"); } fprintf(f, "%s%-*s = %c%c%c\n", p, w, "permissions", get_mapped_rperm()?'r':'-', get_mapped_wperm()?'w':'-', get_mapped_xperm()?'x':'-'); } else { fprintf(f, "%s%-*s = <not mapped>\n", p, w, "mapped"); } fprintf(f, "%s%-*s = %s\n", p, w, "contains_code", get_contains_code()?"true":"false"); fprintf(f, "%s%-*s = 0x%08"PRIx64" (%"PRIu64") \n", p, w, "mapped_actual_va", p_mapped_actual_va, p_mapped_actual_va); // DQ (8/31/2008): Output the contents if this not derived from (there is likely a // better implementation if the hexdump function was a virtual member function). if (variantT() == V_SgAsmGenericSection) { hexdump(f, 0, std::string(p)+"data at ", p_data); } }
/** Print some debugging info */ void SgAsmElfSegmentTable::dump(FILE *f, const char *prefix, ssize_t idx) const { char p[4096]; if (idx>=0) { sprintf(p, "%sSegmentTable[%zd].", prefix, idx); } else { sprintf(p, "%sSegmentTable.", prefix); } SgAsmGenericSection::dump(f, p, -1); if (variantT() == V_SgAsmElfSegmentTable) //unless a base class hexdump(f, 0, std::string(p)+"data at ", p_data); }
/* Print some debugging info */ void SgAsmPEStringSection::dump(FILE *f, const char *prefix, ssize_t idx) const { char p[4096]; if (idx>=0) { sprintf(p, "%sPEStringSection[%zd].", prefix, idx); } else { sprintf(p, "%sPEStringSection.", prefix); } SgAsmPESection::dump(f, p, -1); ROSE_ASSERT(get_strtab()!=NULL); get_strtab()->dump(f, p, -1); if (variantT() == V_SgAsmPEStringSection) //unless a base class hexdump(f, 0, std::string(p)+"data at ", p_data); }
/** Print some debugging info */ void SgAsmElfFileHeader::dump(FILE *f, const char *prefix, ssize_t idx) const { char p[4096]; if (idx>=0) { sprintf(p, "%sElfFileHeader[%zd].", prefix, idx); } else { sprintf(p, "%sElfFileHeader.", prefix); } int w = std::max(1, DUMP_FIELD_WIDTH-(int)strlen(p)); SgAsmGenericHeader::dump(f, p, -1); const char *class_s = 1==p_e_ident_file_class ? " (32-bit)" : 2==p_e_ident_file_class ? " (64-bit)" : ""; fprintf(f, "%s%-*s = %u%s\n", p, w, "e_ident_file_class", p_e_ident_file_class, class_s); fprintf(f, "%s%-*s = %u\n", p, w, "e_ident_file_version", p_e_ident_file_version); for (size_t i=0; i < p_e_ident_padding.size(); i++) fprintf(f, "%s%-*s = [%" PRIuPTR "] %u\n", p, w, "e_ident_padding", i, p_e_ident_padding[i]); fprintf(f, "%s%-*s = %lu\n", p, w, "e_type", p_e_type); fprintf(f, "%s%-*s = %lu\n", p, w, "e_machine", p_e_machine); fprintf(f, "%s%-*s = 0x%08lx\n", p, w, "e_flags", p_e_flags); fprintf(f, "%s%-*s = 0x%08lx (%lu) bytes\n", p, w, "e_ehsize", p_e_ehsize, p_e_ehsize); fprintf(f, "%s%-*s = 0x%08lx (%lu) bytes\n", p, w, "phextrasz", p_phextrasz, p_phextrasz); fprintf(f, "%s%-*s = %lu\n", p, w, "e_phnum", p_e_phnum); fprintf(f, "%s%-*s = 0x%08lx (%lu) bytes\n", p, w, "shextrasz", p_shextrasz, p_shextrasz); fprintf(f, "%s%-*s = %lu\n", p, w, "e_shnum", p_e_shnum); fprintf(f, "%s%-*s = %lu\n", p, w, "e_shstrndx", p_e_shstrndx); if (p_section_table) { fprintf(f, "%s%-*s = [%d] \"%s\"\n", p, w, "section_table", p_section_table->get_id(), p_section_table->get_name()->get_string(true).c_str()); } else { fprintf(f, "%s%-*s = none\n", p, w, "section_table"); } if (p_segment_table) { fprintf(f, "%s%-*s = [%d] \"%s\"\n", p, w, "segment_table", p_segment_table->get_id(), p_segment_table->get_name()->get_string(true).c_str()); } else { fprintf(f, "%s%-*s = none\n", p, w, "segment_table"); } if (variantT() == V_SgAsmElfFileHeader) //unless a base class hexdump(f, 0, std::string(p)+"data at ", p_data); }
/** Print some debugging info */ void SgAsmElfSymbolSection::dump(FILE *f, const char *prefix, ssize_t idx) const { char p[4096]; if (idx>=0) { sprintf(p, "%sElfSymbolSection[%zd].", prefix, idx); } else { sprintf(p, "%sElfSymbolSection.", prefix); } const int w = std::max(1, DUMP_FIELD_WIDTH-(int)strlen(p)); SgAsmElfSection::dump(f, p, -1); fprintf(f, "%s%-*s = %s\n", p, w, "is_dynamic", p_is_dynamic ? "yes" : "no"); fprintf(f, "%s%-*s = %zu symbols\n", p, w, "ElfSymbol.size", p_symbols->get_symbols().size()); for (size_t i = 0; i < p_symbols->get_symbols().size(); i++) { SgAsmGenericSection *section = get_file()->get_section_by_id(p_symbols->get_symbols()[i]->get_st_shndx()); p_symbols->get_symbols()[i]->dump(f, p, i, section); } if (variantT() == V_SgAsmElfSymbolSection) //unless a base class hexdump(f, 0, std::string(p)+"data at ", p_data); }
/* Print some debugging info */ void SgAsmCoffSymbolTable::dump(FILE *f, const char *prefix, ssize_t idx) const { char p[4096]; if (idx>=0) { sprintf(p, "%sCOFFSymtab[%zd].", prefix, idx); } else { sprintf(p, "%sCOFFSymtab.", prefix); } const int w = std::max(1, DUMP_FIELD_WIDTH-(int)strlen(p)); SgAsmGenericSection::dump(f, p, -1); fprintf(f, "%s%-*s = %zu symbols\n", p, w, "size", p_symbols->get_symbols().size()); for (size_t i = 0; i < p_symbols->get_symbols().size(); i++) { p_symbols->get_symbols()[i]->dump(f, p, i); } if (variantT() == V_SgAsmCoffSymbolTable) //unless a base class hexdump(f, 0, std::string(p)+"data at ", p_data); }
/* Print some debugging information */ void SgAsmPEFileHeader::dump(FILE *f, const char *prefix, ssize_t idx) const { char p[4096]; if (idx>=0) { sprintf(p, "%sPEFileHeader[%zd].", prefix, idx); } else { sprintf(p, "%sPEFileHeader.", prefix); } int w = std::max(1, DUMP_FIELD_WIDTH-(int)strlen(p)); time_t t = p_e_time; char time_str[128]; struct tm *tm = localtime(&t); if (tm) { strftime(time_str, sizeof time_str, "%c", tm); } else { strcpy(time_str, "INVALID"); } SgAsmGenericHeader::dump(f, p, -1); fprintf(f, "%s%-*s = 0x%04x (%u)\n", p, w, "e_cpu_type", p_e_cpu_type, p_e_cpu_type); fprintf(f, "%s%-*s = %u\n", p, w, "e_nsections", p_e_nsections); fprintf(f, "%s%-*s = %u (%s)\n", p, w, "e_time", p_e_time, time_str); fprintf(f, "%s%-*s = 0x%08"PRIx64" (%"PRIu64")\n", p, w, "e_coff_symtab", p_e_coff_symtab, p_e_coff_symtab); fprintf(f, "%s%-*s = %u\n", p, w, "e_coff_nsyms", p_e_coff_nsyms); if (p_coff_symtab) { fprintf(f, "%s%-*s = [%d] \"%s\"\n", p, w, "coff_symtab", p_coff_symtab->get_id(), p_coff_symtab->get_name()->get_string(true).c_str()); } else { fprintf(f, "%s%-*s = none\n", p, w, "coff_symtab"); } fprintf(f, "%s%-*s = 0x%08"PRIx64" (%"PRIu64")\n", p, w, "e_nt_hdr_size", p_e_nt_hdr_size, p_e_nt_hdr_size); fprintf(f, "%s%-*s = 0x%04x (%u)\n", p, w, "e_flags", p_e_flags, p_e_flags); fprintf(f, "%s%-*s = 0x%04x %s\n", p, w, "e_opt_magic", p_e_opt_magic, 0x10b == p_e_opt_magic ? "PE32" : (0x20b == p_e_opt_magic ? "PE32+" : "other")); fprintf(f, "%s%-*s = %u.%u\n", p, w, "linker_vers", p_e_lmajor, p_e_lminor); fprintf(f, "%s%-*s = 0x%08x (%u) bytes\n", p, w, "e_code_size", p_e_code_size, p_e_code_size); fprintf(f, "%s%-*s = 0x%08x (%u) bytes\n", p, w, "e_data_size", p_e_data_size, p_e_data_size); fprintf(f, "%s%-*s = 0x%08x (%u) bytes\n", p, w, "e_bss_size", p_e_bss_size, p_e_bss_size); fprintf(f, "%s%-*s = %s\n", p, w, "e_code_rva", p_e_code_rva.to_string().c_str()); fprintf(f, "%s%-*s = %s\n", p, w, "e_data_rva", p_e_data_rva.to_string().c_str()); fprintf(f, "%s%-*s = 0x%08x (%u)\n", p, w, "e_section_align", p_e_section_align, p_e_section_align); fprintf(f, "%s%-*s = 0x%08x (%u)\n", p, w, "e_file_align", p_e_file_align, p_e_file_align); fprintf(f, "%s%-*s = %u.%u\n", p, w, "os_vers", p_e_os_major, p_e_os_minor); fprintf(f, "%s%-*s = %u.%u\n", p, w, "user_vers", p_e_user_major, p_e_user_minor); fprintf(f, "%s%-*s = %u.%u\n", p, w, "subsys_vers", p_e_subsys_major, p_e_subsys_minor); fprintf(f, "%s%-*s = %u\n", p, w, "e_reserved9", p_e_reserved9); fprintf(f, "%s%-*s = 0x%08x (%u)\n", p, w, "e_image_size", p_e_image_size, p_e_image_size); fprintf(f, "%s%-*s = 0x%08x (%u)\n", p, w, "e_header_size", p_e_header_size, p_e_header_size); fprintf(f, "%s%-*s = 0x%08x (%u)\n", p, w, "e_file_checksum", p_e_file_checksum, p_e_file_checksum); fprintf(f, "%s%-*s = %u\n", p, w, "e_subsystem", p_e_subsystem); fprintf(f, "%s%-*s = 0x%04x (%u)\n", p, w, "e_dll_flags", p_e_dll_flags, p_e_dll_flags); fprintf(f, "%s%-*s = 0x%08x (%u)\n", p, w, "e_stack_reserve_size", p_e_stack_reserve_size, p_e_stack_reserve_size); fprintf(f, "%s%-*s = 0x%08x (%u)\n", p, w, "e_stack_commit_size", p_e_stack_commit_size, p_e_stack_commit_size); fprintf(f, "%s%-*s = 0x%08x (%u)\n", p, w, "e_heap_reserve_size", p_e_heap_reserve_size, p_e_heap_reserve_size); fprintf(f, "%s%-*s = 0x%08x (%u)\n", p, w, "e_heap_commit_size", p_e_heap_commit_size, p_e_heap_commit_size); fprintf(f, "%s%-*s = 0x%08x (%u)\n", p, w, "e_loader_flags", p_e_loader_flags, p_e_loader_flags); fprintf(f, "%s%-*s = %u\n", p, w, "e_num_rvasize_pairs", p_e_num_rvasize_pairs); for (unsigned i = 0; i < p_rvasize_pairs->get_pairs().size(); i++) { char p2[256]; int nprint __attribute__((unused)) = snprintf(p2, sizeof p2, "%s.pair[%d].", p, i); assert((size_t)nprint<sizeof p2); w = std::max(1, DUMP_FIELD_WIDTH-(int)strlen(p2)); fprintf(f, "%s%-*s = rva %s,\tsize 0x%08"PRIx64" (%"PRIu64")\n", p2, w, "..", p_rvasize_pairs->get_pairs()[i]->get_e_rva().to_string().c_str(), p_rvasize_pairs->get_pairs()[i]->get_e_size(), p_rvasize_pairs->get_pairs()[i]->get_e_size()); } if (p_section_table) { fprintf(f, "%s%-*s = [%d] \"%s\"\n", p, w, "section_table", p_section_table->get_id(), p_section_table->get_name()->get_string(true).c_str()); } else { fprintf(f, "%s%-*s = none\n", p, w, "section_table"); } if (variantT() == V_SgAsmPEFileHeader) //unless a base class hexdump(f, 0, std::string(p)+"data at ", p_data); /* Show the simulated loader memory map */ const MemoryMap *map = get_loader_map(); if (map) { map->dump(f, (std::string(p)+"loader_map: ").c_str()); } else { fprintf(f, "%s%-*s = not defined\n", p, w, "loader_map"); } }