Rizin
unix-like reverse engineering framework and cli tools
rz_libdemangle.h File Reference

Go to the source code of this file.

Functions

RZ_API char * libdemangle_handler_java (const char *symbol)
 Demangles java classes/methods/fields. More...
 
RZ_API char * libdemangle_handler_msvc (const char *symbol)
 
RZ_API char * libdemangle_handler_objc (const char *symbol)
 

Function Documentation

◆ libdemangle_handler_java()

RZ_API char* libdemangle_handler_java ( const char *  mangled)

Demangles java classes/methods/fields.

Demangles java classes/methods/fields

Supported formats:

  • Lsome/class/Object; some.class.Object.myField
  • F float
  • Lsome/class/Object;.myField.I some.class.Object.myField:int
  • myField.I myField:int
  • Lsome/class/Object;.myMethod([F)I int some.class.Object.myMethod(float[])

Definition at line 260 of file java.c.

260  {
261  if (!mangled) {
262  return NULL;
263  }
264 
265  char *name = NULL;
266  char *arguments = NULL;
267  char *return_type = NULL;
268 
269  name = strdup(mangled);
270  if (!name) {
271  return NULL;
272  }
273 
274  name = dem_str_replace(name, "java/lang/", "", 1);
275  if ((arguments = strchr(name, '(')) && (return_type = strchr(arguments, ')'))) {
276  return demangle_method(name, arguments, return_type);
277  } else if (name[0] == 'L' && (arguments = strchr(name, '.'))) {
278  return demangle_class_object(name, arguments);
279  } else if ((arguments = strchr(name, '.'))) {
280  return demangle_object_with_type(name, arguments);
281  }
282  return demangle_any(name);
283 }
#define NULL
Definition: cris-opc.c:27
char * dem_str_replace(char *str, const char *key, const char *val, int g)
static char * demangle_class_object(char *object, char *name)
Definition: java.c:162
static char * demangle_object_with_type(char *name, char *object)
Definition: java.c:204
static char * demangle_any(char *mangled)
Definition: java.c:231
static char * demangle_method(char *name, char *arguments, char *return_type)
Definition: java.c:105
return strdup("=SP r13\n" "=LR r14\n" "=PC r15\n" "=A0 r0\n" "=A1 r1\n" "=A2 r2\n" "=A3 r3\n" "=ZF zf\n" "=SF nf\n" "=OF vf\n" "=CF cf\n" "=SN or0\n" "gpr lr .32 56 0\n" "gpr pc .32 60 0\n" "gpr cpsr .32 64 0 ____tfiae_________________qvczn\n" "gpr or0 .32 68 0\n" "gpr tf .1 64.5 0 thumb\n" "gpr ef .1 64.9 0 endian\n" "gpr jf .1 64.24 0 java\n" "gpr qf .1 64.27 0 sticky_overflow\n" "gpr vf .1 64.28 0 overflow\n" "gpr cf .1 64.29 0 carry\n" "gpr zf .1 64.30 0 zero\n" "gpr nf .1 64.31 0 negative\n" "gpr itc .4 64.10 0 if_then_count\n" "gpr gef .4 64.16 0 great_or_equal\n" "gpr r0 .32 0 0\n" "gpr r1 .32 4 0\n" "gpr r2 .32 8 0\n" "gpr r3 .32 12 0\n" "gpr r4 .32 16 0\n" "gpr r5 .32 20 0\n" "gpr r6 .32 24 0\n" "gpr r7 .32 28 0\n" "gpr r8 .32 32 0\n" "gpr r9 .32 36 0\n" "gpr r10 .32 40 0\n" "gpr r11 .32 44 0\n" "gpr r12 .32 48 0\n" "gpr r13 .32 52 0\n" "gpr r14 .32 56 0\n" "gpr r15 .32 60 0\n" "gpr r16 .32 64 0\n" "gpr r17 .32 68 0\n")
Definition: z80asm.h:102

References dem_str_replace(), demangle_any(), demangle_class_object(), demangle_method(), demangle_object_with_type(), NULL, and strdup().

Referenced by rz_demangler_java().

◆ libdemangle_handler_msvc()

RZ_API char* libdemangle_handler_msvc ( const char *  symbol)

Definition at line 6 of file msvc.c.

6  {
7  char *out = NULL;
8  SDemangler *mangler = 0;
9 
10  create_demangler(&mangler);
11  if (!mangler) {
12  return NULL;
13  }
14  if (init_demangler(mangler, (char *)str) == eDemanglerErrOK) {
15  mangler->demangle(mangler, &out /*demangled_name*/);
16  }
17  free_demangler(mangler);
18  return out;
19 }
const lzma_allocator const uint8_t size_t uint8_t * out
Definition: block.h:528
@ eDemanglerErrOK
if all is OK
Demangler object.
demangle_func demangle
function that will use for demangling
void free_demangler(SDemangler *demangler)
Deallocate demangler object.
Definition: demangler.c:96
EDemanglerErr init_demangler(SDemangler *demangler, char *sym)
Initialize object of demangler.
Definition: demangler.c:56
EDemanglerErr create_demangler(SDemangler **demangler)
Create object of demangler.
Definition: demangler.c:38

References create_demangler(), SDemangler::demangle, eDemanglerErrOK, free_demangler(), init_demangler(), NULL, out, and cmd_descs_generate::str.

Referenced by rz_demangler_msvc().

◆ libdemangle_handler_objc()

RZ_API char* libdemangle_handler_objc ( const char *  symbol)

Definition at line 6 of file objc.c.

6  {
7  char *ret = NULL;
8  char *clas = NULL;
9  char *name = NULL;
10  char *args = NULL;
11  int i, nargs = 0;
12  const char *type = NULL;
13  if (!sym) {
14  return NULL;
15  }
16 
17  /* classes */
18  if (!strncmp(sym, "_OBJC_Class_", 12)) {
19  const char *className = sym + 12;
20  ret = dem_str_newf("class %s", className);
21  return ret;
22  } else if (!strncmp(sym, "_OBJC_CLASS_$_", 14)) {
23  const char *className = sym + 14;
24  ret = dem_str_newf("class %s", className);
25  return ret;
26  }
27  if (!strncmp(sym, "_OBJC_IVAR_$_", 13)) {
28  /* fields */
29  clas = strdup(sym + 13);
30  char *p = strchr(clas, '.');
31  type = "field";
32  if (p) {
33  *p = 0;
34  name = strdup(p + 1);
35  } else {
36  name = NULL;
37  }
38  } else if (sym[0] && sym[1] == '[') { // apple style
39  /* methods */
40  if (sym[0] == '+') {
41  type = "static";
42  } else if (sym[0] == '-') {
43  type = "public";
44  }
45  if (type) {
46  free(clas);
47  clas = strdup(sym + 2);
48  name = strchr(clas, ' ');
49  if (name) {
50  *name++ = 0;
51  name = strdup(name);
52  if (!name) {
53  free(clas);
54  return NULL;
55  }
56  for (i = 0; name[i]; i++) {
57  if (name[i] == ']') {
58  name[i] = 0;
59  }
60  if (name[i] == ':') {
61  nargs++;
62  name[i] = 0;
63  }
64  }
65  }
66  }
67  }
68  if (sym[0] == '_' && sym[1] && sym[2] == '_') { // gnu style
69  free(clas);
70  clas = strdup(sym + 3);
71  args = strstr(clas, "__");
72  if (!args) {
73  free(clas);
74  if (name != clas) {
75  free(name);
76  }
77  return NULL;
78  }
79  *args = 0;
80  free(name);
81  name = strdup(args + 2);
82  if (!name) {
83  free(clas);
84  return NULL;
85  }
86  args = NULL;
87  for (i = 0; name[i]; i++) {
88  if (name[i] == '_') {
89  name[i] = 0;
90  nargs++;
91  }
92  }
93  if (sym[1] == 'i') {
94  type = "public";
95  } else if (sym[1] == 'c') {
96  type = "static";
97  }
98  }
99  if (type) {
100  if (!strcmp(type, "field")) {
101  ret = dem_str_newf("field int %s::%s", clas, name);
102  } else {
103  if (nargs) {
104  const char *arg = "int";
105  args = malloc(((strlen(arg) + 4) * nargs) + 1);
106  args[0] = 0;
107  for (i = 0; i < nargs; i++) {
108  strcat(args, arg);
109  if (i + 1 < nargs) {
110  strcat(args, ", ");
111  }
112  }
113  } else {
114  args = strdup("");
115  }
116  if (type && name && *name) {
117  ret = dem_str_newf("%s int %s::%s(%s)", type, clas, name, args);
118  }
119  }
120  }
121  free(clas);
122  free(args);
123  free(name);
124  return ret;
125 }
lzma_index ** i
Definition: index.h:629
char * dem_str_newf(const char *fmt,...)
RZ_API void Ht_() free(HtName_(Ht) *ht)
Definition: ht_inc.c:130
void * p
Definition: libc.cpp:67
void * malloc(size_t size)
Definition: malloc.c:123
int args
Definition: mipsasm.c:18
int type
Definition: mipsasm.c:17

References args, dem_str_newf(), free(), i, malloc(), cmd_descs_generate::nargs, NULL, p, strdup(), and type.

Referenced by rz_demangler_objc().