On 03/28/2017 03:01 AM, Arnaldo Carvalho de Melo wrote:
Em Mon, Mar 27, 2017 at 04:10:36PM +0900, Taeung Song escreveu:
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.

Ok, applied, in the past it was always a symlink, but the following cset
changed that, so I added:

    Fixes: 01412261d994 ("perf buildid-cache: Use path/to/bin/buildid/elf instead of 
path/to/bin/buildid")

Thanks,

- Arnaldo

Thank you!

- Taeung


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 3d0263e..6dc9148 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