#include #include #include "libelfin_wrap.h" static elf::elf gelf; static dwarf::dwarf gdwarf; DEBUGUS_EXTERNC void libelfin_wrap_init(int fd) { gelf = elf::elf{elf::create_mmap_loader(fd)}; gdwarf = dwarf::dwarf{dwarf::elf::create_loader(gelf)}; } DEBUGUS_EXTERNC AddrInfo *libelfin_wrap_info_from_rip(uint64_t rip) { for (auto &cu : gdwarf.compilation_units()) { if (die_pc_range(cu.root()).contains(rip)) { auto < = cu.get_line_table(); auto it = lt.find_address(rip); if (it == lt.end()) { printf("ADDR NOT FOUND\n"); return NULL; } else { AddrInfo *ai = (AddrInfo *)malloc(sizeof(*ai)); ai->addr = rip; ai->line = it->line; ai->file = (const char*)malloc(strlen(it->file->path.c_str())+1); strcpy((char*)ai->file, it->file->path.c_str()); return ai; } } } printf("NO CUS\n"); return NULL; } DEBUGUS_EXTERNC void libelfin_wrap_free_info(AddrInfo *ai) { free((void*)ai->file); free((void*)ai); }