const char *try_demangle_noprefix(const char *mangled) { const char *demangled = try_demangle(mangled); if (strncmp(demangled, "typeinfo for ", 13) == 0) { return demangled + 13; } else if (strncmp(demangled, "vtable for ", 11) == 0) { return demangled + 11; } else { return demangled; } }
func_t *func_register(void *pfunc) { func_t *func; /* skip if function is already registered */ for (func = funcs; func != funcs + num_funcs; ++func) { if (func->func_addr == (uintptr_t)pfunc) { return func; } } assert(num_funcs < (sizeof(funcs) / sizeof(*funcs))); func = funcs + num_funcs++; func->func_addr = (uintptr_t)pfunc; symbol_t sym; if (!symtab_func_addr_abs(&sym, (uintptr_t)pfunc)) { errx(1, "symtab_func_addr_abs_anylib(0x%08x) failed", func->func_addr); } func->name = sym.name; func->name_demangled = try_demangle(sym.name); func->func_size = sym.size; func->has_detour = false; void *buf; if ((buf = mmap(NULL, PAGE_SIZE, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0)) == MAP_FAILED) { err(1, "mmap for func '%s' trampoline failed", func->name_demangled); } func->trampoline_addr = (uintptr_t)buf; func->trampoline_size = PAGE_SIZE; //pr_debug("func_register %s:\n", func->name_demangled); //pr_debug(" addr %08x\n size %08x\n", func->func_addr, func->func_size); /*func_dump(func);*/ return func; }