Clean up libelfin_wrap functions api
This commit is contained in:
82
debugus.c
82
debugus.c
@@ -214,14 +214,6 @@ void brk_disable(Brk *brk)
|
|||||||
brk->enabled = false;
|
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 {
|
typedef struct {
|
||||||
const char *file;
|
const char *file;
|
||||||
pid_t pid;
|
pid_t pid;
|
||||||
@@ -229,11 +221,22 @@ typedef struct {
|
|||||||
HashTable brks;
|
HashTable brks;
|
||||||
uintptr_t program_load_offset;
|
uintptr_t program_load_offset;
|
||||||
HashTable js_descs;
|
HashTable js_descs;
|
||||||
Symbols symbols;
|
Funcs funcs;
|
||||||
FILE *binfile;
|
FILE *binfile;
|
||||||
PLibelfinBinding plibelfin;
|
PLibelfinBinding plibelfin;
|
||||||
} Dbg;
|
} 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 dbg_get_siginfo(Dbg *dbg)
|
||||||
{
|
{
|
||||||
siginfo_t i;
|
siginfo_t i;
|
||||||
@@ -247,25 +250,22 @@ void dbg_handle_sigsegv(Dbg *dbg, siginfo_t info)
|
|||||||
uint64_t dbg_get_rip(Dbg *dbg);
|
uint64_t dbg_get_rip(Dbg *dbg);
|
||||||
LOG_ERR("Caught a segfault %d. SKILL ISSUE BRO\n", info.si_code);
|
LOG_ERR("Caught a segfault %d. SKILL ISSUE BRO\n", info.si_code);
|
||||||
uintptr_t rip = (uintptr_t)dbg_get_rip(dbg);
|
uintptr_t rip = (uintptr_t)dbg_get_rip(dbg);
|
||||||
uintptr_t nearest = rip - dbg->symbols.items[0].addr;
|
uintptr_t nearest = UINTPTR_MAX;
|
||||||
for (int i = 0; i < dbg->symbols.count; i++) {
|
for (int i = 0; i < dbg->funcs.count; i++) {
|
||||||
if (rip - dbg->symbols.items[i].addr < nearest) {
|
if (dbg->funcs.items[i].ai != NULL && rip - dbg->funcs.items[i].ai->addr < nearest) {
|
||||||
nearest = rip - dbg->symbols.items[i].addr;
|
nearest = rip - dbg->funcs.items[i].ai->addr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
uintptr_t addr = rip - nearest;
|
uintptr_t addr = rip - nearest;
|
||||||
for (int i = 0; i < dbg->symbols.count; i++) {
|
for (int i = 0; i < dbg->funcs.count; i++) {
|
||||||
if (dbg->symbols.items[i].addr == addr) {
|
if (dbg->funcs.items[i].ai != NULL && dbg->funcs.items[i].ai->addr == addr) {
|
||||||
AddrInfo *ai = libelfin_wrap_info_from_rip(dbg->plibelfin, (uint64_t)(addr - dbg->program_load_offset));
|
Func *f = &dbg->funcs.items[i];
|
||||||
if (ai != NULL) {
|
LOG_INF("%s:%zu in function %s()\n", f->ai->file, (size_t)f->ai->line, f->name);
|
||||||
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));
|
AddrInfo *ai2 = libelfin_wrap_info_from_rip(dbg->plibelfin, (uint64_t)(rip - dbg->program_load_offset));
|
||||||
if (ai2 != NULL) {
|
if (ai2 != NULL) {
|
||||||
print_source(ai2->file, ai2->line);
|
print_source(ai2->file, ai2->line);
|
||||||
libelfin_wrap_free_info(ai2);
|
libelfin_wrap_free_info(ai2);
|
||||||
}
|
}
|
||||||
libelfin_wrap_free_info(ai);
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -420,13 +420,13 @@ void dbg_js_bfn(js_State *js)
|
|||||||
{
|
{
|
||||||
Dbg *dbg = getdbg();
|
Dbg *dbg = getdbg();
|
||||||
const char *fn_name = js_tostring(js, 1);
|
const char *fn_name = js_tostring(js, 1);
|
||||||
for (int i = 0; i < dbg->symbols.count; i++) {
|
for (int i = 0; i < dbg->funcs.count; i++) {
|
||||||
Symbol *s = &dbg->symbols.items[i];
|
Func *f = &dbg->funcs.items[i];
|
||||||
if (strcmp(fn_name, s->name) == 0) {
|
if (strcmp(fn_name, f->name) == 0) {
|
||||||
uintptr_t addr = s->addr;
|
|
||||||
char addr_str2[20];
|
char addr_str2[20];
|
||||||
snprintf(addr_str2, sizeof(addr_str2), "0x%"PRIxPTR, addr);
|
snprintf(addr_str2, sizeof(addr_str2), "0x%"PRIxPTR,
|
||||||
Brk brk = { .pid = dbg->pid, .addr = addr };
|
libelfin_wrap_func_addr(dbg->plibelfin, f));
|
||||||
|
Brk brk = { .pid = dbg->pid, .addr = libelfin_wrap_func_addr(dbg->plibelfin, f) };
|
||||||
brk_enable(&brk);
|
brk_enable(&brk);
|
||||||
hashtable_set(&dbg->brks, addr_str2, &brk, sizeof(brk));
|
hashtable_set(&dbg->brks, addr_str2, &brk, sizeof(brk));
|
||||||
break;
|
break;
|
||||||
@@ -440,12 +440,12 @@ void dbg_js_rmbfn(js_State *js)
|
|||||||
Dbg *dbg = getdbg();
|
Dbg *dbg = getdbg();
|
||||||
const char *fn_name = js_tostring(js, 1);
|
const char *fn_name = js_tostring(js, 1);
|
||||||
|
|
||||||
for (int i = 0; i < dbg->symbols.count; i++) {
|
for (int i = 0; i < dbg->funcs.count; i++) {
|
||||||
Symbol *s = &dbg->symbols.items[i];
|
Func *f = &dbg->funcs.items[i];
|
||||||
if (strcmp(fn_name, s->name) == 0) {
|
if (strcmp(fn_name, f->name) == 0) {
|
||||||
uintptr_t addr = s->addr;
|
|
||||||
char addr_str2[20];
|
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);
|
Brk *brk = (Brk *)hashtable_get(&dbg->brks, addr_str2);
|
||||||
if (brk == NULL) {
|
if (brk == NULL) {
|
||||||
@@ -524,12 +524,12 @@ void dbg_js_lsbrk(js_State *js)
|
|||||||
void dbg_js_lsf(js_State *js)
|
void dbg_js_lsf(js_State *js)
|
||||||
{
|
{
|
||||||
Dbg *dbg = getdbg();
|
Dbg *dbg = getdbg();
|
||||||
for (int i = 0; i < dbg->symbols.count; i++) {
|
for (int i = 0; i < dbg->funcs.count; i++) {
|
||||||
Symbol *s = &dbg->symbols.items[i];
|
Func *f = &dbg->funcs.items[i];
|
||||||
AddrInfo *ai = libelfin_wrap_info_from_rip(dbg->plibelfin, (uint64_t)(s->addr - dbg->program_load_offset));
|
if (f->ai != NULL) {
|
||||||
if (ai != NULL) {
|
LOG_INF("Sym %s 0x%"PRIxPTR" %s:%zu\n", f->name,
|
||||||
LOG_INF("Sym %s 0x%"PRIxPTR" %s:%zu\n", s->name, s->addr, ai->file, (size_t)ai->line);
|
libelfin_wrap_func_addr(dbg->plibelfin, f), f->ai->file,
|
||||||
libelfin_wrap_free_info(ai);
|
(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);
|
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)
|
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_load_offset(dbg);
|
||||||
dbg_init_bin(dbg);
|
dbg_init_bin(dbg);
|
||||||
dbg_libelfin_wrap_init(dbg);
|
dbg_libelfin_wrap_init(dbg);
|
||||||
dbg_load_symbols(dbg);
|
dbg_load_funcs(dbg);
|
||||||
hashtable_init(&dbg->brks, MAX_BRKS);
|
hashtable_init(&dbg->brks, MAX_BRKS);
|
||||||
dbg_load_script(dbg, INIT_SCRIPT);
|
dbg_load_script(dbg, INIT_SCRIPT);
|
||||||
}
|
}
|
||||||
@@ -749,7 +749,7 @@ void dbg_deinit(Dbg *dbg)
|
|||||||
js_freestate(dbg->js);
|
js_freestate(dbg->js);
|
||||||
hashtable_deinit(&dbg->brks);
|
hashtable_deinit(&dbg->brks);
|
||||||
hashtable_deinit(&dbg->js_descs);
|
hashtable_deinit(&dbg->js_descs);
|
||||||
symbols_deinit(&dbg->symbols);
|
funcs_deinit(&dbg->funcs);
|
||||||
libelfin_wrap_free_binding(dbg->plibelfin);
|
libelfin_wrap_free_binding(dbg->plibelfin);
|
||||||
fclose(dbg->binfile);
|
fclose(dbg->binfile);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ class LibelfinBinding
|
|||||||
uintptr_t loadoffset;
|
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;
|
LibelfinBinding *bind = (LibelfinBinding *)pbind;
|
||||||
for (auto §ion : bind->elf.sections()) {
|
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()) {
|
for (auto sym : section.as_symtab()) {
|
||||||
auto &d = sym.get_data();
|
auto &d = sym.get_data();
|
||||||
if (d.type() == elf::stt::func) {
|
if (d.type() == elf::stt::func) {
|
||||||
Symbol s = {
|
Func f = {
|
||||||
.name = (const char *)malloc(strlen(sym.get_name().c_str())+1),
|
.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());
|
strcpy((char*)f.name, sym.get_name().c_str());
|
||||||
da_append(syms, s);
|
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)
|
DEBUGUS_EXTERNC PLibelfinBinding libelfin_wrap_get_binding(int fd, uintptr_t loadoffset)
|
||||||
{
|
{
|
||||||
return (PLibelfinBinding)new LibelfinBinding(fd, loadoffset);
|
return (PLibelfinBinding)new LibelfinBinding(fd, loadoffset);
|
||||||
|
|||||||
@@ -17,18 +17,18 @@
|
|||||||
typedef struct {
|
typedef struct {
|
||||||
ssize_t line;
|
ssize_t line;
|
||||||
const char *file;
|
const char *file;
|
||||||
uint64_t addr;
|
uintptr_t addr;
|
||||||
} AddrInfo;
|
} AddrInfo;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
const char *name;
|
const char *name;
|
||||||
uintptr_t addr;
|
AddrInfo *ai;
|
||||||
} Symbol;
|
} Func;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
Symbol *items;
|
Func *items;
|
||||||
size_t count, capacity;
|
size_t count, capacity;
|
||||||
} Symbols;
|
} Funcs;
|
||||||
|
|
||||||
typedef void * PLibelfinBinding;
|
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 void libelfin_wrap_free_binding(PLibelfinBinding pbind);
|
||||||
DEBUGUS_EXTERNC AddrInfo *libelfin_wrap_info_from_rip(PLibelfinBinding pbind, uint64_t rip);
|
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_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_
|
#endif // LIBELFIN_WRAP_H_
|
||||||
|
|||||||
Reference in New Issue
Block a user