|
@@ -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 == '.') {
|