perf python: Remove dependency on 'machine' methods

The python binding still doesn't provide symbol resolving facilities,
but the recent addition of the trace_event__register_resolver() function
made it add as a dependency the machine__resolve_kernel_addr() method,
that in turn drags all the symbol resolving code.

The problem:

  [root@zoo ~]# perf test -v python
  17: Try 'import perf' in python, checking link problems      :
  --- start ---
  test child forked, pid 6853
  Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
  ImportError: /tmp/build/perf/python/perf.so: undefined symbol: machine__resolve_kernel_addr
  test child finished with -1
  ---- end ----
  Try 'import perf' in python, checking link problems: FAILED!
  [root@zoo ~]#

Fix it by requiring this function to receive the resolver as a
parameter, just like pevent_register_function_resolver(), i.e. do
not explicitely refer to an object file not included in
tools/perf/util/python-ext-sources.

  [root@zoo ~]# perf test python
  17: Try 'import perf' in python, checking link problems      : Ok
  [root@zoo ~]#

Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Borislav Petkov <bp@suse.de>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Stephane Eranian <eranian@google.com>
Fixes: c3168b0db9 ("perf symbols: Provide libtraceevent callback to resolve kernel symbols")
Link: http://lkml.kernel.org/n/tip-vxlhh95v2em9zdbgj3jm7xi5@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
Arnaldo Carvalho de Melo 2015-07-24 12:13:05 -03:00
parent 4b0c53e9e1
commit 959c2199d4
3 changed files with 6 additions and 6 deletions

View File

@ -1489,7 +1489,7 @@ static int trace__symbols_init(struct trace *trace, struct perf_evlist *evlist)
if (trace->host == NULL) if (trace->host == NULL)
return -ENOMEM; return -ENOMEM;
if (trace_event__register_resolver(trace->host) < 0) if (trace_event__register_resolver(trace->host, machine__resolve_kernel_addr) < 0)
return -errno; return -errno;
err = __machine__synthesize_threads(trace->host, &trace->tool, &trace->opts.target, err = __machine__synthesize_threads(trace->host, &trace->tool, &trace->opts.target,

View File

@ -50,14 +50,13 @@ static int trace_event__init2(void)
return 0; return 0;
} }
int trace_event__register_resolver(struct machine *machine) int trace_event__register_resolver(struct machine *machine,
pevent_func_resolver_t *func)
{ {
if (!tevent_initialized && trace_event__init2()) if (!tevent_initialized && trace_event__init2())
return -1; return -1;
return pevent_set_function_resolver(tevent.pevent, return pevent_set_function_resolver(tevent.pevent, func, machine);
machine__resolve_kernel_addr,
machine);
} }
void trace_event__cleanup(struct trace_event *t) void trace_event__cleanup(struct trace_event *t)

View File

@ -18,7 +18,8 @@ struct trace_event {
int trace_event__init(struct trace_event *t); int trace_event__init(struct trace_event *t);
void trace_event__cleanup(struct trace_event *t); void trace_event__cleanup(struct trace_event *t);
int trace_event__register_resolver(struct machine *machine); int trace_event__register_resolver(struct machine *machine,
pevent_func_resolver_t *func);
struct event_format* struct event_format*
trace_event__tp_format(const char *sys, const char *name); trace_event__tp_format(const char *sys, const char *name);