162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci#include <stdio.h> 362306a36Sopenharmony_ci#include <unistd.h> 462306a36Sopenharmony_ci#include <string.h> 562306a36Sopenharmony_ci#include <assert.h> 662306a36Sopenharmony_ci#include <bpf/libbpf.h> 762306a36Sopenharmony_ci#include <bpf/bpf.h> 862306a36Sopenharmony_ci#include "trace_helpers.h" 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ciint main(int ac, char **argv) 1162306a36Sopenharmony_ci{ 1262306a36Sopenharmony_ci struct bpf_object *obj = NULL; 1362306a36Sopenharmony_ci struct bpf_link *links[20]; 1462306a36Sopenharmony_ci long key, next_key, value; 1562306a36Sopenharmony_ci struct bpf_program *prog; 1662306a36Sopenharmony_ci int map_fd, i, j = 0; 1762306a36Sopenharmony_ci char filename[256]; 1862306a36Sopenharmony_ci struct ksym *sym; 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ci if (load_kallsyms()) { 2162306a36Sopenharmony_ci printf("failed to process /proc/kallsyms\n"); 2262306a36Sopenharmony_ci return 2; 2362306a36Sopenharmony_ci } 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_ci snprintf(filename, sizeof(filename), "%s.bpf.o", argv[0]); 2662306a36Sopenharmony_ci obj = bpf_object__open_file(filename, NULL); 2762306a36Sopenharmony_ci if (libbpf_get_error(obj)) { 2862306a36Sopenharmony_ci fprintf(stderr, "ERROR: opening BPF object file failed\n"); 2962306a36Sopenharmony_ci obj = NULL; 3062306a36Sopenharmony_ci goto cleanup; 3162306a36Sopenharmony_ci } 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_ci /* load BPF program */ 3462306a36Sopenharmony_ci if (bpf_object__load(obj)) { 3562306a36Sopenharmony_ci fprintf(stderr, "ERROR: loading BPF object file failed\n"); 3662306a36Sopenharmony_ci goto cleanup; 3762306a36Sopenharmony_ci } 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_ci map_fd = bpf_object__find_map_fd_by_name(obj, "my_map"); 4062306a36Sopenharmony_ci if (map_fd < 0) { 4162306a36Sopenharmony_ci fprintf(stderr, "ERROR: finding a map in obj file failed\n"); 4262306a36Sopenharmony_ci goto cleanup; 4362306a36Sopenharmony_ci } 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_ci bpf_object__for_each_program(prog, obj) { 4662306a36Sopenharmony_ci links[j] = bpf_program__attach(prog); 4762306a36Sopenharmony_ci if (libbpf_get_error(links[j])) { 4862306a36Sopenharmony_ci fprintf(stderr, "bpf_program__attach failed\n"); 4962306a36Sopenharmony_ci links[j] = NULL; 5062306a36Sopenharmony_ci goto cleanup; 5162306a36Sopenharmony_ci } 5262306a36Sopenharmony_ci j++; 5362306a36Sopenharmony_ci } 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_ci for (i = 0; i < 5; i++) { 5662306a36Sopenharmony_ci key = 0; 5762306a36Sopenharmony_ci printf("kprobing funcs:"); 5862306a36Sopenharmony_ci while (bpf_map_get_next_key(map_fd, &key, &next_key) == 0) { 5962306a36Sopenharmony_ci bpf_map_lookup_elem(map_fd, &next_key, &value); 6062306a36Sopenharmony_ci assert(next_key == value); 6162306a36Sopenharmony_ci sym = ksym_search(value); 6262306a36Sopenharmony_ci key = next_key; 6362306a36Sopenharmony_ci if (!sym) { 6462306a36Sopenharmony_ci printf("ksym not found. Is kallsyms loaded?\n"); 6562306a36Sopenharmony_ci continue; 6662306a36Sopenharmony_ci } 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_ci printf(" %s", sym->name); 6962306a36Sopenharmony_ci } 7062306a36Sopenharmony_ci if (key) 7162306a36Sopenharmony_ci printf("\n"); 7262306a36Sopenharmony_ci key = 0; 7362306a36Sopenharmony_ci while (bpf_map_get_next_key(map_fd, &key, &next_key) == 0) 7462306a36Sopenharmony_ci bpf_map_delete_elem(map_fd, &next_key); 7562306a36Sopenharmony_ci sleep(1); 7662306a36Sopenharmony_ci } 7762306a36Sopenharmony_ci 7862306a36Sopenharmony_cicleanup: 7962306a36Sopenharmony_ci for (j--; j >= 0; j--) 8062306a36Sopenharmony_ci bpf_link__destroy(links[j]); 8162306a36Sopenharmony_ci 8262306a36Sopenharmony_ci bpf_object__close(obj); 8362306a36Sopenharmony_ci return 0; 8462306a36Sopenharmony_ci} 85