Handle io.maps and bin.segments in o* to handle custom maps in projects ##projects

This commit is contained in:
pancake 2021-01-19 13:40:30 +01:00 committed by pancake
parent d8c8851a42
commit d6f4cca167
2 changed files with 43 additions and 20 deletions

View File

@ -1236,36 +1236,54 @@ static bool desc_list_quiet_cb(void *user, void *data, ut32 id) {
return true;
}
static ut64 getmaddr(RCore *core, RIODesc *desc) {
RList *maps = r_io_map_get_for_fd (core->io, desc->fd);
RListIter *iter;
RIOMap *map;
ut64 lowest = UT64_MAX;
r_list_foreach (maps, iter, map) {
return map->itv.addr + map->delta;
}
return (lowest == UT64_MAX)? 0: lowest;
}
static bool desc_list_cmds_cb(void *user, void *data, ut32 id) {
RCore *core = (RCore *)user;
RPrint *p = core->print;
RIODesc *desc = (RIODesc *)data;
RBinFile *bf = r_bin_file_find_by_fd (core->bin, desc->fd);
if (bf && bf->file) {
if (bf) {
p->cb_printf ("o %s 0x%08"PFMT64x" %s\n", desc->uri, bf->o->baddr, r_str_rwx_i (desc->perm));
} else {
if (!strstr (desc->uri, "null://")) {
ut64 maddr = 0LL;
RList *maps = r_io_map_get_for_fd (core->io, desc->fd);
RListIter *iter;
RIOMap *map;
r_list_foreach (maps, iter, map) {
maddr = map->itv.addr + map->delta;
// XXX only reloading the first map is not correct but works for some generic cases
break;
}
if (maddr != 0LL) {
p->cb_printf ("on %s 0x%08"PFMT64x"\n", desc->uri, maddr);
} else {
p->cb_printf ("on %s\n", desc->uri);
}
r_list_foreach (maps, iter, map) {
if (R_STR_ISEMPTY (map->name)) {
continue;
p->cb_printf ("on %s 0x%08"PFMT64x"\n", desc->uri, getmaddr (core, desc)); //perms?
}
if (strstr (desc->uri, "null://")) {
// null descs dont want to be mapped
return true;
}
RList *list = r_bin_get_sections (core->bin);
RList *maps = r_io_map_get_for_fd (core->io, desc->fd);
RListIter *iter, *iter2;
RBinSection *sec;
RIOMap *map;
r_list_foreach (maps, iter, map) {
bool map_from_bin = false;
r_list_foreach (list, iter2, sec) {
if (sec->is_segment) {
if (sec->vaddr == map->itv.addr) {
map_from_bin = true;
break;
}
p->cb_printf ("omn 0x%08"PFMT64x" %s\n", map->itv.addr, map->name);
}
}
if (!map_from_bin) {
ut64 paddr = map->itv.addr;
ut64 vaddr = map->itv.addr + map->delta;
ut64 size = map->itv.size;
p->cb_printf ("om $d 0x%08"PFMT64x" 0x%08"PFMT64x" 0x%08"PFMT64x" %s %s\n",
vaddr, size, paddr, r_str_rwx_i (map->perm), r_str_get(map->name));
}
}
return true;
}

View File

@ -673,6 +673,11 @@ static ut64 num_callback(RNum *userptr, const char *str, int *ok) {
break;
case 'c': // $c console width
return r_cons_get_size (NULL);
case 'd': // $d - same as 'op'
if (core->io && core->io->desc) {
return core->io->desc->fd;
}
return 0;
case 'r': // $r
if (str[2] == '{') {
bptr = strdup (str + 3);