perf: unwind: Fix symfs with libdw
authorVincent Whitchurch <vincent.whitchurch@axis.com>
Fri, 30 Jun 2023 09:11:48 +0000 (11:11 +0200)
committerNamhyung Kim <namhyung@kernel.org>
Sat, 1 Jul 2023 18:12:22 +0000 (11:12 -0700)
Pass the full path including the symfs (if any) to libdw.  Without this
unwinding fails with errors like this when a symfs is used:

  unwind: failed with 'No such file or directory'"

Signed-off-by: Vincent Whitchurch <vincent.whitchurch@axis.com>
Acked-by: Namhyung Kim <namhyung@kernel.org>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: kernel@axis.com
Cc: Ian Rogers <irogers@google.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Ingo Molnar <mingo@redhat.com>
Link: https://lore.kernel.org/r/20230630-perf-libdw-symfs-v2-1-469760dd4d5b@axis.com
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
tools/perf/util/unwind-libdw.c

index 83eea96..2a96df4 100644 (file)
@@ -66,9 +66,13 @@ static int __report_module(struct addr_location *al, u64 ip,
                        mod = 0;
        }
 
-       if (!mod)
-               mod = dwfl_report_elf(ui->dwfl, dso->short_name, dso->long_name, -1,
+       if (!mod) {
+               char filename[PATH_MAX];
+
+               __symbol__join_symfs(filename, sizeof(filename), dso->long_name);
+               mod = dwfl_report_elf(ui->dwfl, dso->short_name, filename, -1,
                                      map__start(al->map) - map__pgoff(al->map), false);
+       }
        if (!mod) {
                char filename[PATH_MAX];