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