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

树莓派4 Ubuntu系统编译Linux内核eBPF示例出现atomic64_t未定义编译错误求助

编译eBPF程序map_perf_test_kern.c时atomic64_t未定义的解决建议

我来帮你分析一下你碰到的编译错误,结合你的系统信息和编译命令,给出具体的解决办法:

你的系统信息

root@rm-desktop:~/libbpf/src# uname -a
Linux rm-desktop 5.15.0-1011-raspi #13-Ubuntu SMP PREEMPT Thu Jun 2 11:44:34 UTC 2022 aarch64 aarch64 aarch64 GNU/Linux

你使用的编译命令

clang -nostdinc -isystem `clang -print-file-name=include` \
-D__KERNEL__ -D__ASM_SYSREG_H \
-Wno-unused-value -Wno-pointer-sign \
-Wno-compare-distinct-pointer-types \
-Wno-gnu-variable-sized-type-not-at-end \
-Wno-address-of-packed-member -Wno-tautological-compare \
-Wno-unknown-warning-option \
-I/usr/lib/usr/include/ \
-I/root/linux-headers-`uname -r`/include/linux/atomic \
-I/usr/src/linux-headers-`uname -r`/include \
-I/usr/src/linux-headers-`uname -r`/arch/arm64/include \
-I/usr/src/linux-headers-`uname -r`/arch/arm64/include/asm \
-I/usr/src/linux-headers-`uname -r`/arch/arm64/include/uapi \
-I/usr/src/linux-headers-`uname -r`/arch/arm64/include/generated/asm \
-I/usr/src/linux-headers-`uname -r`/arch/arm64/include/generated/uapi \
-I/usr/src/linux-headers-`uname -r`/include/generated/uapi \
-I/usr/src/linux-headers-`uname -r`/include/uapi \
-O2 -emit-llvm -c map_perf_test_kern.c -o -| llc -march=bpf -filetype=obj -o map_perf_test_k_kern.o

编译错误信息

In file included from map_perf_test_kern.c:7:
In file included from /usr/src/linux-headers-5.15.0-1011-raspi/include/linux/skbuff.h:13:
In file included from /usr/src/linux-headers-5.15.0-1011-raspi/include/linux/kernel.h:12:
In file included from /usr/src/linux-headers-5.15.0-1011-raspi/include/linux/bitops.h:33:
In file included from /usr/src/linux-headers-5.15.0-1011-raspi/include/asm/bitops.h:32:
In file included from /usr/src/linux-headers-5.15.0-1011-raspi/include/asm-generic/bitops/lock.h:5:
In file included from /usr/src/linux-headers-5.15.0-1011-raspi/include/linux/atomic.h:80:
/usr/src/linux-headers-5.15.0-1011-raspi/include/linux/atomic/atomic-arch-fallback.h:1273:34: 错误:未知类型名‘atomic64_t’;是否指‘atomic_t’?
arch_atomic64_read_acquire(const atomic64_t *v)
                              ^~~~~~~~~~
                              atomic_t
/usr/src/linux-headers-5.15.0-1011-raspi/include/linux/types.h:168:3: 注:‘atomic_t’在此处声明
} atomic_t;
  ^
In file included from map_perf_test_kern.c:7:
In file included from /usr/src/linux-headers-5.15.0-1011-raspi/include/linux/skbuff.h:13:
In file included from /usr/src/linux-headers-5.15.0-1011-raspi/include/linux/kernel.h:12:
In file included from /usr/src/linux-headers-5.15.0-1011-raspi/include/linux/bitops.h:33:
In file included from /usr/src/linux-headers-5.15.0-1011-raspi/include/asm/bitops.h:32:
In file included from /usr/src/linux-headers-5.15.0-1011-raspi/include/asm-generic/bitops/lock.h:5:
In file included from /usr/src/linux-headers-5.15.0-1011-raspi/include/linux/atomic.h:80:
/usr/src/linux-headers-5.15.0-1011-raspi/include/linux/atomic/atomic-arch-fallback.h:1277:20: 错误:使用未声明的标识符‘atomic64_t’
if (__native_word(atomic64_t)) {
                   ^
/usr/src/linux-headers-5.15.0-1011-raspi/include/linux/atomic/atomic-arch-fallback.h:1277:20: 错误:使用未声明的标识符‘atomic64_t’
/usr/src/linux-headers-5.15.0-1011-raspi/include/linux/atomic/atomic-arch-fallback.h:1277:20: 错误:使用未声明的标识符‘atomic64_t’
/usr/src/linux-headers-5.15.0-1011-raspi/include/linux/atomic/atomic-arch-fallback.h:1277:20: 错误:使用未声明的标识符‘atomic64_t’
/usr/src/linux-headers-5.15.0-1011-raspi/include/linux/atomic/atomic-arch-fallback.h:1280:9: 警告:函数‘arch_atomic64_read’的隐式声明在C99中无效 [-Wimplicit-function-declaration]
ret = arch_atomic64_read(v);

问题分析

这个错误的核心是:编译eBPF程序时,内核头文件没有正确识别目标架构(aarch64),导致atomic64_t类型未被声明。atomic64_t是64位架构下的原子类型,需要特定的宏定义才能让内核头文件导出这个类型。另外你的编译命令里还存在错误的头文件路径,加剧了这个问题。

解决步骤

1. 修复错误的头文件路径

你的编译命令里有一个明显错误的路径:-I/usr/lib/usr/include/,这个路径不存在,应该替换为-I/usr/include/,或者直接移除这个无效路径,避免编译器加载错误的头文件。

2. 添加必要的架构相关宏定义

在编译命令中添加两个关键宏:

  • -D__TARGET_ARCH_arm64:告诉内核头文件我们的目标架构是arm64(aarch64)
  • -D__LP64__:明确当前是64位环境,触发atomic64_t的定义

3. 调整后的编译命令

修改后的完整编译命令如下,你可以直接使用:

clang -nostdinc -isystem $(clang -print-file-name=include) \
-D__KERNEL__ -D__ASM_SYSREG_H -D__TARGET_ARCH_arm64 -D__LP64__ \
-Wno-unused-value -Wno-pointer-sign \
-Wno-compare-distinct-pointer-types \
-Wno-gnu-variable-sized-type-not-at-end \
-Wno-address-of-packed-member -Wno-tautological-compare \
-Wno-unknown-warning-option \
-I/usr/include/ \
-I/root/linux-headers-$(uname -r)/include \
-I/root/linux-headers-$(uname -r)/arch/arm64/include \
-I/root/linux-headers-$(uname -r)/arch/arm64/include/asm \
-I/root/linux-headers-$(uname -r)/arch/arm64/include/uapi \
-I/root/linux-headers-$(uname -r)/arch/arm64/include/generated/asm \
-I/root/linux-headers-$(uname -r)/arch/arm64/include/generated/uapi \
-I/root/linux-headers-$(uname -r)/include/generated/uapi \
-I/root/linux-headers-$(uname -r)/include/uapi \
-O2 -emit-llvm -c map_perf_test_kern.c -o - | llc -march=bpf -filetype=obj -o map_perf_test_kern.o

4. 推荐使用libbpf的标准编译方式(更简单可靠)

手动编写编译命令容易出错,推荐使用libbpf提供的工具或Makefile来编译。创建一个名为Makefile的文件,内容如下:

CLANG ?= clang
LLVM_STRIP ?= llvm-strip
BPF_CFLAGS := -g -O2 -Wall -Wextra -D__TARGET_ARCH_arm64 -D__LP64__ -D__KERNEL__ -D__ASM_SYSREG_H

map_perf_test_kern.o: map_perf_test_kern.c
	$(CLANG) $(BPF_CFLAGS) -target bpf -c $< -o $@
	$(LLVM_STRIP) -g $@ # 可选:移除调试信息,减小目标文件大小

然后在终端运行make命令,就可以自动完成编译,避免手动指定头文件路径的繁琐和错误。

5. 验证内核头文件完整性

如果上述方法仍然无效,可以重新安装对应版本的内核头文件,确保没有缺失或损坏:

apt reinstall linux-headers-5.15.0-1011-raspi

总结

通过修复无效的头文件路径、添加正确的架构宏定义,或者使用libbpf的标准编译方式,应该可以解决atomic64_t未定义的编译错误。这些修改确保了内核头文件能够正确识别目标架构,并导出所需的64位原子类型。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 01:17:39