目录
获取给定 bpf_object 的内核版本
函数原型与解释
LIBBPF_API unsigned int bpf_object__kversion(const struct bpf_object *obj);
参数解释:
- obj:要获取其内核版本的 bpf_object 实例。
返回值:
- 返回一个无符号整数,表示 bpf_object 的内核版本。如果未设置内核版本,返回 0。
代码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"; const volatile unsigned int _version SEC("version") = 0x050800;
#include <stdio.h> #include <stdlib.h> #include <bpf/libbpf.h> int main() { struct bpf_object *bpf_obj; // 加载 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 对象的内核版本 unsigned int kversion = bpf_object__kversion(bpf_obj); printf("BPF object kernel version: %u\n", kversion); // 关闭 BPF 对象 bpf_object__close(bpf_obj); return 0; }
clang -O2 -target bpf -c prog.c -o prog.o gcc -I/usr/include/bpf -o pin_bpf_prog pin_bpf_prog.c -lbpf sudo mkdir -p /sys/fs/bpf/example_program sudo ./pin_bpf_prog /sys/fs/bpf/example_program/prog1
makefile
CC = gcc CLANG = clang CFLAGS = -Wall -I/usr/include/bpf LDFLAGS = -lbpf BPF_TARGET = prog.o BPF_SRC = prog.c KVERSION_TARGET = get_kversion KVERSION_SRC = get_kversion.c all: $(BPF_TARGET) $(KVERSION_TARGET) $(BPF_TARGET): $(BPF_SRC) $(CLANG) -O2 -target bpf -c $(BPF_SRC) -o $(BPF_TARGET) $(KVERSION_TARGET): $(KVERSION_SRC) $(CC) $(CFLAGS) $(KVERSION_SRC) -o $(KVERSION_TARGET) $(LDFLAGS) clean: rm -f $(BPF_TARGET) $(KVERSION_TARGET) .PHONY: all clean
cmake
cmake_minimum_required(VERSION 3.10) project(bpf_kversion_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 -c ${CMAKE_CURRENT_SOURCE_DIR}/prog.c -o prog.o DEPENDS prog.c VERBATIM ) add_custom_target( prog_bpf DEPENDS prog.o ) add_executable(get_kversion get_kversion.c) target_link_libraries(get_kversion ${LIBBPF}) target_include_directories(get_kversion PUBLIC /usr/include/bpf)
期望输出
在上述示例中,get_object_name 程序加载 BPF 对象(prog.o),然后使用 bpf_object__name 函数获取其名称。输出为以下内容:
BPF object kernel version: 331776
用16进制表示就是0x050800
major = (kversion >> 16) & 0xff; minor = (kversion >> 8) & 0xff; patch = kversion & 0xff;
这将输出内核版本 5.8.0。
为给定的 bpf_object 设置内核版本
函数原型与解释
LIBBPF_API int bpf_object__set_kversion(struct bpf_object *obj, __u32 kern_version);
参数解释:
- obj:要设置其内核版本的 bpf_object 实例。
- kern_version:要设置的内核版本,为 32 位无符号整数。
返回值:
- 返回 0 表示成功,其他值表示出现错误。
代码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; __u32 new_kversion = 0x050800; // 设置内核版本为 5.8.0 // 加载 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 对象的内核版本 int ret = bpf_object__set_kversion(bpf_obj, new_kversion); if (ret) { fprintf(stderr, "Error setting BPF object kernel version: %d\n", ret); bpf_object__close(bpf_obj); return 1; } // 获取 BPF 对象的内核版本
makefile
CC = gcc CLANG = clang CFLAGS = -Wall -I/usr/include/bpf LDFLAGS = -lbpf BPF_TARGET = prog.o BPF_SRC = prog.c KVERSION_TARGET = set_kversion KVERSION_SRC = set_kversion.c all: $(BPF_TARGET) $(KVERSION_TARGET) $(BPF_TARGET): $(BPF_SRC) $(CLANG) -O2 -target bpf -c $(BPF_SRC) -o $(BPF_TARGET) $(KVERSION_TARGET): $(KVERSION_SRC) $(CC) $(CFLAGS) $(KVERSION_SRC) -o $(KVERSION_TARGET) $(LDFLAGS) clean: rm -f $(BPF_TARGET) $(KVERSION_TARGET) .PHONY: all clean
cmake
cmake_minimum_required(VERSION 3.10) project(bpf_kversion_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 -c ${CMAKE_CURRENT_SOURCE_DIR}/prog.c -o prog.o DEPENDS prog.c VERBATIM ) add_custom_target( prog_bpf DEPENDS prog.o ) add_executable(get_kversion get_kversion.c) target_link_libraries(get_kversion ${LIBBPF}) target_include_directories(get_kversion PUBLIC /usr/include/bpf)
期望输出
在上述示例中,get_object_name 程序加载 BPF 对象(prog.o),然后使用 bpf_object__name 函数获取其名称。输出为以下内容:
BPF object kernel version: 331776
用16进制表示就是0x050800
major = (kversion >> 16) & 0xff; minor = (kversion >> 8) & 0xff; patch = kversion & 0xff;
这将输出内核版本 5.8.0。