目录
函数原型与解释
LIBBPF_API struct bpf_program* bpf_object__find_program_by_name(const struct bpf_object *obj, const char *name);
参数解释:
- obj:要在其中查找 BPF 程序的 BPF 对象。
- name:要查找的 BPF 程序的名称。
返回值:
- 如果找到了具有指定名称的 BPF 程序,则返回一个指向 struct bpf_program 类型的指针。如果未找到该程序,返回 NULL。
代码demo
#include <bpf/bpf_helpers.h> #include <linux/bpf.h> SEC("kprobe/__x64_sys_getpid") int bpf_prog1(struct pt_regs *ctx) { return 0; } char _license[] SEC("license") = "GPL";
#include <stdio.h> #include <stdlib.h> #include <bpf/libbpf.h> int main() { struct bpf_object *bpf_obj; struct bpf_program *bpf_prog; // 加载 BPF 程序 bpf_obj = bpf_object__open("prog.o"); if (libbpf_get_error(bpf_obj)) { fprintf(stderr, "Error opening BPF object: %d\n", libbpf_get_error(bpf_obj)); return 1; } // 使用名称查找 BPF 程序 bpf_prog = bpf_object__find_program_by_name(bpf_obj, "bpf_prog1"); if (bpf_prog == NULL) { fprintf(stderr, "BPF program not found\n"); bpf_object__close(bpf_obj); return 1; } printf("BPF program found: %s\n", "bpf_prog1"); // 关闭 BPF 对象 bpf_object__close(bpf_obj); return 0; }
makefile
CC = gcc CLANG = clang CFLAGS = -Wall -I/usr/include/bpf LDFLAGS = -lbpf BPF_TARGET = prog.o BPF_SRC = prog.c FIND_PROG_TARGET = find_prog_by_name FIND_PROG_SRC = find_prog_by_name.c all: $(BPF_TARGET) $(FIND_PROG_TARGET) $(BPF_TARGET): $(BPF_SRC) $(CLANG) -O2 -target bpf -g -c $(BPF_SRC) -o $(BPF_TARGET) $(FIND_PROG_TARGET): $(FIND_PROG_SRC) $(CC) $(CFLAGS) $(FIND_PROG_SRC) -o $(FIND_PROG_TARGET) $(LDFLAGS) clean: rm -f $(BPF_TARGET) $(FIND_PROG_TARGET) .PHONY: all clean
cmake
cmake_minimum_required(VERSION 3.10) project(bpf_find_prog_example) set(CMAKE_C_STANDARD 99) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall") find_library(LIBBPF libbpf.so REQUIRED) add_custom_command( OUTPUT prog.o COMMAND clang -O2 -target bpf -g -c ${CMAKE_CURRENT_SOURCE_DIR}/prog.c -o prog.o DEPENDS prog.c VERBATIM ) add_custom_target( prog_bpf DEPENDS prog.o ) add_executable(find_prog_by_name find_prog_by_name.c) target_link_libraries(find_prog_by_name ${LIBBPF}) target_include_directories(find_prog_by_name PUBLIC /usr/include/bpf)
期望输出
在上述示例中,get_object_name 程序加载 BPF 对象(prog.o),然后使用 bpf_object__name 函数获取其名称。输出为以下内容:
BPF program found: bpf_prog1