• Kirill Smelkov's avatar
    perf annotate: Fix it for non-prelinked *.so · 7a2b6209
    Kirill Smelkov authored
    The problem was we were incorrectly calculating objdump
    addresses for sym->start and sym->end, look:
    
    For simple ET_DYN type DSO (*.so) with one function, objdump -dS
    output is something like this:
    
        000004ac <my_strlen>:
        int my_strlen(const char *s)
         4ac:   55                      push   %ebp
         4ad:   89 e5                   mov    %esp,%ebp
         4af:   83 ec 10                sub    $0x10,%esp
        {
    
    i.e. we have relative-to-dso-mapping IPs (=RIP) there.
    
    For ET_EXEC type and probably for prelinked libs as well (sorry
    can't test - I don't use prelink) objdump outputs absolute IPs,
    e.g.
    
        08048604 <zz_strlen>:
        extern "C"
        int zz_strlen(const char *s)
         8048604:       55                      push   %ebp
         8048605:       89 e5                   mov    %esp,%ebp
         8048607:       83 ec 10                sub    $0x10,%esp
        {
    
    So, if sym->start is always relative to dso mapping(*), we'll
    have to unmap it for ET_EXEC like cases, and leave as is for
    ET_DYN cases.
    
    (*) and it is - we've explicitely made it relative. Look for
        adjust_symbols handling in dso__load_sym()
    
    Previously we were always unmapping sym->start and for ET_DYN
    dsos resulting addresses were wrong, and so objdump output was
    empty.
    
    The end result was that perf annotate output for symbols from
    non-prelinked *.so had always 0.00% percents only, which is
    wrong.
    
    To fix it, let's introduce a helper for converting rip to
    objdump address, and also let's document what map_ip() and
    unmap_ip() do -- I had to study sources for several hours to
    understand it.
    Signed-off-by: default avatarKirill Smelkov <kirr@landau.phys.spbu.ru>
    Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    Cc: Mike Galbraith <efault@gmx.de>
    LKML-Reference: <1265223128-11786-8-git-send-email-acme@infradead.org>
    Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
    7a2b6209
builtin-annotate.c 11.7 KB