1 | // SPDX-License-Identifier: GPL-2.0-only |
2 | /* |
3 | * builtin-kallsyms.c |
4 | * |
5 | * Builtin command: Look for a symbol in the running kernel and its modules |
6 | * |
7 | * Copyright (C) 2017, Red Hat Inc, Arnaldo Carvalho de Melo <acme@redhat.com> |
8 | */ |
9 | #include <inttypes.h> |
10 | #include "builtin.h" |
11 | #include <linux/compiler.h> |
12 | #include <subcmd/parse-options.h> |
13 | #include "debug.h" |
14 | #include "dso.h" |
15 | #include "machine.h" |
16 | #include "map.h" |
17 | #include "symbol.h" |
18 | |
19 | static int __cmd_kallsyms(int argc, const char **argv) |
20 | { |
21 | int i; |
22 | struct machine *machine = machine__new_kallsyms(); |
23 | |
24 | if (machine == NULL) { |
25 | pr_err("Couldn't read /proc/kallsyms\n" ); |
26 | return -1; |
27 | } |
28 | |
29 | for (i = 0; i < argc; ++i) { |
30 | struct map *map; |
31 | const struct dso *dso; |
32 | struct symbol *symbol = machine__find_kernel_symbol_by_name(machine, argv[i], &map); |
33 | |
34 | if (symbol == NULL) { |
35 | printf("%s: not found\n" , argv[i]); |
36 | continue; |
37 | } |
38 | |
39 | dso = map__dso(map); |
40 | printf("%s: %s %s %#" PRIx64 "-%#" PRIx64 " (%#" PRIx64 "-%#" PRIx64")\n" , |
41 | symbol->name, dso->short_name, dso->long_name, |
42 | map__unmap_ip(map, symbol->start), map__unmap_ip(map, symbol->end), |
43 | symbol->start, symbol->end); |
44 | } |
45 | |
46 | machine__delete(machine); |
47 | return 0; |
48 | } |
49 | |
50 | int cmd_kallsyms(int argc, const char **argv) |
51 | { |
52 | const struct option options[] = { |
53 | OPT_INCR('v', "verbose" , &verbose, "be more verbose (show counter open errors, etc)" ), |
54 | OPT_END() |
55 | }; |
56 | const char * const kallsyms_usage[] = { |
57 | "perf kallsyms [<options>] symbol_name" , |
58 | NULL |
59 | }; |
60 | |
61 | argc = parse_options(argc, argv, options, kallsyms_usage, 0); |
62 | if (argc < 1) |
63 | usage_with_options(kallsyms_usage, options); |
64 | |
65 | symbol_conf.try_vmlinux_path = (symbol_conf.vmlinux_name == NULL); |
66 | if (symbol__init(NULL) < 0) |
67 | return -1; |
68 | |
69 | return __cmd_kallsyms(argc, argv); |
70 | } |
71 | |