aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf/util/annotate.c
diff options
context:
space:
mode:
authorAdrian Hunter <adrian.hunter@intel.com>2013-10-09 08:01:12 -0400
committerArnaldo Carvalho de Melo <acme@redhat.com>2013-10-14 09:29:00 -0400
commitafba19d9dc8eba66ea26901708cf99354c637786 (patch)
tree3b96f6610f8b776d4a4f9836205321bda4b143fd /tools/perf/util/annotate.c
parent52afdaf9f0c6a35e154ba42ac9510044e16d75ec (diff)
perf symbols: Workaround objdump difficulties with kcore
The objdump tool fails to annotate module symbols when looking at kcore. Workaround this by extracting object code from kcore and putting it in a temporary file for objdump to use instead. The temporary file is created to look like kcore but contains only the function being disassembled. Signed-off-by: Adrian Hunter <adrian.hunter@intel.com> Cc: David Ahern <dsahern@gmail.com> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Jiri Olsa <jolsa@redhat.com> Cc: Mike Galbraith <efault@gmx.de> Cc: Namhyung Kim <namhyung@gmail.com> Cc: Paul Mackerras <paulus@samba.org> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: Stephane Eranian <eranian@google.com> Link: http://lkml.kernel.org/r/1381320078-16497-3-git-send-email-adrian.hunter@intel.com [ Renamed 'index' to 'idx' to avoid shadowing string.h's 'index' in Fedora 12, Replace local with variable length with malloc/free to fix build in Fedora 12 ] Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools/perf/util/annotate.c')
-rw-r--r--tools/perf/util/annotate.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/tools/perf/util/annotate.c b/tools/perf/util/annotate.c
index d73e8008aada..882bb864cee0 100644
--- a/tools/perf/util/annotate.c
+++ b/tools/perf/util/annotate.c
@@ -879,6 +879,8 @@ int symbol__annotate(struct symbol *sym, struct map *map, size_t privsize)
879 FILE *file; 879 FILE *file;
880 int err = 0; 880 int err = 0;
881 char symfs_filename[PATH_MAX]; 881 char symfs_filename[PATH_MAX];
882 struct kcore_extract kce;
883 bool delete_extract = false;
882 884
883 if (filename) { 885 if (filename) {
884 snprintf(symfs_filename, sizeof(symfs_filename), "%s%s", 886 snprintf(symfs_filename, sizeof(symfs_filename), "%s%s",
@@ -940,6 +942,23 @@ fallback:
940 pr_debug("annotating [%p] %30s : [%p] %30s\n", 942 pr_debug("annotating [%p] %30s : [%p] %30s\n",
941 dso, dso->long_name, sym, sym->name); 943 dso, dso->long_name, sym, sym->name);
942 944
945 if (dso__is_kcore(dso)) {
946 kce.kcore_filename = symfs_filename;
947 kce.addr = map__rip_2objdump(map, sym->start);
948 kce.offs = sym->start;
949 kce.len = sym->end + 1 - sym->start;
950 if (!kcore_extract__create(&kce)) {
951 delete_extract = true;
952 strlcpy(symfs_filename, kce.extract_filename,
953 sizeof(symfs_filename));
954 if (free_filename) {
955 free(filename);
956 free_filename = false;
957 }
958 filename = symfs_filename;
959 }
960 }
961
943 snprintf(command, sizeof(command), 962 snprintf(command, sizeof(command),
944 "%s %s%s --start-address=0x%016" PRIx64 963 "%s %s%s --start-address=0x%016" PRIx64
945 " --stop-address=0x%016" PRIx64 964 " --stop-address=0x%016" PRIx64
@@ -972,6 +991,8 @@ fallback:
972 991
973 pclose(file); 992 pclose(file);
974out_free_filename: 993out_free_filename:
994 if (delete_extract)
995 kcore_extract__delete(&kce);
975 if (free_filename) 996 if (free_filename)
976 free(filename); 997 free(filename);
977 return err; 998 return err;