static int print_meta_offset(RCore *core, ut64 offset) { int ret, line, line_old, i; char file[1024]; ret = r_bin_addr2line (core->bin, offset, file, sizeof (file)-1, &line); if (ret) { r_cons_printf ("file %s\nline %d\n", file, line); line_old = line; if (line >= 2) line -= 2; if (r_file_exists (file)) { for (i = 0; i<5; i++) { char *row = r_file_slurp_line (file, line+i, 0); if (row) { r_cons_printf ("%c %.3x %s\n", line+i == line_old ? '>' : ' ', line+i, row); free (row); } } } else { eprintf ("Cannot open '%s'\n", file); } } else { eprintf ("Cannot find meta information at 0x%08" PFMT64x"\n", offset); } return 0; }
R_API char *r_bin_meta_get_source_line(RBin *bin, ut64 addr) { char file[4096]; int line; char *out = NULL; if (r_bin_meta_get_line (bin, addr, file, sizeof (file), &line)) out = r_file_slurp_line (file, line, 0); return out; }
static int bin_dwarf(RCore *core, int mode) { RBinDwarfRow *row; RListIter *iter; RList *list = NULL; RBinFile *binfile = r_core_bin_cur (core); RBinPlugin * plugin = r_bin_file_cur_plugin (binfile); if (!binfile) return false; if (plugin && plugin->lines) { list = plugin->lines (binfile); } else if (core->bin) { // TODO: complete and speed-up support for dwarf if (r_config_get_i (core->config, "bin.dwarf")) { RBinDwarfDebugAbbrev *da = NULL; da = r_bin_dwarf_parse_abbrev (core->bin, mode); r_bin_dwarf_parse_info (da, core->bin, mode); r_bin_dwarf_parse_aranges (core->bin, mode); list = r_bin_dwarf_parse_line (core->bin, mode); r_bin_dwarf_free_debug_abbrev (da); free (da); } } if (!list) return false; r_cons_break (NULL, NULL); r_list_foreach (list, iter, row) { if (r_cons_singleton()->breaked) break; if (mode) { // TODO: use 'Cl' instead of CC const char *path = row->file; char *line = r_file_slurp_line (path, row->line-1, 0); if (line) { r_str_filter (line, strlen (line)); line = r_str_replace (line, "\"", "\\\"", 1); line = r_str_replace (line, "\\\\", "\\", 1); } // TODO: implement internal : if ((mode & R_CORE_BIN_SET)) if ((mode & R_CORE_BIN_SET)) { char *cmt = r_str_newf ("%s:%d %s", row->file, row->line, line?line:""); r_meta_set_string (core->anal, R_META_TYPE_COMMENT, row->address, cmt); free (cmt); } else { r_cons_printf ("\"CC %s:%d %s\"@0x%"PFMT64x"\n", row->file, row->line, line?line:"", row->address); } free (line); } else { r_cons_printf ("0x%08"PFMT64x"\t%s\t%d\n", row->address, row->file, row->line); } } r_cons_break_end (); r_list_free (list); return true; }
R_API char *r_bin_addr2text(RBin *bin, ut64 addr) { char file[1024]; int line; char *out = NULL, *out2; char *file_nopath; if (r_bin_addr2line (bin, addr, file, sizeof (file), &line)) { out = r_file_slurp_line (file, line, 0); if (!out) return 0; out2 = malloc((strlen(file) + 64 + strlen(out))*sizeof(char)); file_nopath = strrchr (file, '/'); snprintf(out2, strlen(file) + 63 + strlen(out), "%s:%d %s", file_nopath ? file_nopath + 1 : file, line, out); free (out); return out2; } return 0; }