static RList *entries(RBinFile *bf) { RBinWasmObj *bin = bf && bf->o ? bf->o->bin_obj : NULL; // TODO RList *ret = NULL; RBinAddr *ptr = NULL; ut64 addr = 0x0; if (!(ret = r_list_newf ((RListFree)free))) { return NULL; } addr = (ut64) r_bin_wasm_get_entrypoint (bin); if (!addr) { RList *codes = r_bin_wasm_get_codes (bin); if (codes) { RListIter *iter; RBinWasmCodeEntry *func; r_list_foreach (codes, iter, func) { addr = func->code; break; } }
static RList *symbols(RBinFile *bf) { RBinWasmObj *bin = NULL; RList *ret = NULL, *codes = NULL, *imports = NULL; RBinSymbol *ptr = NULL; if (!bf || !bf->o || !bf->o->bin_obj) { return NULL; } bin = bf->o->bin_obj; if (!(ret = r_list_newf ((RListFree)free))) { return NULL; } if (!(codes = r_bin_wasm_get_codes (bin))) { goto bad_alloc; } if (!(imports = r_bin_wasm_get_imports (bin))) { goto bad_alloc; } ut32 i = 0; RBinWasmImportEntry *imp; RListIter *iter; r_list_foreach (imports, iter, imp) { if (!(ptr = R_NEW0 (RBinSymbol))) { goto bad_alloc; } ptr->name = r_str_newf ("imp.%s.%s", imp->module_str, imp->field_str); ptr->forwarder = r_str_const ("NONE"); ptr->bind = r_str_const ("NONE"); switch (imp->kind) { case 0: ptr->type = r_str_const ("FUNC"); break; case 1: ptr->type = r_str_const ("TABLE"); break; case 2: ptr->type = r_str_const ("MEMORY"); break; case 3: ptr->type = r_str_const ("GLOBAL"); break; } ptr->size = 0; ptr->vaddr = -1; ptr->paddr = -1; ptr->ordinal = i; i += 1; r_list_append (ret, ptr); } RBinWasmCodeEntry *func; r_list_foreach (codes, iter, func) { if (!(ptr = R_NEW0 (RBinSymbol))) { goto bad_alloc; } char tmp[R_BIN_SIZEOF_STRINGS]; snprintf (tmp, R_BIN_SIZEOF_STRINGS, "fnc.%d", i); ptr->name = strdup(tmp); ptr->forwarder = r_str_const ("NONE"); ptr->bind = r_str_const ("NONE"); ptr->type = r_str_const ("FUNC"); ptr->size = func->len; ptr->vaddr = (ut64)func->code; ptr->paddr = (ut64)func->code; ptr->ordinal = i; i++; r_list_append (ret, ptr); } // TODO: use custom section "name" if present // TODO: exports, globals, tables and memories return ret; bad_alloc: // not so sure if imports should be freed. r_list_free (codes); r_list_free (ret); return NULL; }