static int load_kernel(void) { int err; kernel_dso = dso__new("[kernel]", 0); if (!kernel_dso) return -1; err = dso__load_kernel(kernel_dso, vmlinux, NULL, verbose, modules); if (err <= 0) { dso__delete(kernel_dso); kernel_dso = NULL; } else dsos__add(kernel_dso); vdso = dso__new("[vdso]", 0); if (!vdso) return -1; vdso->find_symbol = vdso__find_symbol; dsos__add(vdso); return err; }
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 struct dso *dsos__findnew(const char *name) { struct dso *dso = dsos__find(name); int nr; if (dso) return dso; dso = dso__new(name, 0); if (!dso) goto out_delete_dso; nr = dso__load(dso, NULL, verbose); if (nr < 0) { if (verbose) fprintf(stderr, "Failed to open: %s\n", name); goto out_delete_dso; } if (!nr && verbose) { fprintf(stderr, "No symbols found in: %s, maybe install a debug package?\n", name); } dsos__add(dso); return dso; out_delete_dso: dso__delete(dso); return NULL; }
static void dsos__delete(struct list_head *dsos) { struct dso *pos, *n; list_for_each_entry_safe(pos, n, dsos, node) { list_del(&pos->node); dso__delete(pos); }