* Added r_bin_get_object() to cache binary information
* Initial work in r_core_bin_load() - Integrating rabin2 inside core
This commit is contained in:
parent
afedad76bb
commit
e8f8e72896
13
TODO
13
TODO
|
@ -13,16 +13,15 @@ Questions
|
|||
* Add "pm ?" for bit print like in pb?
|
||||
* Only use uppercase KMG for Kilo,Mega,Giga in r_num?
|
||||
- 'g' is for double
|
||||
* Add support for float/double in r_num
|
||||
* Add support for float/double in r_num :?
|
||||
* in Visual Debugger mode cursor mode also scrolls O_o
|
||||
* distribute 'spp' with 'rarc2' ?
|
||||
* distribute 'spp' with 'rarc2' ? imho no
|
||||
* r2 -dls HANGS!!1
|
||||
* rarc2 allows to compile invalid code like calling puts() out of context
|
||||
* Add rabin2 .! calls into r_core api? r_core_rabin_import(core, "rIs") ?
|
||||
|
||||
0.6 RELEASE
|
||||
===========
|
||||
* Fix eflags string and str_bits
|
||||
* Create radare2-testsuite project
|
||||
- tests for ired, rax2, radare2, rabin2 ...
|
||||
|
||||
|
@ -61,11 +60,8 @@ TODO edu
|
|||
|
||||
TODO pancake
|
||||
------------
|
||||
* Embed RBin inside RCoreFile
|
||||
* Fix eflags string and str_bits
|
||||
* Implement DRX support
|
||||
* Record trace of register status for each function when running
|
||||
- r_reg_arena_copy();
|
||||
{
|
||||
* Implement RAnalCall (analyze function arguments, return values, propagate types..)
|
||||
- define number of arguments for given function
|
||||
- warn if signature and analysis differs in number of args or so..
|
||||
|
@ -74,7 +70,6 @@ TODO pancake
|
|||
- if they do not match: we need to warn/ask user/store multiple options
|
||||
- function signature comparsion if they dont match
|
||||
r_anal_fcn_cmp (anal, f1, f2);
|
||||
}
|
||||
|
||||
unassigned TODO pointz
|
||||
----------------------
|
||||
|
@ -122,6 +117,8 @@ Refactoring
|
|||
|
||||
0.7
|
||||
===
|
||||
* Record trace of register status for each function when running
|
||||
- r_reg_arena_copy();
|
||||
* Add lua and dalvik disassembler
|
||||
* Reimplement or fix the delta diffing in C
|
||||
- first we need to do it for ired..
|
||||
|
|
|
@ -194,9 +194,8 @@ static int rabin_show_relocs() {
|
|||
else eprintf ("[Relocations]\n");
|
||||
|
||||
r_list_foreach (relocs, iter, reloc) {
|
||||
if (rad) {
|
||||
printf ("f reloc.%s @ 0x%08"PFMT64x"\n", reloc->name, va?baddr+reloc->rva:reloc->offset);
|
||||
} else printf ("sym=%02i address=0x%08"PFMT64x" offset=0x%08"PFMT64x" type=0x%08x %s\n",
|
||||
if (rad) printf ("f reloc.%s @ 0x%08"PFMT64x"\n", reloc->name, va?baddr+reloc->rva:reloc->offset);
|
||||
else printf ("sym=%02i address=0x%08"PFMT64x" offset=0x%08"PFMT64x" type=0x%08x %s\n",
|
||||
reloc->sym, baddr+reloc->rva, reloc->offset, reloc->type, reloc->name);
|
||||
i++;
|
||||
}
|
||||
|
|
|
@ -391,3 +391,20 @@ R_API void r_bin_list_archs(RBin *bin) {
|
|||
R_API void r_bin_set_user_ptr(RBin *bin, void *user) {
|
||||
bin->user = user;
|
||||
}
|
||||
|
||||
R_API RBinObj *r_bin_get_object(RBin *bin, int flags) {
|
||||
RBinObj *obj = R_NEW (RBinObj);
|
||||
if (obj) {
|
||||
obj->symbols = r_bin_get_symbols (bin);
|
||||
obj->imports = r_bin_get_imports (bin);
|
||||
obj->entries = r_bin_get_entries (bin);
|
||||
obj->main = r_bin_get_main (bin);
|
||||
obj->baddr = r_bin_get_baddr (bin);
|
||||
}
|
||||
return obj;
|
||||
}
|
||||
|
||||
R_API void r_bin_object_free(RBinObj *obj) {
|
||||
// XXX: leak
|
||||
free (obj);
|
||||
}
|
||||
|
|
|
@ -218,11 +218,9 @@ static RBinInfo* info(RBinArch *arch) {
|
|||
ret->bits = Elf_(r_bin_elf_get_bits) (arch->bin_obj);
|
||||
ret->big_endian=Elf_(r_bin_elf_is_big_endian) (arch->bin_obj);
|
||||
ret->dbg_info = 0;
|
||||
if (!Elf_(r_bin_elf_get_stripped) (arch->bin_obj)) {
|
||||
ret->dbg_info |= 0x04;
|
||||
ret->dbg_info |= 0x08;
|
||||
ret->dbg_info |= 0x10;
|
||||
} else ret->dbg_info |= 0x01;
|
||||
if (!Elf_(r_bin_elf_get_stripped) (arch->bin_obj))
|
||||
ret->dbg_info |= 0x04 | 0x08 | 0x10
|
||||
else ret->dbg_info |= 0x01;
|
||||
if (Elf_(r_bin_elf_get_static) (arch->bin_obj))
|
||||
ret->dbg_info |= 0x02;
|
||||
return ret;
|
||||
|
|
|
@ -37,6 +37,30 @@ R_API void r_core_sysenv_update(RCore *core) {
|
|||
r_sys_setenv ("IOVA", r_config_get_i (core->config, "io.va")?"1":"0");
|
||||
}
|
||||
|
||||
R_API int r_core_bin_load(RCore *r, const char *file) {
|
||||
RBinObj *obj;
|
||||
|
||||
if (!r_bin_load (r->bin, file, 0))
|
||||
return R_FALSE;
|
||||
r->file->obj = obj = r_bin_get_object (r->bin, 0);
|
||||
#if 0
|
||||
RListIter *iter;
|
||||
RBinImport *import;
|
||||
RBinSection *section;
|
||||
r_list_foreach (obj->sections, iter, section) {
|
||||
printf ("ff %s\n", section->name);
|
||||
}
|
||||
r_list_foreach (obj->imports, iter, import) {
|
||||
printf ("ff %s\n", import->name);
|
||||
}
|
||||
r_list_foreach (obj->symbols, iter, symbol) {
|
||||
printf ("ff %s\n", symbol->name);
|
||||
}
|
||||
#endif
|
||||
// TODO: moar
|
||||
return R_TRUE;
|
||||
}
|
||||
|
||||
R_API RCoreFile *r_core_file_open(RCore *r, const char *file, int mode) {
|
||||
RCoreFile *fh;
|
||||
const char *cp;
|
||||
|
@ -57,8 +81,7 @@ R_API RCoreFile *r_core_file_open(RCore *r, const char *file, int mode) {
|
|||
fh->size = r_io_size (r->io, fd);
|
||||
list_add (&(fh->list), &r->files);
|
||||
|
||||
r_bin_load (r->bin, fh->filename, NULL);
|
||||
|
||||
r_core_bin_load (r, fh->filename);
|
||||
r_core_block_read (r, 0);
|
||||
|
||||
cp = r_config_get (r->config, "cmd.open");
|
||||
|
@ -70,6 +93,7 @@ R_API RCoreFile *r_core_file_open(RCore *r, const char *file, int mode) {
|
|||
|
||||
R_API int r_core_file_close(struct r_core_t *r, struct r_core_file_t *fh) {
|
||||
int ret = r_io_close (r->io, fh->fd);
|
||||
// TODO: free fh->obj
|
||||
list_del (&(fh->list));
|
||||
// TODO: set previous opened file as current one
|
||||
return ret;
|
||||
|
|
|
@ -176,6 +176,23 @@ typedef struct r_bin_write_t {
|
|||
int (*rpath_del)(RBinArch *arch);
|
||||
} RBinWrite;
|
||||
|
||||
typedef struct r_bin_obj_t {
|
||||
ut64 baddr;
|
||||
RList/*<RBinSection>*/ *sections;
|
||||
RList/*<RBinImport>*/ *imports;
|
||||
RList/*<RBinSymbol>*/ *symbols;
|
||||
RList/*<??>*/ *entries;
|
||||
RList/*<??>*/ *fields;
|
||||
RList/*<??>*/ *libs;
|
||||
RList/*<??>*/ *relocs;
|
||||
RList/*<??>*/ *strings;
|
||||
RBinInfo *info;
|
||||
RBinAddr *main;
|
||||
// TODO: deprecate r_bin_is_big_endian
|
||||
// TODO: r_bin_is_stripped .. wrapped inside rbinobj?
|
||||
// TODO: has_dbg_syms... maybe flags?
|
||||
} RBinObj;
|
||||
|
||||
#ifdef R_API
|
||||
|
||||
/* bin.c */
|
||||
|
@ -184,6 +201,7 @@ R_API int r_bin_xtr_add(RBin *bin, RBinXtrPlugin *foo);
|
|||
R_API void* r_bin_free(RBin *bin);
|
||||
R_API int r_bin_list(RBin *bin);
|
||||
R_API int r_bin_load(RBin *bin, const char *file, int dummy);
|
||||
R_API RBinObj *r_bin_get_object(RBin *bin, int flags);
|
||||
R_API ut64 r_bin_get_baddr(RBin *bin);
|
||||
R_API RBinAddr* r_bin_get_main(RBin *bin);
|
||||
R_API RList* r_bin_get_entries(RBin *bin);
|
||||
|
|
|
@ -57,6 +57,7 @@ typedef struct r_core_file_t {
|
|||
int rwx;
|
||||
int fd;
|
||||
int dbg;
|
||||
RBinObj *obj;
|
||||
struct list_head list;
|
||||
} RCoreFile;
|
||||
|
||||
|
|
Loading…
Reference in New Issue