Messages in this thread | | | Date | Fri, 10 Jul 2020 19:27:12 +0530 | From | Srikar Dronamraju <> | Subject | Re: [PATCH v2 4/4] perf-probe: Warn if the target function is GNU Indirect function |
| |
* Masami Hiramatsu <mhiramat@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 <andi@firstfloor.org> > Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org>
Looks good to me.
Reviewed-by: Srikar Dronamraju <srikar@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
| |