mirror of https://gitee.com/openkylin/linux.git
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>
This commit is contained in:
parent
680d926a8c
commit
e578da3b20
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue