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