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 char filename[256], symbol[256]; 13 struct bpf_object *obj = NULL; 14 struct bpf_link *links[20]; 15 long key, next_key, value; 16 struct bpf_program *prog; 17 int map_fd, i, j = 0; 18 const char *section; 19 struct ksym *sym; 20 21 if (load_kallsyms()) { 22 printf("failed to process /proc/kallsyms\n"); 23 return 2; 24 } 25 26 snprintf(filename, sizeof(filename), "%s_kern.o", argv[0]); 27 obj = bpf_object__open_file(filename, NULL); 28 if (libbpf_get_error(obj)) { 29 fprintf(stderr, "ERROR: opening BPF object file failed\n"); 30 obj = NULL; 31 goto cleanup; 32 } 33 34 /* load BPF program */ 35 if (bpf_object__load(obj)) { 36 fprintf(stderr, "ERROR: loading BPF object file failed\n"); 37 goto cleanup; 38 } 39 40 map_fd = bpf_object__find_map_fd_by_name(obj, "my_map"); 41 if (map_fd < 0) { 42 fprintf(stderr, "ERROR: finding a map in obj file failed\n"); 43 goto cleanup; 44 } 45 46 bpf_object__for_each_program(prog, obj) { 47 section = bpf_program__section_name(prog); 48 if (sscanf(section, "kprobe/%s", symbol) != 1) 49 continue; 50 51 /* Attach prog only when symbol exists */ 52 if (ksym_get_addr(symbol)) { 53 links[j] = bpf_program__attach(prog); 54 if (libbpf_get_error(links[j])) { 55 fprintf(stderr, "bpf_program__attach failed\n"); 56 links[j] = NULL; 57 goto cleanup; 58 } 59 j++; 60 } 61 } 62 63 for (i = 0; i < 5; i++) { 64 key = 0; 65 printf("kprobing funcs:"); 66 while (bpf_map_get_next_key(map_fd, &key, &next_key) == 0) { 67 bpf_map_lookup_elem(map_fd, &next_key, &value); 68 assert(next_key == value); 69 sym = ksym_search(value); 70 key = next_key; 71 if (!sym) { 72 printf("ksym not found. Is kallsyms loaded?\n"); 73 continue; 74 } 75 76 printf(" %s", sym->name); 77 } 78 if (key) 79 printf("\n"); 80 key = 0; 81 while (bpf_map_get_next_key(map_fd, &key, &next_key) == 0) 82 bpf_map_delete_elem(map_fd, &next_key); 83 sleep(1); 84 } 85 86 cleanup: 87 for (j--; j >= 0; j--) 88 bpf_link__destroy(links[j]); 89 90 bpf_object__close(obj); 91 return 0; 92 } 93