static int debuginfo__init_offline_dwarf(struct debuginfo *self, const char *path) { Dwfl_Module *mod; int fd; fd = open(path, O_RDONLY); if (fd < 0) return fd; self->dwfl = dwfl_begin(&offline_callbacks); if (!self->dwfl) goto error; mod = dwfl_report_offline(self->dwfl, "", "", fd); if (!mod) goto error; self->dbg = dwfl_module_getdwarf(mod, &self->bias); if (!self->dbg) goto error; return 0; error: if (self->dwfl) dwfl_end(self->dwfl); else close(fd); memset(self, 0, sizeof(*self)); return -ENOENT; }
/* Get a Dwarf from offline image */ static int debuginfo__init_offline_dwarf(struct debuginfo *dbg, const char *path) { int fd; fd = open(path, O_RDONLY); if (fd < 0) return fd; dbg->dwfl = dwfl_begin(&offline_callbacks); if (!dbg->dwfl) goto error; dbg->mod = dwfl_report_offline(dbg->dwfl, "", "", fd); if (!dbg->mod) goto error; dbg->dbg = dwfl_module_getdwarf(dbg->mod, &dbg->bias); if (!dbg->dbg) goto error; return 0; error: if (dbg->dwfl) dwfl_end(dbg->dwfl); else close(fd); memset(dbg, 0, sizeof(*dbg)); return -ENOENT; }
int main(void) { Dwfl *dw; Dwfl_Module *mod; Dwarf_Addr bias; Dwarf_Die *die = NULL; dw = dwfl_begin(&cb); if (!dw) errx(1, "dwfl_begin %s", dwfl_errmsg(-1)); mod = dwfl_report_offline(dw, "", "tst", -1); if (!mod) errx(1, "dwfl_begin %s", dwfl_errmsg(-1)); while ((die = dwfl_nextcu(dw, die, &bias))) { print_die_rec(die, -1); printf("\n"); } dwfl_end(dw); return 0; }
/* Get a Dwarf from offline image */ static Dwarf *dwfl_init_offline_dwarf(int fd, Dwfl **dwflp, Dwarf_Addr *bias) { Dwfl_Module *mod; Dwarf *dbg = NULL; if (!dwflp) return NULL; *dwflp = dwfl_begin(&offline_callbacks); if (!*dwflp) return NULL; mod = dwfl_report_offline(*dwflp, "", "", fd); if (!mod) goto error; dbg = dwfl_module_getdwarf(mod, bias); if (!dbg) { error: dwfl_end(*dwflp); *dwflp = NULL; } return dbg; }