aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf/builtin-buildid-list.c
diff options
context:
space:
mode:
authorArnaldo Carvalho de Melo <acme@redhat.com>2011-08-29 07:33:17 -0400
committerArnaldo Carvalho de Melo <acme@redhat.com>2011-09-29 15:41:37 -0400
commit7a6f205d623afaf05aee387aa6bc57fa43421061 (patch)
tree30c3976fd7f4e028c6c3b7819e26a3db4059fbec /tools/perf/builtin-buildid-list.c
parentf2add9cd66c87baea6762b099ee38ee742207699 (diff)
perf buildid-list: Support showing the build id in an ELF file
Try first reading the build id, validating that it is an ELF file, etc. Cheap as libelf will bail out as soon as the magic number check fails. Useful when investigating debuginfo packaging problems like this one: [root@emilia ~]# perf buildid-list -i /usr/lib/debug/lib/modules/`uname -r`/vmlinux 77bb4ea591a602d455ace759a377c9adfff1aba3 [root@emilia ~]# perf buildid-list -k 07b0c016a2b30004e86132d0239945b1e88f5d75 [root@emilia ~]# Cc: David Ahern <dsahern@gmail.com> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Mike Galbraith <efault@gmx.de> Cc: Paul Mackerras <paulus@samba.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Stephane Eranian <eranian@google.com> Link: http://lkml.kernel.org/n/tip-4elot9oxwa0rr0d90dshca3a@git.kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools/perf/builtin-buildid-list.c')
-rw-r--r--tools/perf/builtin-buildid-list.c27
1 files changed, 24 insertions, 3 deletions
diff --git a/tools/perf/builtin-buildid-list.c b/tools/perf/builtin-buildid-list.c
index 4102eadcf84..cb690a65bf0 100644
--- a/tools/perf/builtin-buildid-list.c
+++ b/tools/perf/builtin-buildid-list.c
@@ -1,8 +1,8 @@
1/* 1/*
2 * builtin-buildid-list.c 2 * builtin-buildid-list.c
3 * 3 *
4 * Builtin buildid-list command: list buildids in perf.data or in the running 4 * Builtin buildid-list command: list buildids in perf.data, in the running
5 * kernel. 5 * kernel and in ELF files.
6 * 6 *
7 * Copyright (C) 2009, Red Hat Inc. 7 * Copyright (C) 2009, Red Hat Inc.
8 * Copyright (C) 2009, Arnaldo Carvalho de Melo <acme@redhat.com> 8 * Copyright (C) 2009, Arnaldo Carvalho de Melo <acme@redhat.com>
@@ -16,6 +16,8 @@
16#include "util/session.h" 16#include "util/session.h"
17#include "util/symbol.h" 17#include "util/symbol.h"
18 18
19#include <libelf.h>
20
19static char const *input_name = "perf.data"; 21static char const *input_name = "perf.data";
20static bool force; 22static bool force;
21static bool show_kernel; 23static bool show_kernel;
@@ -70,12 +72,31 @@ static int sysfs__fprintf_build_id(FILE *fp)
70 return 0; 72 return 0;
71} 73}
72 74
73static int __cmd_buildid_list(void) 75static int filename__fprintf_build_id(const char *name, FILE *fp)
74{ 76{
77 u8 build_id[BUILD_ID_SIZE];
78 char sbuild_id[BUILD_ID_SIZE * 2 + 1];
75 79
80 if (filename__read_build_id(name, build_id,
81 sizeof(build_id)) != sizeof(build_id))
82 return 0;
83
84 build_id__sprintf(build_id, sizeof(build_id), sbuild_id);
85 return fprintf(fp, "%s\n", sbuild_id);
86}
87
88static int __cmd_buildid_list(void)
89{
76 if (show_kernel) 90 if (show_kernel)
77 return sysfs__fprintf_build_id(stdout); 91 return sysfs__fprintf_build_id(stdout);
78 92
93 elf_version(EV_CURRENT);
94 /*
95 * See if this is an ELF file first:
96 */
97 if (filename__fprintf_build_id(input_name, stdout))
98 return 0;
99
79 return perf_session__list_build_ids(); 100 return perf_session__list_build_ids();
80} 101}
81 102