Fix conversion from GDB register profile to rizin profile
This commit is contained in:
parent
e7eae14ea1
commit
d6196703d8
4 changed files with 26 additions and 9 deletions
|
|
@ -15,6 +15,13 @@ typedef struct {
|
|||
#define UNSUPPORTED 0
|
||||
#define SUPPORTED 1
|
||||
|
||||
#define PROC_NAME_SZ 1024
|
||||
#define PROC_REGION_SZ 100
|
||||
// PROC_REGION_SZ - 2 (used for `0x`). Due to how RZ_STR_DEF works this can't be
|
||||
// computed.
|
||||
#define PROC_REGION_LEFT_SZ 98
|
||||
#define PROC_PERM_SZ 5
|
||||
|
||||
typedef struct rz_debug_gdb_ctx_t {
|
||||
RzIOGdb **origrziogdb;
|
||||
libgdbr_t *desc;
|
||||
|
|
@ -189,7 +196,7 @@ static RzList /*<RzDebugMap *>*/ *rz_debug_gdb_map_get(RzDebug *dbg) { // TODO
|
|||
int unk = 0, perm, i;
|
||||
char *ptr, *pos_1;
|
||||
size_t line_len;
|
||||
char name[1024], region1[100], region2[100], perms[5];
|
||||
char name[PROC_NAME_SZ + 1], region1[PROC_REGION_SZ + 1], region2[PROC_REGION_SZ + 1], perms[PROC_PERM_SZ + 1];
|
||||
RzDebugMap *map = NULL;
|
||||
region1[0] = region2[0] = '0';
|
||||
region1[1] = region2[1] = 'x';
|
||||
|
|
@ -213,8 +220,8 @@ static RzList /*<RzDebugMap *>*/ *rz_debug_gdb_map_get(RzDebug *dbg) { // TODO
|
|||
}
|
||||
// We assume Linux target, for now, so -
|
||||
// 7ffff7dda000-7ffff7dfd000 r-xp 00000000 08:05 265428 /usr/lib/ld-2.25.so
|
||||
ret = sscanf(ptr, "%s %s %" PFMT64x " %*s %*s %[^\n]", ®ion1[2],
|
||||
perms, &offset, name);
|
||||
ret = sscanf(ptr, "%" RZ_STR_DEF(PROC_REGION_LEFT_SZ) "s %" RZ_STR_DEF(PROC_PERM_SZ) "s %" PFMT64x " %*s %*s %" RZ_STR_DEF(PROC_NAME_SZ) "[^\n]",
|
||||
®ion1[2], perms, &offset, name);
|
||||
if (ret == 3) {
|
||||
name[0] = '\0';
|
||||
} else if (ret != 4) {
|
||||
|
|
|
|||
|
|
@ -4,6 +4,9 @@
|
|||
#include <rz_io.h>
|
||||
#include <rz_debug.h>
|
||||
|
||||
#define IO_MAPS_PERM_SZ 32
|
||||
#define IO_MAPS_NAME_SZ 512
|
||||
|
||||
static int __io_step(RzDebug *dbg) {
|
||||
free(dbg->iob.system(dbg->iob.io, "ds"));
|
||||
return true;
|
||||
|
|
@ -23,8 +26,8 @@ static RzList /*<RzDebugMap *>*/ *__io_maps(RzDebug *dbg) {
|
|||
}
|
||||
char *ostr = str;
|
||||
ut64 map_start, map_end;
|
||||
char perm[32];
|
||||
char name[512];
|
||||
char perm[IO_MAPS_PERM_SZ + 1];
|
||||
char name[IO_MAPS_NAME_SZ + 1];
|
||||
for (;;) {
|
||||
char *nl = strchr(str, '\n');
|
||||
if (nl) {
|
||||
|
|
@ -48,7 +51,7 @@ static RzList /*<RzDebugMap *>*/ *__io_maps(RzDebug *dbg) {
|
|||
if (_s_) {
|
||||
memmove(_s_, _s_ + 2, strlen(_s_));
|
||||
}
|
||||
sscanf(str, "0x%" PFMT64x " - 0x%" PFMT64x " %s %s",
|
||||
sscanf(str, "0x%" PFMT64x " - 0x%" PFMT64x " %" RZ_STR_DEF(IO_MAPS_PERM_SZ) "s %" RZ_STR_DEF(IO_MAPS_NAME_SZ) "s",
|
||||
&map_start, &map_end, perm, name);
|
||||
if (map_end != 0LL) {
|
||||
RzDebugMap *map = rz_debug_map_new(name, map_start, map_end, rz_str_rwx(perm), 0);
|
||||
|
|
|
|||
|
|
@ -214,4 +214,7 @@ typedef struct _utX {
|
|||
return m ? *m = n, m : m; \
|
||||
}
|
||||
|
||||
#define RZ_STR_DEF(s) RZ_STR(s)
|
||||
#define RZ_STR(s) #s
|
||||
|
||||
#endif // RZ_TYPES_BASE_H
|
||||
|
|
|
|||
|
|
@ -10,6 +10,10 @@
|
|||
#include <rz_lib.h>
|
||||
#include <string.h>
|
||||
|
||||
#define GDB_NAME_SZ 16
|
||||
#define GDB_TYPE_SZ 16
|
||||
#define GDB_GROUPS_SZ 128
|
||||
|
||||
static void rz_reg_profile_def_free(RzRegProfileDef *def) {
|
||||
if (!def) {
|
||||
return;
|
||||
|
|
@ -511,7 +515,7 @@ static char *gdb_to_rz_profile(const char *gdb) {
|
|||
return NULL;
|
||||
}
|
||||
char *ptr1, *gptr, *gptr1;
|
||||
char name[16], groups[128], type[16];
|
||||
char name[GDB_NAME_SZ + 1], groups[GDB_GROUPS_SZ + 1], type[GDB_TYPE_SZ + 1];
|
||||
const int all = 1, gpr = 2, save = 4, restore = 8, float_ = 16,
|
||||
sse = 32, vector = 64, system = 128, mmx = 256;
|
||||
int number, rel, offset, size, type_bits, ret;
|
||||
|
|
@ -542,8 +546,8 @@ static char *gdb_to_rz_profile(const char *gdb) {
|
|||
rz_strbuf_free(sb);
|
||||
return false;
|
||||
}
|
||||
ret = sscanf(ptr, " %s %d %d %d %d %s %s", name, &number, &rel,
|
||||
&offset, &size, type, groups);
|
||||
ret = sscanf(ptr, " %" RZ_STR_DEF(GDB_NAME_SZ) "s %d %d %d %d %" RZ_STR_DEF(GDB_TYPE_SZ) "s %" RZ_STR_DEF(GDB_GROUPS_SZ) "s",
|
||||
name, &number, &rel, &offset, &size, type, groups);
|
||||
// Groups is optional, others not
|
||||
if (ret < 6) {
|
||||
if (*ptr != '*') {
|
||||
|
|
|
|||
Loading…
Reference in a new issue