mirror of
https://github.com/radareorg/radare2.git
synced 2024-10-07 10:33:30 +00:00
* Run callback when defining keys in config
- Add asm_arch and asm_parser callbacks * Run config_init at the end of core init * Do not force disassembler to be x86-only - Add the disassembler initialization in config - Detect invalid disassembling - Only parse when asm.pseudo is enabled
This commit is contained in:
parent
f3983d9316
commit
996f5ba9c4
@ -90,6 +90,8 @@ struct r_config_node_t *r_config_set_cb(struct r_config_t *cfg, const char *name
|
||||
struct r_config_node_t *node;
|
||||
node = r_config_set(cfg, name, value);
|
||||
node->callback = callback;
|
||||
if (node->callback)
|
||||
node->callback(cfg->user, node);
|
||||
return node;
|
||||
}
|
||||
|
||||
|
@ -340,20 +340,23 @@ static int cmd_print(void *data, const char *input)
|
||||
/* XXX hardcoded */
|
||||
int ret, idx;
|
||||
u8 *buf = core->block;
|
||||
u64 pseudo = r_config_get_i(&core->config, "asm.pseudo");
|
||||
int pseudo = (int)r_config_get_i(&core->config, "asm.pseudo");
|
||||
char str[128];
|
||||
struct r_asm_aop_t aop;
|
||||
r_asm_set_pc(&core->assembler, core->seek);
|
||||
r_asm_set(&core->assembler, "asm_x86");
|
||||
r_parse_set(&core->parser, "parse_x86_pseudo");
|
||||
|
||||
for(idx=ret=0; idx < len; idx+=ret) {
|
||||
r_asm_set_pc(&core->assembler, core->assembler.pc + ret);
|
||||
ret = r_asm_disassemble(&core->assembler, &aop, buf+idx, len-idx);
|
||||
r_parse_parse(&core->parser, aop.buf_asm, str);
|
||||
if (ret <1) {
|
||||
ret = 1;
|
||||
fprintf(stderr, "** invalid opcode at 0x%08llx **\n", core->assembler.pc + ret);
|
||||
}
|
||||
if (show_offset) r_cons_printf("0x%08llx ", core->seek + idx);
|
||||
if (show_bytes) r_cons_printf("%14s ", aop.buf_hex);
|
||||
r_cons_printf("%s\n", pseudo?str:aop.buf_asm);
|
||||
if (pseudo) {
|
||||
r_parse_parse(&core->parser, aop.buf_asm, str);
|
||||
r_cons_printf("%s\n", str);
|
||||
} else r_cons_printf("%s\n", aop.buf_asm);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
@ -2,6 +2,28 @@
|
||||
|
||||
#include <r_core.h>
|
||||
|
||||
int config_asm_arch_callback(void *user, void *data)
|
||||
{
|
||||
struct r_core_t *core = (struct r_core_t *) user;
|
||||
struct r_config_node_t *node = (struct r_config_node_t *) data;
|
||||
char buf[128];
|
||||
snprintf(buf, 127, "asm_%s", node->value),
|
||||
r_asm_set(&core->assembler, buf);
|
||||
// TODO: control error and restore old value (return false?) show errormsg?
|
||||
return R_TRUE;
|
||||
}
|
||||
|
||||
int config_asm_parser_callback(void *user, void *data)
|
||||
{
|
||||
struct r_core_t *core = (struct r_core_t *) user;
|
||||
struct r_config_node_t *node = (struct r_config_node_t *) data;
|
||||
char buf[128];
|
||||
snprintf(buf, 127, "parse_%s", node->value),
|
||||
r_asm_set(&core->assembler, buf);
|
||||
// TODO: control error and restore old value (return false?) show errormsg?
|
||||
return R_TRUE;
|
||||
}
|
||||
|
||||
int config_color_callback(void *user, void *data)
|
||||
{
|
||||
struct r_core_t *core = (struct r_core_t *) user;
|
||||
@ -22,10 +44,17 @@ int r_core_config_init(struct r_core_t *core)
|
||||
{
|
||||
struct r_config_t *cfg = &core->config;
|
||||
r_config_init(cfg, (void *)core);
|
||||
r_config_set(cfg, "asm.arch", "x86");
|
||||
|
||||
r_config_set_cb(cfg, "asm.arch", "x86",
|
||||
&config_asm_arch_callback);
|
||||
|
||||
r_parse_set(&core->parser, "parse_x86_pseudo");
|
||||
r_config_set_cb(cfg, "asm.parser", "x86_pseudo",
|
||||
&config_asm_parser_callback);
|
||||
|
||||
r_config_set(cfg, "asm.syntax", "intel");
|
||||
r_config_set_i(cfg, "asm.bits", 32);
|
||||
r_config_set(cfg, "asm.syntax", "x86");
|
||||
r_config_set(cfg, "asm.pseudo", "false");
|
||||
r_config_set(cfg, "asm.pseudo", "false"); // DEPRECATED ???
|
||||
r_config_set(cfg, "asm.bytes", "true");
|
||||
r_config_set(cfg, "asm.offset", "true");
|
||||
r_config_set(cfg, "asm.os", "linux");
|
||||
|
@ -132,6 +132,7 @@ int r_core_init(struct r_core_t *core)
|
||||
r_anal_init(&core->anal);
|
||||
r_anal_set_user_ptr(&core->anal, core);
|
||||
r_asm_init(&core->assembler);
|
||||
r_asm_set(&core->assembler, "asm_x86"); // XXX should be done by r_asm on init?
|
||||
r_asm_set_user_ptr(&core->assembler, core);
|
||||
r_parse_init(&core->parser);
|
||||
r_parse_set_user_ptr(&core->parser, core);
|
||||
@ -151,7 +152,6 @@ int r_core_init(struct r_core_t *core)
|
||||
core->blocksize = R_CORE_BLOCKSIZE;
|
||||
core->block = (u8*)malloc(R_CORE_BLOCKSIZE);
|
||||
r_core_cmd_init(core);
|
||||
r_core_config_init(core);
|
||||
r_flag_init(&core->flags);
|
||||
r_debug_init(&core->dbg);
|
||||
r_lib_init(&core->lib, "radare_plugin");
|
||||
@ -175,6 +175,7 @@ int r_core_init(struct r_core_t *core)
|
||||
r_lib_opendir(&core->lib, homeplugindir);
|
||||
free(homeplugindir);
|
||||
}
|
||||
r_core_config_init(core);
|
||||
// XXX fix path here
|
||||
return 0;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user