lkml.org 
[lkml]   [2015]   [Mar]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[tip:perf/core] perf probe: Allow weak symbols to be probed
    Commit-ID:  e578da3b2009da2a9ae2d25fd0f78c7b76ca5e56
    Gitweb: http://git.kernel.org/tip/e578da3b2009da2a9ae2d25fd0f78c7b76ca5e56
    Author: Namhyung Kim <namhyung@kernel.org>
    AuthorDate: Fri, 6 Mar 2015 16:31:29 +0900
    Committer: Arnaldo Carvalho de Melo <acme@redhat.com>
    CommitDate: Thu, 12 Mar 2015 12:39:55 -0300

    perf probe: Allow weak symbols to be probed

    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 | 12 ++++--------
    1 file changed, 4 insertions(+), 8 deletions(-)

    diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c
    index 9feba0e..8af8e7f 100644
    --- a/tools/perf/util/probe-event.c
    +++ b/tools/perf/util/probe-event.c
    @@ -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;
    }

    \
     
     \ /
      Last update: 2015-03-14 08:21    [W:4.631 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site