44 lines
1.2 KiB
C++
44 lines
1.2 KiB
C++
#include <libelfin/dwarf/dwarf++.hh>
|
|
#include <libelfin/elf/elf++.hh>
|
|
|
|
#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);
|
|
}
|
|
|