perf tools: Check recorded kernel version when finding vmlinux
[deliverable/linux.git] / tools / perf / util / symbol.c
index 009a9d064f11d80ca665b6b8734a3065323ad5ec..ac098a3c2a318b0b2b61ea2be31ff32e7d15f216 100644 (file)
@@ -15,6 +15,7 @@
 #include "machine.h"
 #include "symbol.h"
 #include "strlist.h"
+#include "header.h"
 
 #include <elf.h>
 #include <limits.h>
@@ -1749,10 +1750,11 @@ static void vmlinux_path__exit(void)
        zfree(&vmlinux_path);
 }
 
-static int vmlinux_path__init(void)
+static int vmlinux_path__init(struct perf_session_env *env)
 {
        struct utsname uts;
        char bf[PATH_MAX];
+       char *kernel_version;
 
        vmlinux_path = malloc(sizeof(char *) * 5);
        if (vmlinux_path == NULL)
@@ -1767,25 +1769,31 @@ static int vmlinux_path__init(void)
                goto out_fail;
        ++vmlinux_path__nr_entries;
 
-       /* only try running kernel version if no symfs was given */
+       /* only try kernel version if no symfs was given */
        if (symbol_conf.symfs[0] != 0)
                return 0;
 
-       if (uname(&uts) < 0)
-               goto out_fail;
+       if (env) {
+               kernel_version = env->os_release;
+       } else {
+               if (uname(&uts) < 0)
+                       goto out_fail;
+
+               kernel_version = uts.release;
+       }
 
-       snprintf(bf, sizeof(bf), "/boot/vmlinux-%s", uts.release);
+       snprintf(bf, sizeof(bf), "/boot/vmlinux-%s", kernel_version);
        vmlinux_path[vmlinux_path__nr_entries] = strdup(bf);
        if (vmlinux_path[vmlinux_path__nr_entries] == NULL)
                goto out_fail;
        ++vmlinux_path__nr_entries;
-       snprintf(bf, sizeof(bf), "/lib/modules/%s/build/vmlinux", uts.release);
+       snprintf(bf, sizeof(bf), "/lib/modules/%s/build/vmlinux", kernel_version);
        vmlinux_path[vmlinux_path__nr_entries] = strdup(bf);
        if (vmlinux_path[vmlinux_path__nr_entries] == NULL)
                goto out_fail;
        ++vmlinux_path__nr_entries;
        snprintf(bf, sizeof(bf), "/usr/lib/debug/lib/modules/%s/vmlinux",
-                uts.release);
+                kernel_version);
        vmlinux_path[vmlinux_path__nr_entries] = strdup(bf);
        if (vmlinux_path[vmlinux_path__nr_entries] == NULL)
                goto out_fail;
@@ -1831,7 +1839,7 @@ static bool symbol__read_kptr_restrict(void)
        return value;
 }
 
-int symbol__init(void)
+int symbol__init(struct perf_session_env *env)
 {
        const char *symfs;
 
@@ -1846,7 +1854,7 @@ int symbol__init(void)
                symbol_conf.priv_size += (sizeof(struct symbol_name_rb_node) -
                                          sizeof(struct symbol));
 
-       if (symbol_conf.try_vmlinux_path && vmlinux_path__init() < 0)
+       if (symbol_conf.try_vmlinux_path && vmlinux_path__init(env) < 0)
                return -1;
 
        if (symbol_conf.field_sep && *symbol_conf.field_sep == '.') {
This page took 0.026254 seconds and 5 git commands to generate.