void print_relocinfo (Dwarf_Debug dbg) { Elf *elf; char *endr_ident; int is_64bit; int res; int i; for (i = 0; i < DW_SECTION_REL_DEBUG_NUM; i ++) { sect_data[i].buf = 0; sect_data[i].size = 0; } res = dwarf_get_elf(dbg,&elf, &err); if(res != DW_DLV_OK) { print_error(dbg, "dwarf_get_elf error",res, err); } if ((endr_ident = elf_getident(elf, NULL)) == NULL) { print_error(dbg, "DW_ELF_GETIDENT_ERROR",res, err); } is_64bit = (endr_ident[EI_CLASS] == ELFCLASS64); if (is_64bit) { print_relocinfo_64(dbg, elf); } else { print_relocinfo_32(dbg, elf); } }
void close_dwarf_executable (void) { int dwStatus = -1; Elf *elfHandle = NULL; mpiPi_msg_debug ("enter close_dwarf_executable\n"); assert (dwHandle != NULL); assert (dwFd != -1); dwStatus = dwarf_get_elf (dwHandle, &elfHandle, &dw_err); if (dwStatus != DW_DLV_OK) { mpiPi_msg_debug ("dwarf_get_elf failed; ignoring : %s\n", dwarf_errmsg(dw_err)); } dwStatus = dwarf_finish (dwHandle, &dw_err); if (dwStatus != DW_DLV_OK) { mpiPi_msg_debug ("dwarf_finish failed; ignoring : %s\n", dwarf_errmsg(dw_err)); } dwHandle = NULL; close (dwFd); dwFd = -1; AddrToSourceMap_Destroy (); FunctionMap_Destroy (); }
void FLinuxCrashContext::InitFromSignal(int32 InSignal, siginfo_t* InInfo, void* InContext) { Signal = InSignal; Info = InInfo; Context = reinterpret_cast< ucontext_t* >( InContext ); // open ourselves for examination if (!FParse::Param( FCommandLine::Get(), TEXT(CMDARG_SUPPRESS_DWARF_PARSING))) { ExeFd = open("/proc/self/exe", O_RDONLY); if (ExeFd >= 0) { Dwarf_Error ErrorInfo; // allocate DWARF debug descriptor if (dwarf_init(ExeFd, DW_DLC_READ, NULL, NULL, &DebugInfo, &ErrorInfo) == DW_DLV_OK) { // get ELF descritor if (dwarf_get_elf(DebugInfo, &ElfHdr, &ErrorInfo) != DW_DLV_OK) { dwarf_finish(DebugInfo, &ErrorInfo); DebugInfo = NULL; close(ExeFd); ExeFd = -1; } } else { DebugInfo = NULL; close(ExeFd); ExeFd = -1; } } } FCString::Strcat(SignalDescription, ARRAY_COUNT( SignalDescription ) - 1, *DescribeSignal(Signal, Info)); }
int main(int argc, char **argv) { Elf *e; Dwarf_Debug dbg; Dwarf_Error de; const char *exe, *section; char line[1024]; int fd, i, opt; exe = NULL; section = NULL; while ((opt = getopt_long(argc, argv, "b:Ce:fj:sHV", longopts, NULL)) != -1) { switch (opt) { case 'b': /* ignored */ break; case 'C': demangle = 1; break; case 'e': exe = optarg; break; case 'f': func = 1; break; case 'j': section = optarg; break; case 's': base = 1; break; case 'H': usage(); case 'V': version(); default: usage(); } } argv += optind; argc -= optind; if (exe == NULL) exe = "a.out"; if ((fd = open(exe, O_RDONLY)) < 0) err(EXIT_FAILURE, "%s", exe); if (dwarf_init(fd, DW_DLC_READ, NULL, NULL, &dbg, &de)) errx(EXIT_FAILURE, "dwarf_init: %s", dwarf_errmsg(de)); if (dwarf_get_elf(dbg, &e, &de) != DW_DLV_OK) errx(EXIT_FAILURE, "dwarf_get_elf: %s", dwarf_errmsg(de)); if (section) find_section_base(exe, e, section); else section_base = 0; if (argc > 0) for (i = 0; i < argc; i++) translate(dbg, argv[i]); else while (fgets(line, sizeof(line), stdin) != NULL) { translate(dbg, line); fflush(stdout); } dwarf_finish(dbg, &de); (void) elf_end(e); exit(0); }