]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
perf tools: Get debug info of DSO properly
authorNamhyung Kim <namhyung@kernel.org>
Tue, 13 Jan 2026 23:37:57 +0000 (15:37 -0800)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Tue, 20 Jan 2026 20:20:51 +0000 (17:20 -0300)
The dso__debuginfo() just used the path name to open the file but it may
be outdated.  It should check build-ID and use the file in the build-ID
cache if available rather than just using the path name.

Let's factor out dso__get_filename() to avoid code duplicate.

Fixes: 53a61a6ca279165d ("perf annotate: Add dso__debuginfo() helper")
Reviewed-by: Ian Rogers <irogers@google.com>
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: James Clark <james.clark@linaro.org>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/util/dso.c
tools/perf/util/dso.h

index dce207c7f862e760557f98a9701008210cb7ebc2..3b272a6fae24289047841934f92984013c34c171 100644 (file)
@@ -112,7 +112,7 @@ bool dso__is_object_file(const struct dso *dso)
 
 int dso__read_binary_type_filename(const struct dso *dso,
                                   enum dso_binary_type type,
-                                  char *root_dir, char *filename, size_t size)
+                                  const char *root_dir, char *filename, size_t size)
 {
        char build_id_hex[SBUILD_ID_SIZE];
        int ret = 0;
@@ -561,20 +561,15 @@ char *dso__filename_with_chroot(const struct dso *dso, const char *filename)
        return filename_with_chroot(nsinfo__pid(dso__nsinfo_const(dso)), filename);
 }
 
-static int __open_dso(struct dso *dso, struct machine *machine)
-       EXCLUSIVE_LOCKS_REQUIRED(_dso__data_open_lock)
+static char *dso__get_filename(struct dso *dso, const char *root_dir,
+                              bool *decomp)
 {
-       int fd = -EINVAL;
-       char *root_dir = (char *)"";
        char *name = malloc(PATH_MAX);
-       bool decomp = false;
 
-       if (!name)
-               return -ENOMEM;
+       *decomp = false;
 
-       mutex_lock(dso__lock(dso));
-       if (machine)
-               root_dir = machine->root_dir;
+       if (name == NULL)
+               return NULL;
 
        if (dso__read_binary_type_filename(dso, dso__binary_type(dso),
                                            root_dir, name, PATH_MAX))
@@ -599,20 +594,38 @@ static int __open_dso(struct dso *dso, struct machine *machine)
                size_t len = sizeof(newpath);
 
                if (dso__decompress_kmodule_path(dso, name, newpath, len) < 0) {
-                       fd = -(*dso__load_errno(dso));
+                       errno = *dso__load_errno(dso);
                        goto out;
                }
 
-               decomp = true;
+               *decomp = true;
                strcpy(name, newpath);
        }
+       return name;
+
+out:
+       free(name);
+       return NULL;
+}
 
-       fd = do_open(name);
+static int __open_dso(struct dso *dso, struct machine *machine)
+       EXCLUSIVE_LOCKS_REQUIRED(_dso__data_open_lock)
+{
+       int fd = -EINVAL;
+       char *name;
+       bool decomp = false;
+
+       mutex_lock(dso__lock(dso));
+
+       name = dso__get_filename(dso, machine ? machine->root_dir : "", &decomp);
+       if (name)
+               fd = do_open(name);
+       else
+               fd = -errno;
 
        if (decomp)
                unlink(name);
 
-out:
        mutex_unlock(dso__lock(dso));
        free(name);
        return fd;
@@ -1916,3 +1929,23 @@ const u8 *dso__read_symbol(struct dso *dso, const char *symfs_filename,
        return __dso__read_symbol(dso, symfs_filename, start, len,
                                  out_buf, out_buf_len, is_64bit);
 }
+
+struct debuginfo *dso__debuginfo(struct dso *dso)
+{
+       char *name;
+       bool decomp = false;
+       struct debuginfo *dinfo = NULL;
+
+       mutex_lock(dso__lock(dso));
+
+       name = dso__get_filename(dso, "", &decomp);
+       if (name)
+               dinfo = debuginfo__new(name);
+
+       if (decomp)
+               unlink(name);
+
+       mutex_unlock(dso__lock(dso));
+       free(name);
+       return dinfo;
+}
index 2953880850318f4827f1d2dd1c3f804185eeb67b..ac725bc8ea749dea3bd562a8f4f5fbaafcd75f69 100644 (file)
@@ -784,7 +784,7 @@ int dso__kernel_module_get_build_id(struct dso *dso, const char *root_dir);
 
 char dso__symtab_origin(const struct dso *dso);
 int dso__read_binary_type_filename(const struct dso *dso, enum dso_binary_type type,
-                                  char *root_dir, char *filename, size_t size);
+                                  const char *root_dir, char *filename, size_t size);
 bool is_kernel_module(const char *pathname, int cpumode);
 bool dso__needs_decompress(struct dso *dso);
 int dso__decompress_kmodule_fd(struct dso *dso, const char *name);
@@ -933,14 +933,7 @@ u64 dso__findnew_global_type(struct dso *dso, u64 addr, u64 offset);
 bool perf_pid_map_tid(const char *dso_name, int *tid);
 bool is_perf_pid_map_name(const char *dso_name);
 
-/*
- * In the future, we may get debuginfo using build-ID (w/o path).
- * Add this helper is for the smooth conversion.
- */
-static inline struct debuginfo *dso__debuginfo(struct dso *dso)
-{
-       return debuginfo__new(dso__long_name(dso));
-}
+struct debuginfo *dso__debuginfo(struct dso *dso);
 
 const u8 *dso__read_symbol(struct dso *dso, const char *symfs_filename,
                           const struct map *map, const struct symbol *sym,