- Add flag '-m [addr]' to show source line at addr
* r_core
  - Add env 'asm.symreplace' to replace offset by flag name
* r_debug
  - Fix segmentation fault
* r_parse
  - Add r_parse_symreplace to replace offset by its flag name
This commit is contained in:
Nibble 2010-03-19 02:49:30 +01:00
parent d3e6e6f2ec
commit 456976cc40
10 changed files with 86 additions and 40 deletions

View File

@ -26,6 +26,7 @@
#define ACTION_STRINGS 0x0080
#define ACTION_FIELDS 0x0100
#define ACTION_LIBS 0x0200
#define ACTION_SRCLINE 0x0400
static struct r_lib_t l;
static struct r_bin_t *bin = NULL;
@ -50,7 +51,7 @@ static int rabin_show_help() {
" -f [format] Override file format autodetection\n"
" -r radare output\n"
" -v Use vaddr in radare output\n"
" -w Open file in rw mode\n"
" -m [addr] Show source line at addr\n"
" -L List supported bin plugins\n"
" -@ [addr] Show section, symbol or import at addr\n"
" -V Show version information\n"
@ -486,6 +487,16 @@ static int rabin_do_operation(const char *op) {
return R_TRUE;
}
static int rabin_show_srcline(ut64 at) {
char *srcline;
if ((srcline = r_bin_meta_get_source_line (bin, at))) {
printf ("%s\n", srcline);
free (srcline);
return R_TRUE;
}
return R_FALSE;
}
/* bin callback */
static int __lib_bin_cb(struct r_lib_plugin_t *pl, void *user, void *data) {
struct r_bin_handle_t *hand = (struct r_bin_handle_t *)data;
@ -518,9 +529,11 @@ int main(int argc, char **argv)
r_lib_opendir (&l, LIBDIR"/radare2/");
}
while ((c = getopt (argc, argv, "@:VisSzIHelwO:o:f:rvLh")) != -1)
{
while ((c = getopt (argc, argv, "m:@:VisSzIHelwO:o:f:rvLh")) != -1) {
switch(c) {
case 'm':
at = r_num_math (NULL, optarg);
action |= ACTION_SRCLINE;
case 'i':
action |= ACTION_IMPORTS;
break;
@ -608,6 +621,8 @@ int main(int argc, char **argv)
rabin_show_fields();
if (action&ACTION_LIBS)
rabin_show_libs();
if (action&ACTION_SRCLINE)
rabin_show_srcline(at);
if (op != NULL && action&ACTION_OPERATION)
rabin_do_operation (op);

View File

@ -705,6 +705,7 @@ static int cmd_print(void *data, const char *input) {
int linesout = r_config_get_i (&core->config, "asm.linesout");
int show_comments = r_config_get_i (&core->config, "asm.comments");
int pseudo = r_config_get_i (&core->config, "asm.pseudo");
int symreplace = r_config_get_i (&core->config, "asm.symreplace");
int linesopts = 0;
if (r_config_get_i (&core->config, "asm.linesstyle"))
@ -807,6 +808,9 @@ static int cmd_print(void *data, const char *input) {
if (pseudo) {
r_parse_parse (&core->parser, asmop.buf_asm, str);
opstr = str;
} else if (symreplace) {
r_parse_symreplace (&core->parser, &core->flags, asmop.buf_asm, str);
opstr = str;
} else opstr = asmop.buf_asm;
r_cons_strcat (opstr);
if (show_color)

View File

@ -136,6 +136,7 @@ R_API int r_core_config_init(RCore *core) {
r_config_set_i_cb (cfg, "asm.bits", 32,
&config_asm_bits_callback);
r_config_set (cfg, "asm.pseudo", "false"); // DEPRECATED ???
r_config_set (cfg, "asm.symreplace", "false");
r_config_set (cfg, "asm.bytes", "true");
r_config_set (cfg, "asm.offset", "true");
r_config_set (cfg, "asm.lines", "true");

View File

@ -76,7 +76,7 @@ R_API ut64 r_debug_reg_get(struct r_debug_t *dbg, const char *name) {
int role = r_reg_get_name_idx (name);
if (role != -1) {
name = r_reg_get_name (dbg->reg, role);
if (name == NULL && *name == '\0') {
if (name == NULL || *name == '\0') {
eprintf ("Cannot resolve name for register role '%s'.\n", name);
}
}

View File

@ -53,10 +53,12 @@ R_API RFlagItem *r_flag_list(RFlag *f, int rad) {
struct list_head *pos;
list_for_each_prev (pos, &f->flags) {
RFlagItem *flag = list_entry (pos, RFlagItem, list);
if ((f->space_idx != -1) && (flag->space != f->space_idx))
continue;
if (rad) r_cons_printf ("f %s %lld @ 0x%08llx\n",
flag->name, flag->size, flag->offset);
flag->name, flag->size, flag->offset);
else r_cons_printf("0x%08llx %lld %s\n",
flag->offset, flag->size, flag->name);
flag->offset, flag->size, flag->name);
}
return NULL;
}

View File

@ -25,12 +25,14 @@ void flag_space_init(struct r_flag_t *f)
R_API void r_flag_space_set(struct r_flag_t *f, const char *name)
{
int i;
if (name == NULL)
name = "noname";
if (name == NULL || *name == '*') {
f->space_idx = -1;
return;
}
for(i=0;i<R_FLAG_SPACES_MAX;i++) {
for (i=0;i<R_FLAG_SPACES_MAX;i++) {
if (f->space[i] != NULL)
if (!strcmp(name, f->space[i])) {
if (!strcmp (name, f->space[i])) {
f->space_idx = i; //flag_space_idx = i;
return;
}
@ -38,7 +40,7 @@ R_API void r_flag_space_set(struct r_flag_t *f, const char *name)
/* not found */
for(i=0;i<R_FLAG_SPACES_MAX;i++) {
if (f->space[i] == NULL) {
f->space[i] = strdup(name);
f->space[i] = strdup (name);
f->space_idx = i;
break;
}

View File

@ -4,6 +4,7 @@
#define _INCLUDE_R_PARSE_H_
#include <r_types.h>
#include <r_flags.h>
#include <list.h>
// XXX : remove this define???
@ -22,6 +23,7 @@ typedef struct r_parse_handle_t {
int (*fini)(void *user);
int (*parse)(struct r_parse_t *p, void *data, char *str);
int (*assemble)(struct r_parse_t *p, char *data, char *str);
int (*symreplace)(struct r_parse_t *p, struct r_flag_t *f, char *data, char *str);
struct list_head list;
} RParseHandle;
@ -35,5 +37,11 @@ R_API int r_parse_list(struct r_parse_t *p);
R_API int r_parse_use(struct r_parse_t *p, const char *name);
R_API int r_parse_parse(struct r_parse_t *p, void *data, char *str);
R_API int r_parse_assemble(struct r_parse_t *p, char *data, char *str);
R_API int r_parse_symreplace(struct r_parse_t *p, struct r_flag_t *f, char *data, char *str);
/* plugin pointers */
extern struct r_parse_handle_t r_parse_plugin_dummy;
extern struct r_parse_handle_t r_parse_plugin_x86_pseudo;
extern struct r_parse_handle_t r_parse_plugin_mreplace;
#endif

View File

@ -1,5 +1,5 @@
NAME=r_parse
DEPS=r_lib
DEPS=r_lib r_flags r_util
-include ../config.mk
foo: pre libr_parse.${EXT_SO} libr_parse.${EXT_AR} plugins bins

View File

@ -5,6 +5,8 @@
#include <string.h>
#include <r_lib.h>
#include <r_util.h>
#include <r_flags.h>
#include <r_parse.h>
static int replace(int argc, const char *argv[], char *newstr)
@ -135,13 +137,34 @@ static int assemble(struct r_parse_t *p, void *data, char *str)
return R_TRUE;
}
static int symreplace(struct r_parse_t *p, struct r_flag_t *f, char *data, char *str)
{
struct list_head *pos;
char *ptr;
ut64 off;
if ((ptr = strstr (data, "0x"))) {
off = r_num_math (NULL, ptr);
list_for_each_prev (pos, &f->flags) {
RFlagItem *flag = list_entry (pos, RFlagItem, list);
if (flag->offset == off) {
*ptr = 0;
sprintf (str, "%s%s", data, flag->name);
return R_TRUE;
}
}
}
strcpy (str, data);
return R_FALSE;
}
struct r_parse_handle_t r_parse_plugin_x86_pseudo = {
.name = "x86.pseudo",
.desc = "X86 pseudo syntax",
.init = NULL,
.fini = NULL,
.parse = &parse,
.assemble = (void *)&assemble,
.assemble = &assemble,
.symreplace = &symreplace,
};
struct r_lib_struct_t radare_plugin = {

View File

@ -7,27 +7,19 @@
#include <list.h>
#include "../config.h"
/* plugin pointers */
extern struct r_parse_handle_t r_parse_plugin_dummy;
extern struct r_parse_handle_t r_parse_plugin_x86_pseudo;
extern struct r_parse_handle_t r_parse_plugin_mreplace;
static struct r_parse_handle_t *parse_static_plugins[] =
{ R_PARSE_STATIC_PLUGINS };
R_API struct r_parse_t *r_parse_new()
{
R_API struct r_parse_t *r_parse_new() {
struct r_parse_t *p = R_NEW(struct r_parse_t);
return r_parse_init(p);
}
R_API void r_parse_free(struct r_parse_t *p)
{
R_API void r_parse_free(struct r_parse_t *p) {
free(p);
}
R_API struct r_parse_t *r_parse_init(struct r_parse_t *p)
{
R_API struct r_parse_t *r_parse_init(struct r_parse_t *p) {
if (p) {
int i;
p->user = NULL;
@ -38,21 +30,18 @@ R_API struct r_parse_t *r_parse_init(struct r_parse_t *p)
return p;
}
R_API void r_parse_set_user_ptr(struct r_parse_t *p, void *user)
{
R_API void r_parse_set_user_ptr(struct r_parse_t *p, void *user) {
p->user = user;
}
R_API int r_parse_add(struct r_parse_t *p, struct r_parse_handle_t *foo)
{
R_API int r_parse_add(struct r_parse_t *p, struct r_parse_handle_t *foo) {
if (foo->init)
foo->init(p->user);
list_add_tail(&(foo->list), &(p->parsers));
return R_TRUE;
}
R_API int r_parse_list(struct r_parse_t *p)
{
R_API int r_parse_list(struct r_parse_t *p) {
struct list_head *pos;
list_for_each_prev(pos, &p->parsers) {
struct r_parse_handle_t *h = list_entry(pos, struct r_parse_handle_t, list);
@ -61,8 +50,7 @@ R_API int r_parse_list(struct r_parse_t *p)
return R_FALSE;
}
R_API int r_parse_use(struct r_parse_t *p, const char *name)
{
R_API int r_parse_use(struct r_parse_t *p, const char *name) {
struct list_head *pos;
list_for_each_prev(pos, &p->parsers) {
struct r_parse_handle_t *h = list_entry(pos, struct r_parse_handle_t, list);
@ -74,8 +62,7 @@ R_API int r_parse_use(struct r_parse_t *p, const char *name)
return R_FALSE;
}
R_API int r_parse_assemble(struct r_parse_t *p, char *data, char *str)
{
R_API int r_parse_assemble(struct r_parse_t *p, char *data, char *str) {
int ret = R_FALSE;
char *in = strdup(str);
char *s, *o;
@ -101,10 +88,14 @@ R_API int r_parse_assemble(struct r_parse_t *p, char *data, char *str)
return ret;
}
R_API int r_parse_parse(struct r_parse_t *p, void *data, char *str)
{
register int ret = R_FALSE;
if (p->cur && p->cur->parse)
ret = p->cur->parse(p, data, str);
return ret;
R_API int r_parse_symreplace(struct r_parse_t *p, struct r_flag_t *f, char *data, char *str) {
if (p->cur && p->cur->symreplace)
return p->cur->symreplace(p, f, data, str);
return R_FALSE;
}
R_API int r_parse_parse(struct r_parse_t *p, void *data, char *str) {
if (p->cur && p->cur->parse)
return p->cur->parse(p, data, str);
return R_FALSE;
}