struct debuginfo *debuginfo__new(const char *path) { enum dso_binary_type *type; char buf[PATH_MAX], nil = '\0'; struct dso *dso; struct debuginfo *dinfo = NULL; /* Try to open distro debuginfo files */ dso = dso__new(path); if (!dso) goto out; for (type = distro_dwarf_types; !dinfo && *type != DSO_BINARY_TYPE__NOT_FOUND; type++) { if (dso__read_binary_type_filename(dso, *type, &nil, buf, PATH_MAX) < 0) continue; dinfo = __debuginfo__new(buf); } dso__delete(dso); out: /* if failed to open all distro debuginfo, open given binary */ return dinfo ? : __debuginfo__new(path); }
static int __open_dso(struct dso *dso, struct machine *machine) { int fd; char *root_dir = (char *)""; char *name = malloc(PATH_MAX); if (!name) return -ENOMEM; if (machine) root_dir = machine->root_dir; if (dso__read_binary_type_filename(dso, dso->binary_type, root_dir, name, PATH_MAX)) { free(name); return -EINVAL; } fd = do_open(name); free(name); return fd; }