[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20160806192948.e366f3fbc4b194de600f8326@kernel.org>
Date: Sat, 6 Aug 2016 19:29:48 +0900
From: Masami Hiramatsu <mhiramat@...nel.org>
To: Arnaldo Carvalho de Melo <acme@...nel.org>
Cc: Arnaldo Carvalho de Melo <arnaldo.melo@...il.com>,
"Wangnan (F)" <wangnan0@...wei.com>,
Alexei Starovoitov <alexei.starovoitov@...il.com>,
Linux Kernel Mailing List <linux-kernel@...r.kernel.org>
Subject: Re: perf test BPF failing on f24: fix
On Fri, 5 Aug 2016 11:35:32 -0300
Arnaldo Carvalho de Melo <acme@...nel.org> wrote:
> Em Fri, Aug 05, 2016 at 06:45:50PM +0900, Masami Hiramatsu escreveu:
> > On Thu, 4 Aug 2016 18:47:24 -0300
> > Arnaldo Carvalho de Melo <acme@...nel.org> wrote:
> >
> > > Em Thu, Aug 04, 2016 at 04:36:56PM -0300, Arnaldo Carvalho de Melo escreveu:
> > > > So:
> > > >
> > > > int err = debuginfo__get_text_offset(dbg, &baseaddr);
> > > >
> > > > is returning 0, no relocation, its dwarf_addrdie() that is not finding
> > > > SyS_epoll_wait from its address.
> > > >
> > > > Trying to figure out why dwarf_addrdie(0xffffffffbd295b50) fails...
> > >
> > > So, trying to use that vmlinux with objdump to do disassembly I found
> > > that I need to do some offsetting, and after calculating it, this made
> > > things works for me:
> > >
> > > diff --git a/tools/perf/util/probe-finder.c b/tools/perf/util/probe-finder.c
> > > index f2d9ff064e2d..9b95754f28ed 100644
> > > --- a/tools/perf/util/probe-finder.c
> > > +++ b/tools/perf/util/probe-finder.c
> > > @@ -1486,6 +1486,8 @@ retry:
> > > /* Find cu die */
> > > if (!dwarf_addrdie(dbg->dbg, (Dwarf_Addr)addr, &cudie)) {
> > > if (!reloc && debuginfo__get_text_offset(dbg, &baseaddr) == 0) {
> > > + if (baseaddr == 0)
> > > + baseaddr = -0x3c000000;
> >
> > Hmm, strange... what's this magic number ...?
> > Actually debuginfo__get_text_offset() is for kernel modules and it relocate the offset.
I've found "commit f90acac75713cc6f18a4b2f1b9162bc1cd893c20"
Actually, I forgot to count the relocation at find_alternative_probe_point().
Could you try the patch below?
------
perf-probe: Adjust map->reloc offset when finding kernel symbol from map
From: Masami Hiramatsu <masami.hiramatsu@...aro.org>
Adjust map->reloc offset for the unmapped address when
finding alternative symbol address from map, because
KASLR can relocate the kernel symbol address.
The same adjustment has been done when finding appropriate
kernel symbol address from map which was introduced by
commit f90acac75713 ("perf probe: Find given address from offline dwarf")
Reported-by: Arnaldo Carvalho de Melo <acme@...nel.org>
Signed-off-by: Masami Hiramatsu <masami.hiramatsu@...aro.org>
---
tools/perf/util/probe-event.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c
index 953dc1a..d5ccb65 100644
--- a/tools/perf/util/probe-event.c
+++ b/tools/perf/util/probe-event.c
@@ -385,7 +385,7 @@ static int find_alternative_probe_point(struct debuginfo *dinfo,
if (uprobes)
address = sym->start;
else
- address = map->unmap_ip(map, sym->start);
+ address = map->unmap_ip(map, sym->start) - map->reloc;
break;
}
if (!address) {
Powered by blists - more mailing lists