Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d709ad3d authored by Christopher Ferris's avatar Christopher Ferris Committed by Android Git Automerger
Browse files

am 4ddea7f4: am d5a7c371: am 408b3acf: Merge "Add corkscrew support for finding static symbols."

* commit '4ddea7f4':
  Add corkscrew support for finding static symbols.
parents d969d8e0 4ddea7f4
Loading
Loading
Loading
Loading
+25 −7
Original line number Diff line number Diff line
@@ -86,15 +86,33 @@ bool CorkscrewCurrent::Unwind(size_t num_ignore_frames) {
std::string CorkscrewCurrent::GetFunctionNameRaw(uintptr_t pc, uintptr_t* offset) {
  *offset = 0;

  // Get information about the current thread.
  Dl_info info;
  const backtrace_map_info_t* map_info = backtrace_obj_->FindMapInfo(pc);
  const char* symbol_name = NULL;
  if (map_info && dladdr((const void*)pc, &info) && info.dli_sname) {
  if (map_info) {
    if (dladdr((const void*)pc, &info)) {
      if (info.dli_sname) {
        *offset = pc - map_info->start - (uintptr_t)info.dli_saddr + (uintptr_t)info.dli_fbase;
    symbol_name = info.dli_sname;

    return symbol_name;
        return info.dli_sname;
      }
    } else {
      // dladdr(3) didn't find a symbol; maybe it's static? Look in the ELF file...
      symbol_table_t* symbol_table = load_symbol_table(map_info->name);
      if (symbol_table) {
        // First check if we can find the symbol using a relative pc.
        std::string name;
        const symbol_t* elf_symbol = find_symbol(symbol_table, pc - map_info->start);
        if (elf_symbol) {
          name = elf_symbol->name;
          *offset = pc - map_info->start - elf_symbol->start;
        } else if ((elf_symbol = find_symbol(symbol_table, pc)) != NULL) {
          // Found the symbol using the absolute pc.
          name = elf_symbol->name;
          *offset = pc - elf_symbol->start;
        }
        free_symbol_table(symbol_table);
        return name;
      }
    }
  }
  return "";
}