From 4f60dfcd4d3cd9a523b124c22809bed84cca0772 Mon Sep 17 00:00:00 2001 From: kamkow1 Date: Thu, 13 Mar 2025 14:03:04 +0100 Subject: [PATCH] Clean up libelfin_wrap functions api --- debugus.c | 90 +++++++++++++++++++++++------------------------ libelfin_wrap.cpp | 16 ++++++--- libelfin_wrap.h | 13 +++---- 3 files changed, 63 insertions(+), 56 deletions(-) diff --git a/debugus.c b/debugus.c index fc72b45..a1f6714 100644 --- a/debugus.c +++ b/debugus.c @@ -214,14 +214,6 @@ void brk_disable(Brk *brk) brk->enabled = false; } -void symbols_deinit(Symbols *s) -{ - for (int i = 0; i < s->count; i++) { - free((char *)s->items[i].name); - } - da_deinit(s); -} - typedef struct { const char *file; pid_t pid; @@ -229,11 +221,22 @@ typedef struct { HashTable brks; uintptr_t program_load_offset; HashTable js_descs; - Symbols symbols; + Funcs funcs; FILE *binfile; PLibelfinBinding plibelfin; } Dbg; +void funcs_deinit(Funcs *fs) +{ + for (int i = 0; i < fs->count; i++) { + free((char *)fs->items[i].name); + if (fs->items[i].ai != NULL) { + libelfin_wrap_free_info(fs->items[i].ai); + } + } + da_deinit(fs); +} + siginfo_t dbg_get_siginfo(Dbg *dbg) { siginfo_t i; @@ -247,24 +250,21 @@ void dbg_handle_sigsegv(Dbg *dbg, siginfo_t info) uint64_t dbg_get_rip(Dbg *dbg); LOG_ERR("Caught a segfault %d. SKILL ISSUE BRO\n", info.si_code); uintptr_t rip = (uintptr_t)dbg_get_rip(dbg); - uintptr_t nearest = rip - dbg->symbols.items[0].addr; - for (int i = 0; i < dbg->symbols.count; i++) { - if (rip - dbg->symbols.items[i].addr < nearest) { - nearest = rip - dbg->symbols.items[i].addr; + uintptr_t nearest = UINTPTR_MAX; + for (int i = 0; i < dbg->funcs.count; i++) { + if (dbg->funcs.items[i].ai != NULL && rip - dbg->funcs.items[i].ai->addr < nearest) { + nearest = rip - dbg->funcs.items[i].ai->addr; } } uintptr_t addr = rip - nearest; - for (int i = 0; i < dbg->symbols.count; i++) { - if (dbg->symbols.items[i].addr == addr) { - AddrInfo *ai = libelfin_wrap_info_from_rip(dbg->plibelfin, (uint64_t)(addr - dbg->program_load_offset)); - if (ai != NULL) { - LOG_INF("%s:%zu in function %s()\n", ai->file, (size_t)ai->line, dbg->symbols.items[i].name); - AddrInfo *ai2 = libelfin_wrap_info_from_rip(dbg->plibelfin, (uint64_t)(rip - dbg->program_load_offset)); - if (ai2 != NULL) { - print_source(ai2->file, ai2->line); - libelfin_wrap_free_info(ai2); - } - libelfin_wrap_free_info(ai); + for (int i = 0; i < dbg->funcs.count; i++) { + if (dbg->funcs.items[i].ai != NULL && dbg->funcs.items[i].ai->addr == addr) { + Func *f = &dbg->funcs.items[i]; + LOG_INF("%s:%zu in function %s()\n", f->ai->file, (size_t)f->ai->line, f->name); + AddrInfo *ai2 = libelfin_wrap_info_from_rip(dbg->plibelfin, (uint64_t)(rip - dbg->program_load_offset)); + if (ai2 != NULL) { + print_source(ai2->file, ai2->line); + libelfin_wrap_free_info(ai2); } break; } @@ -420,13 +420,13 @@ void dbg_js_bfn(js_State *js) { Dbg *dbg = getdbg(); const char *fn_name = js_tostring(js, 1); - for (int i = 0; i < dbg->symbols.count; i++) { - Symbol *s = &dbg->symbols.items[i]; - if (strcmp(fn_name, s->name) == 0) { - uintptr_t addr = s->addr; + for (int i = 0; i < dbg->funcs.count; i++) { + Func *f = &dbg->funcs.items[i]; + if (strcmp(fn_name, f->name) == 0) { char addr_str2[20]; - snprintf(addr_str2, sizeof(addr_str2), "0x%"PRIxPTR, addr); - Brk brk = { .pid = dbg->pid, .addr = addr }; + snprintf(addr_str2, sizeof(addr_str2), "0x%"PRIxPTR, + libelfin_wrap_func_addr(dbg->plibelfin, f)); + Brk brk = { .pid = dbg->pid, .addr = libelfin_wrap_func_addr(dbg->plibelfin, f) }; brk_enable(&brk); hashtable_set(&dbg->brks, addr_str2, &brk, sizeof(brk)); break; @@ -440,12 +440,12 @@ void dbg_js_rmbfn(js_State *js) Dbg *dbg = getdbg(); const char *fn_name = js_tostring(js, 1); - for (int i = 0; i < dbg->symbols.count; i++) { - Symbol *s = &dbg->symbols.items[i]; - if (strcmp(fn_name, s->name) == 0) { - uintptr_t addr = s->addr; + for (int i = 0; i < dbg->funcs.count; i++) { + Func *f = &dbg->funcs.items[i]; + if (strcmp(fn_name, f->name) == 0) { char addr_str2[20]; - snprintf(addr_str2, sizeof(addr_str2), "0x%"PRIxPTR, addr); + snprintf(addr_str2, sizeof(addr_str2), "0x%"PRIxPTR, + libelfin_wrap_func_addr(dbg->plibelfin, f)); Brk *brk = (Brk *)hashtable_get(&dbg->brks, addr_str2); if (brk == NULL) { @@ -524,12 +524,12 @@ void dbg_js_lsbrk(js_State *js) void dbg_js_lsf(js_State *js) { Dbg *dbg = getdbg(); - for (int i = 0; i < dbg->symbols.count; i++) { - Symbol *s = &dbg->symbols.items[i]; - AddrInfo *ai = libelfin_wrap_info_from_rip(dbg->plibelfin, (uint64_t)(s->addr - dbg->program_load_offset)); - if (ai != NULL) { - LOG_INF("Sym %s 0x%"PRIxPTR" %s:%zu\n", s->name, s->addr, ai->file, (size_t)ai->line); - libelfin_wrap_free_info(ai); + for (int i = 0; i < dbg->funcs.count; i++) { + Func *f = &dbg->funcs.items[i]; + if (f->ai != NULL) { + LOG_INF("Sym %s 0x%"PRIxPTR" %s:%zu\n", f->name, + libelfin_wrap_func_addr(dbg->plibelfin, f), f->ai->file, + (size_t)f->ai->line); } } @@ -724,9 +724,9 @@ void dbg_libelfin_wrap_init(Dbg *dbg) dbg->plibelfin = libelfin_wrap_get_binding(fileno(dbg->binfile), dbg->program_load_offset); } -void dbg_load_symbols(Dbg *dbg) +void dbg_load_funcs(Dbg *dbg) { - libelfin_wrap_get_syms(dbg->plibelfin, &dbg->symbols); + libelfin_wrap_get_funcs(dbg->plibelfin, &dbg->funcs); } void dbg_init(Dbg *dbg, const char *file, pid_t pid) @@ -739,7 +739,7 @@ void dbg_init(Dbg *dbg, const char *file, pid_t pid) dbg_init_load_offset(dbg); dbg_init_bin(dbg); dbg_libelfin_wrap_init(dbg); - dbg_load_symbols(dbg); + dbg_load_funcs(dbg); hashtable_init(&dbg->brks, MAX_BRKS); dbg_load_script(dbg, INIT_SCRIPT); } @@ -749,7 +749,7 @@ void dbg_deinit(Dbg *dbg) js_freestate(dbg->js); hashtable_deinit(&dbg->brks); hashtable_deinit(&dbg->js_descs); - symbols_deinit(&dbg->symbols); + funcs_deinit(&dbg->funcs); libelfin_wrap_free_binding(dbg->plibelfin); fclose(dbg->binfile); } diff --git a/libelfin_wrap.cpp b/libelfin_wrap.cpp index 4155f37..57c6d67 100644 --- a/libelfin_wrap.cpp +++ b/libelfin_wrap.cpp @@ -19,7 +19,7 @@ class LibelfinBinding uintptr_t loadoffset; }; -DEBUGUS_EXTERNC void libelfin_wrap_get_syms(PLibelfinBinding *pbind, Symbols *syms) +DEBUGUS_EXTERNC void libelfin_wrap_get_funcs(PLibelfinBinding pbind, Funcs *funcs) { LibelfinBinding *bind = (LibelfinBinding *)pbind; for (auto §ion : bind->elf.sections()) { @@ -27,18 +27,24 @@ DEBUGUS_EXTERNC void libelfin_wrap_get_syms(PLibelfinBinding *pbind, Symbols *sy for (auto sym : section.as_symtab()) { auto &d = sym.get_data(); if (d.type() == elf::stt::func) { - Symbol s = { + Func f = { .name = (const char *)malloc(strlen(sym.get_name().c_str())+1), - .addr = bind->loadoffset + (uintptr_t)d.value, + .ai = libelfin_wrap_info_from_rip(pbind, (uintptr_t)d.value), }; - strcpy((char*)s.name, sym.get_name().c_str()); - da_append(syms, s); + strcpy((char*)f.name, sym.get_name().c_str()); + da_append(funcs, f); } } } } } +DEBUGUS_EXTERNC uintptr_t libelfin_wrap_func_addr(PLibelfinBinding pbind, Func *f) +{ + LibelfinBinding *bind = (LibelfinBinding *)pbind; + return bind->loadoffset + f->ai->addr; +} + DEBUGUS_EXTERNC PLibelfinBinding libelfin_wrap_get_binding(int fd, uintptr_t loadoffset) { return (PLibelfinBinding)new LibelfinBinding(fd, loadoffset); diff --git a/libelfin_wrap.h b/libelfin_wrap.h index dac40d0..2bcad23 100644 --- a/libelfin_wrap.h +++ b/libelfin_wrap.h @@ -17,18 +17,18 @@ typedef struct { ssize_t line; const char *file; - uint64_t addr; + uintptr_t addr; } AddrInfo; typedef struct { const char *name; - uintptr_t addr; -} Symbol; + AddrInfo *ai; +} Func; typedef struct { - Symbol *items; + Func *items; size_t count, capacity; -} Symbols; +} Funcs; typedef void * PLibelfinBinding; @@ -36,6 +36,7 @@ DEBUGUS_EXTERNC PLibelfinBinding libelfin_wrap_get_binding(int fd, uintptr_t loa DEBUGUS_EXTERNC void libelfin_wrap_free_binding(PLibelfinBinding pbind); DEBUGUS_EXTERNC AddrInfo *libelfin_wrap_info_from_rip(PLibelfinBinding pbind, uint64_t rip); DEBUGUS_EXTERNC void libelfin_wrap_free_info(AddrInfo *ai); -DEBUGUS_EXTERNC void libelfin_wrap_get_syms(PLibelfinBinding *pbind, Symbols *syms); +DEBUGUS_EXTERNC void libelfin_wrap_get_funcs(PLibelfinBinding pbind, Funcs *funcs); +DEBUGUS_EXTERNC uintptr_t libelfin_wrap_func_addr(PLibelfinBinding pbind, Func *f); #endif // LIBELFIN_WRAP_H_