* Add rax2 -x to calculate string hash

* Use trim to avoid noisy chars in symbol names for egg/lang
* Properly handle osx/w32 os strings in r_egg
* Make string construction works in r_egg
* Initial work on while() constructs
This commit is contained in:
pancake 2011-08-09 11:06:50 +02:00
parent 06e98dadb1
commit 168d38fc44
8 changed files with 83 additions and 22 deletions

View File

@ -5,10 +5,16 @@ all:
hello:
rm -f a.out
$R -s hello.r
$R -s hello.r | tee hello.s
$R -f mach0 -o a.out hello.r
-./a.out ; RET=$$? ; if [ $$RET = 0 ]; then echo It Works ; else echo Oops.. Fail ; fi
hi:
rm -f a.out
$R -s hi.r
$R -f mach0 -o a.out hi.r
-./a.out ; RET=$$? ; if [ $$RET = 0 ]; then echo It Works ; else echo Oops.. Fail ; fi
customsyscall:
rm -f a.out
$R -s customsyscall.r

View File

@ -3,7 +3,11 @@ write@syscall(4);
exit@syscall(1);
main@global(128) {
.var0 = "hi!\n";
write(1,.var0, 4);
exit(0);
.var0 = 4;
.var4 = "Hello World\n";
while (.var0) {
write (1, .var4, 12);
.var0 -= 1;
}
exit (0);
}

9
binr/ragg2/t/hi.r Normal file
View File

@ -0,0 +1,9 @@
/* hello world in r_egg */
write@syscall(4);
exit@syscall(1);
main@global(128) {
.var0 = "hi!\n";
write(1,.var0, 4);
exit(0);
}

View File

@ -1,7 +1,9 @@
BIN=rarun2
OBJ=main.o
all: ${OBJ}
all: ${BIN}
${BIN}: ${OBJ}
${CC} -o ${BIN} ${OBJ}
mrproper clean:

View File

@ -57,6 +57,7 @@ static int help () {
" -s hexstr -> bin ; rax2 -s 43 4a 50\n"
" -S bin -> hexstr ; rax2 -S C J P\n"
" -V version ; rax2 -V\n"
" -x hash string ; rax2 -x linux osx\n"
" -h help ; rax2 -h\n");
return R_TRUE;
}
@ -80,6 +81,9 @@ static int rax (char *str, int last) {
case 'b':
flags ^= 8;
break;
case 'x':
flags ^= 16;
break;
case 'V':
printf ("rax2 v"R2_VERSION"\n");
break;
@ -123,6 +127,11 @@ static int rax (char *str, int last) {
printf ("%c", buf[i]);
return R_TRUE;
}
if (flags & 16) {
int h = r_str_hash (str);
printf ("%s 0x%x\n", str, h);
return R_TRUE;
}
if (str[0]=='0' && str[1]=='x') {
out_mode = 'I';

View File

@ -92,6 +92,23 @@ static void emit_syscall_args(REgg *egg, int nargs) {
}
static void emit_set_string(REgg *egg, const char *dstvar, const char *str, int j) {
char *p, str2[64];
int i, oj = j;
for (i=4; i<oj; i+=4) {
/* XXX endian and 32/64bit issues */
int *n = (int *)(str+i-4);
p = r_egg_mkvar (egg, str2, dstvar, i);
if (attsyntax) r_egg_printf (egg, " movl $0x%x, %s\n", *n, p);
else r_egg_printf (egg, " mov %s, 0x%x\n", p, *n);
j -= 4;
}
p = r_egg_mkvar (egg, str2, dstvar, j);
if (attsyntax) r_egg_printf (egg, " lea %s, %%"R_AX"\n", p);
else r_egg_printf (egg, " lea "R_AX", %s\n", p);
p = r_egg_mkvar (egg, str2, dstvar, 0);
if (attsyntax) r_egg_printf (egg, " mov %%"R_AX", %s\n", p);
else r_egg_printf (egg, " mov %s, "R_AX"\n", p);
#if 0
char *p, str2[64];
int i, oj = j;
for (i=0; i<oj; i+=4) {
@ -108,6 +125,7 @@ static void emit_set_string(REgg *egg, const char *dstvar, const char *str, int
p = r_egg_mkvar (egg, str2, dstvar, 0);
if (attsyntax) r_egg_printf (egg, " mov %%"R_AX", %s\n", p);
else r_egg_printf (egg, " mov %s, "R_AX"\n", p);
#endif
}
static void emit_call(REgg *egg, const char *str, int atr) {
@ -159,15 +177,17 @@ static void emit_get_while_end (REgg *egg, char *str, const char *ctxpush, const
}
static void emit_while_end (REgg *egg, const char *labelback) {
#if 0
if (attsyntax) {
r_egg_printf (egg, " pop %%"R_AX"\n");
r_egg_printf (egg, " cmp $0, %%"R_AX"\n"); // XXX MUST SUPPORT != 0 COMPARE HERE
r_egg_printf (egg, " jnz %s\n", labelback);
} else {
#endif
r_egg_printf (egg, " pop "R_AX"\n");
r_egg_printf (egg, " test "R_AX", "R_AX"\n"); // XXX MUST SUPPORT != 0 COMPARE HERE
r_egg_printf (egg, " jnz %s\n", labelback);
}
// }
}
static void emit_get_var (REgg *egg, int type, char *out, int idx) {
@ -228,7 +248,7 @@ static void emit_branch(REgg *egg, char *b, char *g, char *e, char *n, int sz, c
arg = e+1;
op = "jne";
} else {
arg = "$0";
arg = attsyntax? "$0": "0";
if (n) op = "jnz";
else op ="jz";
}
@ -241,7 +261,7 @@ static void emit_branch(REgg *egg, char *b, char *g, char *e, char *n, int sz, c
r_egg_printf (egg, " cmp%c %s, %%"R_AX"\n", sz, p);
} else {
r_egg_printf (egg, " pop "R_AX"\n"); /* TODO: add support for more than one arg get arg0 */
r_egg_printf (egg, " cmp %s, "R_AX"\n", p);
r_egg_printf (egg, " cmp "R_AX", %s\n", p);
}
// if (context>0)
r_egg_printf (egg, " %s %s\n", op, dst);

View File

@ -1,4 +1,4 @@
/* radare - LGPL - Copyright 2011 pancake<@nopcode.org> */
/* radare - LGPL - Copyright 2010-2011 pancake<@nopcode.org> */
#include <r_egg.h>
@ -76,6 +76,16 @@ static const char *skipspaces(const char *s) {
return s;
}
static char *trim(char *s) {
char *o;
for (o=s; *s; s++)
if (isspace (*s)) {
*s = 0;
break;
}
return o;
}
#define SYNTAX_ATT 0
#if SYNTAX_ATT
#define FRAME_FMT ".LC%d_%d_frame%d"
@ -281,19 +291,20 @@ static void rcc_fun(REgg *egg, const char *str) {
char *ptr, *ptr2;
str = skipspaces (str);
if (context) {
ptr = strchr(str, '=');
ptr = strchr (str, '=');
if (ptr) {
*ptr = '\0';
free (dstvar);
dstvar = strdup (skipspaces (str));
ptr2 = (char *)skipspaces(ptr+1);
if (*ptr2)
callname = strdup (skipspaces (ptr+1));
if (*ptr2) {
callname = trim (strdup (skipspaces (ptr+1)));
}
} else {
str = skipspaces (str);
egg->emit->comment (egg, "rcc_fun %d (%s)", context, str);
free (callname);
callname = strdup (skipspaces (str));
callname = trim (strdup (skipspaces (str)));
egg->emit->comment (egg, "rcc_fun %d (%s)", context, callname);
}
} else {
ptr = strchr (str, '@');
@ -396,7 +407,7 @@ static int parsedatachar(REgg *egg, char c) {
/* capture value between parenthesis foo@data(NNN) { ... } */
if (c==')') {
stackframe = atoi (dstval);
ndstval=0;
ndstval = 0;
} else dstval[ndstval++] = c;
return 0;
}
@ -408,9 +419,7 @@ static int parsedatachar(REgg *egg, char c) {
slurp = 0;
mode = NORMAL;
/* register */
if (dstval == NULL || dstvar == NULL) {
eprintf ("FUCK FUCK\n");
} else {
if (dstval != NULL && dstvar != NULL) {
dstval[ndstval]='\0';
egg->emit->comment (egg, "data (%s)(%s)size=(%d)\n",
dstvar, dstval, stackframe);
@ -430,7 +439,7 @@ static int parsedatachar(REgg *egg, char c) {
ndstval = 0;
context = 0;
return 1;
}
} else eprintf ("FUCK FUCK\n");
}
}
dstval[ndstval++] = c;
@ -487,6 +496,7 @@ static void rcc_next(REgg *egg) {
docall = 1;
if (callname) {
callname = trim (callname);
char *str, *ptr = strchr (callname, '=');
if (ptr) {
*ptr = '\0';

View File

@ -52,6 +52,7 @@ R_API int r_syscall_setup(RSyscall *ctx, const char *arch, const char *os) {
// ignored
return R_TRUE;
}
// TODO: use r_str_hash.. like in r_egg
if (!strcmp (arch, "mips")) {
ctx->regs = fastcall_mips;
if (!strcmp (os, "linux"))
@ -66,7 +67,7 @@ R_API int r_syscall_setup(RSyscall *ctx, const char *arch, const char *os) {
if (!strcmp (os, "linux"))
ctx->sysptr = syscalls_linux_arm;
else
if (!strcmp (os, "macos") || !strcmp (os, "darwin"))
if (!strcmp (os, "macos") || !strcmp (os, "darwin") || !strcmp (os, "osx"))
ctx->sysptr = syscalls_darwin_arm;
else {
eprintf ("r_syscall_setup: Unknown OS '%s'\n", os);
@ -83,9 +84,9 @@ R_API int r_syscall_setup(RSyscall *ctx, const char *arch, const char *os) {
ctx->sysptr = syscalls_freebsd_x86;
else if (!strcmp (os, "openbsd"))
ctx->sysptr = syscalls_openbsd_x86;
else if ((!strcmp (os, "darwin")) || (!strcmp (os, "macos")))
else if ((!strcmp (os, "darwin")) || (!strcmp (os, "macos")) || (!strcmp (os, "osx")))
ctx->sysptr = syscalls_darwin_x86;
else if (!strcmp (os, "windows")) //win7
else if (!strcmp (os, "windows") || (!strcmp (os, "w32"))) //win7
ctx->sysptr = syscalls_win7_x86;
else {
eprintf ("r_syscall_setup: Unknown os '%s'\n", os);