* Masami Hiramatsu <mhira...@kernel.org> [2020-07-10 22:11:33]: > Warn if the probe target function is GNU indirect function (GNU_IFUNC) > because it may not what the user want to probe. > > The GNU indirect function ( https://sourceware.org/glibc/wiki/GNU_IFUNC ) > is the dynamic solved symbol at runtime. IFUNC function is a selector > which is invoked from the elf loader, but the symbol address of the > function which will be modified by the IFUNC is same as the IFUNC in > the symbol table. This can confuse users who is trying to probe on > such functions. > > For example, the memcpy is one of IFUNC. > > # perf probe -x /lib64/libc-2.30.so -a memcpy > # perf probe -l > probe_libc:memcpy (on __new_memcpy_ifunc@x86_64/multiarch/memcpy.c in > /usr/lib64/libc-2.30.so) > > the probe is put on a IFUNC. > > # perf record -e probe_libc:memcpy --call-graph dwarf -aR ./perf > > Thus, I decided to warn user when the perf probe detects the probe point > is on the GNU IFUNC symbol. Someone who wants to probe an IFUNC symbol to > debug the IFUNC function, they can ignore this warning. > > Reported-by: Andi Kleen <a...@firstfloor.org> > Signed-off-by: Masami Hiramatsu <mhira...@kernel.org>
Looks good to me. Reviewed-by: Srikar Dronamraju <sri...@linux.vnet.ibm.com> > --- > Changes in v2: > - Check GNU_IFUNC only for uprobe > - Show function name instead of the address. > - Update the warning message according to Andi's comment. > --- > tools/perf/util/probe-event.c | 8 ++++++-- > 1 file changed, 6 insertions(+), 2 deletions(-) > > diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c > index 8cd1224e5f4c..679447f13c20 100644 > --- a/tools/perf/util/probe-event.c > +++ b/tools/perf/util/probe-event.c > @@ -375,9 +375,13 @@ 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 (uprobes) > + if (uprobes) { > address = sym->start; > - else > + if (sym->type == STT_GNU_IFUNC) > + pr_warning("Warning: The probe function (%s) is > a GNU indirect function.\n" > + "Consider identifying the final > function used at run time and set the probe directly on that.\n", > + pp->function); > + } else > address = map->unmap_ip(map, sym->start) - map->reloc; > break; > } > -- Thanks and Regards Srikar Dronamraju