树莓派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
相关产品推荐
相关产品推荐

