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

ARM64 Ubuntu20.04容器编译eBPF程序遇__u64未定义错误

解决ARM64 Ubuntu 20.04容器中eBPF编译__u64未定义问题

针对你遇到的clang无法找到__u64类型定义的问题,可尝试以下排查和修复步骤:

1. 调整头文件包含顺序,优先使用内核头文件

你的编译命令中混合了系统用户空间头文件和内核头文件,clang可能优先加载了系统头文件而非内核提供的正确定义。修改编译参数,将内核架构相关的头文件路径放在最前面,去掉可能冲突的系统头文件路径:

RUN clang -O2 -target bpf \
    -I$KERNEL_HEADERS_DIR/arch/arm64/include \
    -I$KERNEL_HEADERS_DIR/arch/arm64/include/uapi \
    -I$KERNEL_HEADERS_DIR/include \
    -I$KERNEL_HEADERS_DIR/include/uapi \
    -I/usr/include/bpf \
    -c ebpf_program.c -o ebpf_program.o

内核头文件中已经包含了ARM64架构所需的类型定义,无需再引用/usr/include/aarch64-linux-gnu下的系统头文件。

2. 在eBPF程序开头显式包含类型定义头文件

__u64类型定义在<linux/types.h>或<asm/types.h>中,而bpf_helper_defs.h并未自动包含这些头文件。在你的ebpf_program.c最顶部添加:

#include <linux/types.h>

确保类型定义在bpf_helper_defs.h之前被加载。

3. 验证内核头文件的完整性

检查内核头文件中是否存在正确的类型定义:

# 进入容器后执行
cat $KERNEL_HEADERS_DIR/arch/arm64/include/asm/types.h

正常情况下,该文件应包含__u64的定义(或通过#include <asm-generic/types.h>间接引入)。如果文件缺失或内容异常,重新安装对应版本的内核头文件:

RUN apt-get purge -y linux-headers-${KERNEL_VERSION} && \
    apt-get install -y linux-headers-${KERNEL_VERSION}

4. 移除多余的符号链接

你创建的/usr/include/asm和/usr/include/asm-generic符号链接可能导致clang错误地加载系统用户空间的头文件,而非内核头文件中的对应内容。删除这些链接:

RUN rm -f /usr/include/asm /usr/include/asm-generic

内核头文件的路径已经通过编译参数指定,无需依赖系统级的符号链接。

5. 添加必要的编译宏定义

部分内核头文件需要特定宏才能导出完整的类型定义,尝试在编译参数中添加-D__KERNEL__和-D__TARGET_ARCH_arm64:

RUN clang -O2 -target bpf \
    -D__KERNEL__ \
    -D__TARGET_ARCH_arm64 \
    -I$KERNEL_HEADERS_DIR/arch/arm64/include \
    -I$KERNEL_HEADERS_DIR/arch/arm64/include/uapi \
    -I$KERNEL_HEADERS_DIR/include \
    -I$KERNEL_HEADERS_DIR/include/uapi \
    -I/usr/include/bpf \
    -c ebpf_program.c -o ebpf_program.o

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 16:24:50