It is wrong way to read link name from a build-id file.
Because a build-id file is not symbolic link
but build-id directory of it is symbolic link, so fix it.

For example, if build-id file name gotten from
dso__build_id_filename() is as below,

  /root/.debug/.build-id/4f/75c7d197c951659d1c1b8b5fd49bcdf8f3f8b1/elf

To correctly read link name of build-id,
use the build-id dir path that is a symbolic link,
instead of the above build-id file name like below.

  /root/.debug/.build-id/4f/75c7d197c951659d1c1b8b5fd49bcdf8f3f8b1

Cc: Namhyung Kim <namhy...@kernel.org>
Cc: Jiri Olsa <jo...@redhat.com>
Signed-off-by: Taeung Song <treeze.tae...@gmail.com>
---
 tools/perf/util/annotate.c | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/tools/perf/util/annotate.c b/tools/perf/util/annotate.c
index 22cd1db..20de715 100644
--- a/tools/perf/util/annotate.c
+++ b/tools/perf/util/annotate.c
@@ -1307,6 +1307,7 @@ static int dso__disassemble_filename(struct dso *dso, 
char *filename, size_t fil
 {
        char linkname[PATH_MAX];
        char *build_id_filename;
+       char *build_id_path = NULL;
 
        if (dso->symtab_type == DSO_BINARY_TYPE__KALLSYMS &&
            !dso__is_kcore(dso))
@@ -1322,8 +1323,14 @@ static int dso__disassemble_filename(struct dso *dso, 
char *filename, size_t fil
                goto fallback;
        }
 
+       build_id_path = strdup(filename);
+       if (!build_id_path)
+               return -1;
+
+       dirname(build_id_path);
+
        if (dso__is_kcore(dso) ||
-           readlink(filename, linkname, sizeof(linkname)) < 0 ||
+           readlink(build_id_path, linkname, sizeof(linkname)) < 0 ||
            strstr(linkname, DSO__NAME_KALLSYMS) ||
            access(filename, R_OK)) {
 fallback:
@@ -1335,6 +1342,7 @@ static int dso__disassemble_filename(struct dso *dso, 
char *filename, size_t fil
                __symbol__join_symfs(filename, filename_size, dso->long_name);
        }
 
+       free(build_id_path);
        return 0;
 }
 
-- 
2.7.4

Reply via email to