]>
Commit | Line | Data |
---|---|---|
91007045 | 1 | // SPDX-License-Identifier: GPL-2.0-only |
35563771 ACM |
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 <[email protected]> | |
35563771 | 8 | */ |
fd20e811 | 9 | #include <inttypes.h> |
35563771 ACM |
10 | #include "builtin.h" |
11 | #include <linux/compiler.h> | |
12 | #include <subcmd/parse-options.h> | |
13 | #include "debug.h" | |
4a3cec84 | 14 | #include "dso.h" |
35563771 | 15 | #include "machine.h" |
1101f69a | 16 | #include "map.h" |
35563771 ACM |
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; | |
107cad95 | 31 | struct symbol *symbol = machine__find_kernel_symbol_by_name(machine, argv[i], &map); |
35563771 ACM |
32 | |
33 | if (symbol == NULL) { | |
34 | printf("%s: not found\n", argv[i]); | |
35 | continue; | |
36 | } | |
37 | ||
38 | printf("%s: %s %s %#" PRIx64 "-%#" PRIx64 " (%#" PRIx64 "-%#" PRIx64")\n", | |
39 | symbol->name, map->dso->short_name, map->dso->long_name, | |
40 | map->unmap_ip(map, symbol->start), map->unmap_ip(map, symbol->end), | |
41 | symbol->start, symbol->end); | |
42 | } | |
43 | ||
44 | machine__delete(machine); | |
45 | return 0; | |
46 | } | |
47 | ||
b0ad8ea6 | 48 | int cmd_kallsyms(int argc, const char **argv) |
35563771 ACM |
49 | { |
50 | const struct option options[] = { | |
51 | OPT_INCR('v', "verbose", &verbose, "be more verbose (show counter open errors, etc)"), | |
52 | OPT_END() | |
53 | }; | |
54 | const char * const kallsyms_usage[] = { | |
55 | "perf kallsyms [<options>] symbol_name", | |
56 | NULL | |
57 | }; | |
58 | ||
59 | argc = parse_options(argc, argv, options, kallsyms_usage, 0); | |
60 | if (argc < 1) | |
61 | usage_with_options(kallsyms_usage, options); | |
62 | ||
63 | symbol_conf.sort_by_name = true; | |
64 | symbol_conf.try_vmlinux_path = (symbol_conf.vmlinux_name == NULL); | |
65 | if (symbol__init(NULL) < 0) | |
66 | return -1; | |
67 | ||
68 | return __cmd_kallsyms(argc, argv); | |
69 | } |