You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WSL Ubuntu22.04运行XDP程序遇bpf_helpers.h缺失等编译错误

解决WSL2 Ubuntu22.04编译eBPF/XDP程序的常见错误

问题本质

你遇到的struct bpf_timer类型不完整、BPF_PSEUDO_FUNC未声明、头文件明明存在却提示找不到的问题,核心原因是WSL2内核特性支持滞后、libbpf版本与编译路径不匹配、内核头文件缺失或未正确引用这几点。

具体解决方案

1. 编译时显式指定头文件路径

即便/usr/include/bpf/bpf_helpers.h存在,编译器可能默认未搜索该路径。编译命令里必须加上-I/usr/include/bpf参数:

clang -target bpf -D__TARGET_ARCH_x86_64 -I/usr/include/bpf -O2 -c your_xdp_prog.c -o your_xdp_prog.o

2. 安装对应版本的内核头文件

WSL2不会默认安装内核头文件,执行以下命令补上:

sudo apt update && sudo apt install linux-headers-$(uname -r)

如果Ubuntu官方源没有匹配WSL2内核的头包,直接用下文的CO-RE模式编译即可,无需依赖特定内核头文件。

3. 更新libbpf到最新版本

Ubuntu22.04默认的libbpf-dev版本偏旧,不支持BPF_PSEUDO_FUNC这类新宏。手动从源码编译安装最新版:

git clone https://github.com/libbpf/libbpf.git
cd libbpf/src
make
sudo make install
sudo ldconfig

之后编译时要指向新安装的头文件路径:

clang -target bpf -D__TARGET_ARCH_x86_64 -I/usr/local/include/bpf -O2 -c your_xdp_prog.c -o your_xdp_prog.o

4. 启用CO-RE模式编译

CO-RE(Compile Once - Run Everywhere)模式能摆脱对特定内核版本头文件的依赖,同时解决struct bpf_timer类型不完整的问题。编译时添加-D__BPF_CORE_READ参数:

clang -target bpf -D__TARGET_ARCH_x86_64 -D__BPF_CORE_READ -I/usr/local/include/bpf -O2 -c your_xdp_prog.c -o your_xdp_prog.o

如果用BPF skeleton(推荐写法),可以基于libbpf-bootstrap模板编写代码,自动处理所有依赖。

5. 检查WSL2内核的eBPF特性开关

确认内核开启了必要的eBPF配置:

zcat /proc/config.gz | grep -E 'CONFIG_BPF|CONFIG_XDP|CONFIG_BPF_TIMERS'

必须保证以下配置为y或m:

  • CONFIG_BPF=y
  • CONFIG_BPF_SYSCALL=y
  • CONFIG_XDP_SOCKETS=y
  • CONFIG_BPF_TIMERS=y
    如果配置缺失,需要自定义编译WSL2内核:微软提供了WSL2内核源码,修改.config后编译替换系统内核即可。

内容的提问来源于stack exchange,提问作者boomerang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 22:50:22