perf probe: Allow weak symbols to be probed
authorNamhyung Kim <namhyung@kernel.org>
Fri, 6 Mar 2015 07:31:29 +0000 (16:31 +0900)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Thu, 12 Mar 2015 15:39:55 +0000 (12:39 -0300)
It currently prevents adding probes in weak symbols.  But there're cases
that given name is an only weak symbol so that we cannot add probe.

  $ perf probe -x /usr/lib/libc.so.6 -a calloc
  Failed to find symbol calloc in /usr/lib/libc-2.21.so
    Error: Failed to add events.

  $ nm /usr/lib/libc.so.6 | grep calloc
  000000000007b1f0 t __calloc
  000000000007b1f0 T __libc_calloc
  000000000007b1f0 W calloc

This change will result in duplicate probes when strong and weak symbols
co-exist in a binary.  But I think it's not a big problem since probes
at the weak symbol will never be hit anyway.

Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Naohiro Aota <naota@elisp.net>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: http://lkml.kernel.org/r/20150306073129.6904.41078.stgit@localhost.localdomain
Signed-off-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/util/probe-event.c

index 9feba0e3343e4ed0a0fd7a0a15f182cc143750b8..8af8e7f55254aadb3a2829039ccdf5d64a384a4f 100644 (file)
@@ -310,10 +310,8 @@ static int find_alternative_probe_point(struct debuginfo *dinfo,
 
        /* Find the address of given function */
        map__for_each_symbol_by_name(map, pp->function, sym) {
-               if (sym->binding == STB_GLOBAL || sym->binding == STB_LOCAL) {
-                       address = sym->start;
-                       break;
-               }
+               address = sym->start;
+               break;
        }
        if (!address) {
                ret = -ENOENT;
@@ -2485,8 +2483,7 @@ static int find_probe_functions(struct map *map, char *name)
        struct symbol *sym;
 
        map__for_each_symbol_by_name(map, name, sym) {
-               if (sym->binding == STB_GLOBAL || sym->binding == STB_LOCAL)
-                       found++;
+               found++;
        }
 
        return found;
@@ -2846,8 +2843,7 @@ static struct strfilter *available_func_filter;
 static int filter_available_functions(struct map *map __maybe_unused,
                                      struct symbol *sym)
 {
-       if ((sym->binding == STB_GLOBAL || sym->binding == STB_LOCAL) &&
-           strfilter__compare(available_func_filter, sym->name))
+       if (strfilter__compare(available_func_filter, sym->name))
                return 0;
        return 1;
 }