mirror of
https://github.com/radareorg/radare2.git
synced 2025-02-27 09:35:49 +00:00
Fix #2642 - rabin2 -Aj and r2 -ciAj - JSON output for sub-bins
This commit is contained in:
parent
22c9b3f0fe
commit
e19810e875
@ -690,51 +690,39 @@ int main(int argc, char **argv) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
// XXX: TODO move this to libr/core/bin.c
|
||||
if (action & ACTION_LISTARCHS || ((arch || bits || arch_name) &&
|
||||
!r_bin_select (bin, arch, bits, arch_name))) {
|
||||
if (rad == R_CORE_BIN_JSON) {
|
||||
int i;
|
||||
printf ("[");
|
||||
for (i = 0; i < bin->narch; i++) {
|
||||
if (r_bin_select_idx (bin, bin->file, i)) {
|
||||
RBinObject *o = r_bin_cur_object (bin);
|
||||
RBinInfo *info = o ? o->info : NULL;
|
||||
printf ("%s{\"arch\":\"%s\",\"bits\":%d,"
|
||||
"\"offset\":%"PFMT64d",\"machine\":\"%s\"}",
|
||||
i?",":"",info->arch, info->bits,
|
||||
bin->cur->offset, info->machine);
|
||||
}
|
||||
}
|
||||
printf ("]");
|
||||
} else r_bin_list_archs (bin, 1);
|
||||
free (arch_name);
|
||||
}
|
||||
|
||||
#if 0
|
||||
// ASLR WTF
|
||||
if (laddr != 0LL) {
|
||||
//r_bin_set_baddr (bin, laddr);
|
||||
//bin->cur->o->baddr = laddr;
|
||||
}
|
||||
r_config_set_i (core.config, "bin.laddr", laddr);
|
||||
|
||||
core.bin = bin;
|
||||
filter.offset = at;
|
||||
filter.name = name;
|
||||
|
||||
r_cons_new ()->is_interactive = R_FALSE;
|
||||
|
||||
#endif
|
||||
#define isradjson (rad==R_CORE_BIN_JSON&&actions>0)
|
||||
#define run_action(n,x,y) {\
|
||||
if (action&x) {\
|
||||
if (isradjson) r_cons_printf ("\"%s\":",n);\
|
||||
if (isradjson) r_cons_printf ("%s\"%s\":",actions_done?",":"",n);\
|
||||
if (!r_core_bin_info (&core, y, rad, va, &filter, laddr, chksum)) {\
|
||||
if (isradjson) r_cons_printf ("false");\
|
||||
};\
|
||||
actions_done++;\
|
||||
if (isradjson) r_cons_printf (actions==actions_done? "":",");\
|
||||
}\
|
||||
}
|
||||
r_config_set_i (core.config, "bin.laddr", laddr);
|
||||
core.bin = bin;
|
||||
bin->printf = r_cons_printf;
|
||||
filter.offset = at;
|
||||
filter.name = name;
|
||||
r_cons_new ()->is_interactive = R_FALSE;
|
||||
|
||||
if (isradjson) r_cons_printf ("{");
|
||||
|
||||
// List fatmach0 sub-binaries, etc
|
||||
if (action & ACTION_LISTARCHS || ((arch || bits || arch_name) &&
|
||||
!r_bin_select (bin, arch, bits, arch_name))) {
|
||||
r_bin_list_archs (bin, (rad == R_CORE_BIN_JSON)? 'j': 1);
|
||||
actions_done++;
|
||||
free (arch_name);
|
||||
}
|
||||
if (action & ACTION_PDB_DWNLD) {
|
||||
int ret;
|
||||
char *env_pdbserver = r_sys_getenv ("PDB_SERVER");
|
||||
@ -777,19 +765,19 @@ int main(int argc, char **argv) {
|
||||
init_pdb_downloader (&opt, &pdb_downloader);
|
||||
ret = pdb_downloader.download (&pdb_downloader);
|
||||
if (isradjson) {
|
||||
printf ("{\"pdb\":{\"file\":\"%s\",\"download\":%s}}\n",
|
||||
opt.dbg_file, ret?"true":"false");
|
||||
printf ("%s\"pdb\":{\"file\":\"%s\",\"download\":%s}",
|
||||
actions_done?",":"", opt.dbg_file, ret?"true":"false");
|
||||
} else {
|
||||
printf ("PDB \"%s\" download %s\n",
|
||||
opt.dbg_file, ret? "success": "failed");
|
||||
}
|
||||
actions_done++;
|
||||
deinit_pdb_downloader (&pdb_downloader);
|
||||
|
||||
free (path);
|
||||
r_core_fini (&core);
|
||||
return 0;
|
||||
}
|
||||
if (isradjson) r_cons_printf ("{");
|
||||
run_action ("sections", ACTION_SECTIONS, R_CORE_BIN_ACC_SECTIONS);
|
||||
run_action ("entries", ACTION_ENTRIES, R_CORE_BIN_ACC_ENTRIES);
|
||||
run_action ("main", ACTION_MAIN, R_CORE_BIN_ACC_MAIN);
|
||||
|
@ -1512,7 +1512,6 @@ R_API void r_bin_list_archs(RBin *bin, int mode) {
|
||||
const char *name = binfile ? binfile->file : NULL;
|
||||
int narch = binfile ? binfile->narch : 0;
|
||||
|
||||
|
||||
Sdb *binfile_sdb = binfile ? binfile->sdb : NULL;
|
||||
if (!binfile_sdb) {
|
||||
eprintf ("Cannot find SDB!\n");
|
||||
@ -1523,11 +1522,13 @@ R_API void r_bin_list_archs(RBin *bin, int mode) {
|
||||
}
|
||||
sdb_unset (binfile_sdb, ARCHS_KEY, 0);
|
||||
|
||||
if (mode =='j') {
|
||||
bin->printf ("\"bins\":[");
|
||||
}
|
||||
RBinFile *nbinfile = r_bin_file_find_by_name_n (bin, name, i);
|
||||
if (!nbinfile) return;
|
||||
i = -1;
|
||||
r_list_foreach (nbinfile->objs, iter, obj){
|
||||
|
||||
r_list_foreach (nbinfile->objs, iter, obj) {
|
||||
RBinInfo *info = obj->info;
|
||||
char bits = info ? info->bits : 0;
|
||||
ut64 boffset = obj->boffset;
|
||||
@ -1535,36 +1536,57 @@ R_API void r_bin_list_archs(RBin *bin, int mode) {
|
||||
const char *arch = info ? info->arch : NULL;
|
||||
const char *machine = info ? info->machine : "unknown_machine";
|
||||
|
||||
++i;
|
||||
i++;
|
||||
if (!arch) {
|
||||
snprintf (unknown_, sizeof (unknown_), "unk_%d", i);
|
||||
arch = unknown_;
|
||||
}
|
||||
|
||||
if (info && narch > 1) {
|
||||
if (mode)
|
||||
printf ("%03i 0x%08"PFMT64x" %d %s_%i %s\n", i,
|
||||
boffset, obj_size, arch, bits, machine);
|
||||
|
||||
if (mode) {
|
||||
if (mode == 'j') {
|
||||
bin->printf ("%s{\"arch\":\"%s\",\"bits\":%d,"
|
||||
"\"offset\":%"PFMT64d",\"machine\":\"%s\"}",
|
||||
i?",":"",arch, bits,
|
||||
boffset, machine);
|
||||
} else {
|
||||
bin->printf ("%03i 0x%08"PFMT64x" %d %s_%i %s\n", i,
|
||||
boffset, obj_size, arch, bits, machine);
|
||||
}
|
||||
}
|
||||
snprintf (archline, sizeof (archline)-1,
|
||||
"0x%08"PFMT64x":%d:%s:%d:%s",
|
||||
boffset, obj_size, arch, bits, machine);
|
||||
"0x%08"PFMT64x":%d:%s:%d:%s",
|
||||
boffset, obj_size, arch, bits, machine);
|
||||
/// xxx machine not exported?
|
||||
//sdb_array_push (binfile_sdb, ARCHS_KEY, archline, 0);
|
||||
} else {
|
||||
if (info) {
|
||||
if (mode)
|
||||
printf ("%03i 0x%08"PFMT64x" %d %s_%d\n", i,
|
||||
boffset, obj_size, arch, bits);
|
||||
|
||||
if (mode) {
|
||||
if (mode == 'j') {
|
||||
bin->printf ("%s{\"arch\":\"%s\",\"bits\":%d,"
|
||||
"\"offset\":%"PFMT64d"}",
|
||||
i?",":"",arch, bits,
|
||||
boffset);
|
||||
} else {
|
||||
bin->printf ("%03i 0x%08"PFMT64x" %d %s_%d\n", i,
|
||||
boffset, obj_size, arch, bits);
|
||||
}
|
||||
}
|
||||
snprintf (archline, sizeof (archline),
|
||||
"0x%08"PFMT64x":%d:%s:%d",
|
||||
boffset, obj_size, arch, bits);
|
||||
} else if (nbinfile && mode) {
|
||||
if (mode)
|
||||
printf ("%03i 0x%08"PFMT64x" %d unk_0\n", i,
|
||||
boffset, obj_size);
|
||||
|
||||
if (mode) {
|
||||
if (mode == 'j') {
|
||||
bin->printf ("%s{\"arch\":\"unk_%d\",\"bits\":%d,"
|
||||
"\"offset\":%"PFMT64d",\"size\":%d}",
|
||||
i?",":"", i, bits,
|
||||
boffset, obj_size);
|
||||
} else {
|
||||
bin->printf ("%03i 0x%08"PFMT64x" %d unk_0\n", i,
|
||||
boffset, obj_size);
|
||||
}
|
||||
}
|
||||
snprintf (archline, sizeof (archline),
|
||||
"0x%08"PFMT64x":%d:%s:%d",
|
||||
boffset, obj_size, "unk", 0);
|
||||
@ -1574,6 +1596,9 @@ R_API void r_bin_list_archs(RBin *bin, int mode) {
|
||||
//sdb_array_push (binfile_sdb, ARCHS_KEY, archline, 0);
|
||||
}
|
||||
}
|
||||
if (mode =='j') {
|
||||
bin->printf ("]");
|
||||
}
|
||||
}
|
||||
|
||||
R_API void r_bin_set_user_ptr(RBin *bin, void *user) {
|
||||
|
@ -248,7 +248,16 @@ static int cmd_info(void *data, const char *input) {
|
||||
r_cons_printf ("\"%s\":",n); \
|
||||
}\
|
||||
r_core_bin_info (core,x,mode,va,NULL,offset,NULL);
|
||||
case 'A': newline=0; r_bin_list_archs (core->bin, 1); break;
|
||||
case 'A':
|
||||
newline = 0;
|
||||
if (input[1]=='j') {
|
||||
r_cons_printf ("{");
|
||||
r_bin_list_archs (core->bin, 'j');
|
||||
r_cons_printf ("}\n");
|
||||
} else {
|
||||
r_bin_list_archs (core->bin, 1);
|
||||
}
|
||||
break;
|
||||
case 'Z': RBININFO ("size",R_CORE_BIN_ACC_SIZE); break;
|
||||
case 'S': RBININFO ("sections",R_CORE_BIN_ACC_SECTIONS); break;
|
||||
case 'h': RBININFO ("fields", R_CORE_BIN_ACC_FIELDS); break;
|
||||
|
Loading…
x
Reference in New Issue
Block a user