summaryrefslogtreecommitdiffstats
path: root/tools/perf/util/header.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/perf/util/header.c')
-rw-r--r--tools/perf/util/header.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c
index b31e0ae4b8d..1b65fed0dd2 100644
--- a/tools/perf/util/header.c
+++ b/tools/perf/util/header.c
@@ -237,11 +237,13 @@ static int dso__cache_build_id(struct dso *self, const char *debugdir)
char *filename = malloc(size),
*linkname = malloc(size), *targetname, *sbuild_id;
int len, err = -1;
+ bool is_kallsyms = self->kernel && self->long_name[0] != '/';
if (filename == NULL || linkname == NULL)
goto out_free;
- len = snprintf(filename, size, "%s%s", debugdir, self->long_name);
+ len = snprintf(filename, size, "%s%s%s",
+ debugdir, is_kallsyms ? "/" : "", self->long_name);
if (mkdir_p(filename, 0755))
goto out_free;
@@ -249,9 +251,14 @@ static int dso__cache_build_id(struct dso *self, const char *debugdir)
sbuild_id = filename + len;
build_id__sprintf(self->build_id, sizeof(self->build_id), sbuild_id);
- if (access(filename, F_OK) && link(self->long_name, filename) &&
- copyfile(self->long_name, filename))
- goto out_free;
+ if (access(filename, F_OK)) {
+ if (is_kallsyms) {
+ if (copyfile("/proc/kallsyms", filename))
+ goto out_free;
+ } else if (link(self->long_name, filename) &&
+ copyfile(self->long_name, filename))
+ goto out_free;
+ }
len = snprintf(linkname, size, "%s/.build-id/%.2s",
debugdir, sbuild_id);