7a2b620986
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: Kirill Smelkov <kirr@landau.phys.spbu.ru> Signed-off-by: Arnaldo 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: Ingo Molnar <mingo@elte.hu> |
||
---|---|---|
.. | ||
include | ||
abspath.c | ||
alias.c | ||
build-id.c | ||
build-id.h | ||
cache.h | ||
callchain.c | ||
callchain.h | ||
color.c | ||
color.h | ||
config.c | ||
ctype.c | ||
debug.c | ||
debug.h | ||
debugfs.c | ||
debugfs.h | ||
environment.c | ||
event.c | ||
event.h | ||
exec_cmd.c | ||
exec_cmd.h | ||
generate-cmdlist.sh | ||
header.c | ||
header.h | ||
help.c | ||
help.h | ||
hist.c | ||
hist.h | ||
levenshtein.c | ||
levenshtein.h | ||
map.c | ||
map.h | ||
pager.c | ||
parse-events.c | ||
parse-events.h | ||
parse-options.c | ||
parse-options.h | ||
path.c | ||
PERF-VERSION-GEN | ||
probe-event.c | ||
probe-event.h | ||
probe-finder.c | ||
probe-finder.h | ||
quote.c | ||
quote.h | ||
run-command.c | ||
run-command.h | ||
session.c | ||
session.h | ||
sigchain.c | ||
sigchain.h | ||
sort.c | ||
sort.h | ||
strbuf.c | ||
strbuf.h | ||
string.c | ||
string.h | ||
strlist.c | ||
strlist.h | ||
svghelper.c | ||
svghelper.h | ||
symbol.c | ||
symbol.h | ||
thread.c | ||
thread.h | ||
trace-event-info.c | ||
trace-event-parse.c | ||
trace-event-perl.c | ||
trace-event-perl.h | ||
trace-event-read.c | ||
trace-event.h | ||
types.h | ||
usage.c | ||
util.c | ||
util.h | ||
values.c | ||
values.h | ||
wrapper.c |