1 | // SPDX-License-Identifier: GPL-2.0 |
2 | #include <stdio.h> |
3 | #include <unistd.h> |
4 | #include <string.h> |
5 | #include <assert.h> |
6 | #include <bpf/libbpf.h> |
7 | #include <bpf/bpf.h> |
8 | #include "trace_helpers.h" |
9 | |
10 | int main(int ac, char **argv) |
11 | { |
12 | struct bpf_object *obj = NULL; |
13 | struct bpf_link *links[20]; |
14 | long key, next_key, value; |
15 | struct bpf_program *prog; |
16 | int map_fd, i, j = 0; |
17 | char filename[256]; |
18 | struct ksym *sym; |
19 | |
20 | if (load_kallsyms()) { |
21 | printf(format: "failed to process /proc/kallsyms\n" ); |
22 | return 2; |
23 | } |
24 | |
25 | snprintf(s: filename, maxlen: sizeof(filename), format: "%s.bpf.o" , argv[0]); |
26 | obj = bpf_object__open_file(filename, NULL); |
27 | if (libbpf_get_error(obj)) { |
28 | fprintf(stderr, format: "ERROR: opening BPF object file failed\n" ); |
29 | obj = NULL; |
30 | goto cleanup; |
31 | } |
32 | |
33 | /* load BPF program */ |
34 | if (bpf_object__load(obj)) { |
35 | fprintf(stderr, format: "ERROR: loading BPF object file failed\n" ); |
36 | goto cleanup; |
37 | } |
38 | |
39 | map_fd = bpf_object__find_map_fd_by_name(obj, "my_map" ); |
40 | if (map_fd < 0) { |
41 | fprintf(stderr, format: "ERROR: finding a map in obj file failed\n" ); |
42 | goto cleanup; |
43 | } |
44 | |
45 | bpf_object__for_each_program(prog, obj) { |
46 | links[j] = bpf_program__attach(prog); |
47 | if (libbpf_get_error(links[j])) { |
48 | fprintf(stderr, format: "bpf_program__attach failed\n" ); |
49 | links[j] = NULL; |
50 | goto cleanup; |
51 | } |
52 | j++; |
53 | } |
54 | |
55 | for (i = 0; i < 5; i++) { |
56 | key = 0; |
57 | printf(format: "kprobing funcs:" ); |
58 | while (bpf_map_get_next_key(map_fd, &key, &next_key) == 0) { |
59 | bpf_map_lookup_elem(map_fd, &next_key, &value); |
60 | assert(next_key == value); |
61 | sym = ksym_search(value); |
62 | key = next_key; |
63 | if (!sym) { |
64 | printf(format: "ksym not found. Is kallsyms loaded?\n" ); |
65 | continue; |
66 | } |
67 | |
68 | printf(format: " %s" , sym->name); |
69 | } |
70 | if (key) |
71 | printf(format: "\n" ); |
72 | key = 0; |
73 | while (bpf_map_get_next_key(map_fd, &key, &next_key) == 0) |
74 | bpf_map_delete_elem(map_fd, &next_key); |
75 | sleep(seconds: 1); |
76 | } |
77 | |
78 | cleanup: |
79 | for (j--; j >= 0; j--) |
80 | bpf_link__destroy(links[j]); |
81 | |
82 | bpf_object__close(obj); |
83 | return 0; |
84 | } |
85 | |