C++ 怎么在用户态通过 libbpf 加载和卸载内核 eBPF 字节码程序

酷雪君_1875

酷雪君_1875

2026-11-04

736人浏览

原创

libbpf加载eBPF程序必须先调用bpf_object__open()解析ELF、BTF和maps,再调用bpf_object__load()校验并提交至内核;跳过open会崩溃,只open不load则程序不运行,且后续attach挂载hook不可省略。

c++ 怎么在用户态通过 libbpf 加载和卸载内核 ebpf 字节码程序

libbpf 加载 eBPF 程序前必须调用 bpf_object__open() 和 bpf_object__load()

用户态加载 eBPF 程序不是直接把字节码喂给内核,而是走 libbpf 的对象生命周期管理。漏掉任一环节都会导致 NULL 指针或 -EINVAL 错误。

典型流程是:bpf_object__open() 解析 BTF、重定位、初始化 map;bpf_object__load() 才真正校验并提交到内核。跳过 open 直接 load 会 segfault;只 open 不 load 则程序不会运行。

  • bpf_object__open_file() 接收的是 ELF 格式的 .o 文件(由 clang -target bpf -O2 -g -c 生成),不是原始字节码数组
  • 如果编译时没加 -g,bpf_object__load() 可能因缺失 BTF 而失败(尤其在较新内核上默认启用 BTF 验证)
  • 加载失败时,用 libbpf_get_error() 获取具体错误码,常见如 -EACCES(没权限)、-ENOENT(找不到 program section)

卸载靠 bpf_object__close(),但必须确保所有 fd 已释放

libbpf 不提供显式的 “unload” 函数,卸载动作发生在 bpf_object__close() 内部:它会自动 close 所有已创建的 program fd、map fd 和 link fd。但前提是这些 fd 没被用户代码重复 close 或提前泄漏。

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载
  • 若手动调用过 close() 某个 map fd,再执行 bpf_object__close() 会导致 double-close,可能触发内核警告或用户态 abort
  • 若程序通过 bpf_program__attach() 创建了 link(如 tracepoint、kprobe),bpf_object__close() 会自动 detach,但 detach 失败不会中断 close 流程——需检查返回值或日志确认是否真卸载成功
  • 未调用 bpf_object__close() 就退出进程,内核会自动回收资源,但 map 中数据残留、tracepoint hook 未解绑等副作用仍可能发生

加载后获取 program fd 并 attach 是两步,不能省略 bpf_program__attach()

调用 bpf_object__load() 后,eBPF 程序只是“就绪”,还没挂到任何内核 hook 点。必须显式调用 bpf_program__attach() 或其封装函数(如 bpf_link_create())才能生效。

  • 对 tracepoint:用 bpf_program__attach_tracepoint(),参数是 "category:event" 字符串,拼错 category 会返回 -ENOENT
  • 对 kprobe:用 bpf_program__attach_kprobe(),symbol 名必须和 /proc/kallsyms 中完全一致(包括 _text 偏移或 .isra. 后缀),否则 attach 失败且无明显提示
  • attach 返回非负 fd 表示成功;返回负值需用 libbpf_get_error() 查原因,不要直接忽略

常见崩溃点:多线程下 bpf_object 不可共享,且 libbpf_set_strict_mode() 影响行为

同一个 struct bpf_object * 实例不能跨线程调用 bpf_object__load() 或 bpf_object__close() —— libbpf 内部状态(如重定位表、map 初始化标记)不是线程安全的。同时,libbpf 默认开启严格模式,某些旧版 ELF 结构会被拒绝。

  • 多线程场景应每个线程独立 bpf_object__open_file() + load + close,或由主线程完成加载后,仅共享 program fd / map fd(它们是内核句柄,可 dup() 传递)
  • 遇到 "unrecognized ELF section" 或 "invalid relo data",尝试在 bpf_object__open() 前调用 libbpf_set_strict_mode(LIBBPF_STRICT_NONE),但这是临时绕过,根本解法是升级 clang/libbpf 版本并统一编译链路
  • 使用 bpftool prog list 和 bpftool map dump id X 是验证加载/卸载是否成功的最直接方式,比单看 return code 更可靠

实际调试中最容易卡住的,是以为 bpf_object__load() 成功就等于程序已运行——其实它连一个 hook 都没挂。attach 这一步既不可跳过,又极易因 symbol 名、event 名拼写或权限问题静默失败。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关专题

更多
c++和c语言的区别有哪些
c++和c语言的区别有哪些

c++和c语言的区别:1、面向对象编程(OOP)支持不同;2、新增特性不同;3、标准库不同;4、编译方式不同;5、命名空间不同等等。想了解更多c++的相关内容,可以阅读本专题下面的文章。

2024.03.14

2288

9

c++和python学习顺序推荐
c++和python学习顺序推荐

一般建议先学习C++,再学习Python,因为这样可以逐步从较为底层的编程语言向更高级的语言过渡。想了解更多python的相关内容,可以阅读本专题下面的文章。

2024.03.14

1039

6

python和c++学习性价比分析
python和c++学习性价比分析

Python易于学习,广泛应用于Web开发、数据科学和人工智能等领域,但性能较低。C语言性能高,适用于对性能要求较高的场景,如游戏开发和系统编程,但学习曲线陡峭,错误处理复杂。想了解更多python的相关内容,可以阅读本专题下面的文章。

2024.03.14

447

5

c语言和c++一样吗
c语言和c++一样吗

c语言和c++是两种不同的编程语言,虽然有相似之处,但存在显著差异。c语言专注于过程式编程和系统级开发,以简洁、高效著称。c++作为c语言的超集,引入了面向对象编程,增强了代码组织和管理能力,但学习曲线也更陡峭。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

347

5

c语言和c++先学哪个好
c语言和c++先学哪个好

初学者选择学习c语言还是c++语言,需要根据个人学习目标、背景以及编程兴趣和预期应用方向来决定。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

426

5

c语言和c++的区别和联系
c语言和c++的区别和联系

c语言和c++是计算机科学领域应用广泛的编程语言。虽然它们有着相似的基础,但它们在语言类型、语法功能和内存管理方面存在着显著差异。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

600

5

c++软件中文更改教程
c++软件中文更改教程

对于 ide,可通过打开设置,找到语言设置,选择中文,并保存更改。对于非 ide 应用程序,可查找设置或选项,选择语言设置,更改为中文,并保存更改。想了解更多c++的相关内容,可以阅读本专题下面的文章。

2024.03.21

1429

9

python和java和c++学习性价比分析
python和java和c++学习性价比分析

Python以其易学性、丰富的库和活跃的社区而著称,适合数据科学、人工智能和Web开发。Java以其跨平台性、企业级应用开发和Android应用开发而闻名。C++以其底层控制能力、高效性能和游戏开发而著称。选择哪种语言取决于个人兴趣、职业方向和特定需求。想了解更多python和java和c++的相关内容,可以阅读本专题下面的文章。

2024.03.22

1237

7

c++和c语言学习顺序推荐
c++和c语言学习顺序推荐

对于初学者,建议先学习C语言,掌握编程基础后再转入C++,便于理解面向对象编程概念。有编程经验者可直接学习C++,快速接触高级编程技术。想了解更多c++和c语言的相关内容,可以阅读本专题下面的文章。

2024.03.25

1325

9

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ 手册教程
C++ 手册教程

共41课时 | 78.6万人学习

尚学堂ios初级视频教程
尚学堂ios初级视频教程

共77课时 | 21.4万人学习

扣子入门级教程
扣子入门级教程

共0课时 | 297人学习