Em Mon, Nov 26, 2018 at 09:39:17AM +0100, Jiri Olsa escreveu:
> On Fri, Nov 23, 2018 at 10:24:21AM -0800, Eric Saint Etienne wrote:
> > > > +               /*
> > > > +                * When using -ffunction-sections, only .text gets 
> > > > loaded by
> > > > +                * map_groups__find() into al->map. Consequently 
> > > > al->map address
> > > > +                * range encompass the whole code.
> > > > +                *
> > > > +                * But map__load() has just loaded many function maps by
> > > > +                * splitting al->map, which reduced al->map range 
> > > > drastically.
> > > > +                * Very likely the target address is now in one of 
> > > > those newly
> > > > +                * created function maps, so we need to lookup the map 
> > > > again
> > > > +                * to find that new map.
> > > > +                */
> > > 
> > > hum, so map__load actualy can split the map to create new maps?
> > > 
> > > cold you please point me to that code? I haven't touch this area for some
> > > time and I can't find it
> > 
> > The split happens in dso_process_kernel_symbol() in symbol-elf.c where we
> > call map_groups__find_by_name() to find an existing map, but with
> > -ffunction-sections and a symbol belonging to new (function) map, such map
> > doesn't exist yet so we end up creating one and adjusting existing maps
> > accordingly because adjust_kernel_syms is set. Makes sense?
> > 
> > As of 4.20-rc3 the call chain is as follows:
> > event:c:1573           map__load()
> > map.c:315      dso__load()
> > symobl.c:1528          dso__load_kernel_sym()
> > symbol.c:1896          dso__load_vmlinux_path()
> >                (or we directly call dso__load_vmlinux() at line 1892)
> > symbol.c:1744          dso__load_vmlinux()
> > symbol.c:1719          dso__load_sym()
> > symbol-elf.c:1090  dso_process_kernel_symbol()
> 
> i see, thank for the pointers.. could you please mention
> this in your comment and changelog as well?
> 
> also to document in the code that it's related to map__load
> could you put it to the if contidion, like:
> 
> +               if (load_map && (al->addr < al->map->start || al->addr >= 
> al->map->end))
> 

Eric, please address Jiri's comments and send a v2, ok?

- Arnaldo

Reply via email to