Clean up libelfin_wrap functions api

This commit is contained in:
kamkow1
2025-03-13 14:03:04 +01:00
parent a9f555d916
commit 4f60dfcd4d
3 changed files with 63 additions and 56 deletions

View File

@@ -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);
}