编译光纤网卡驱动时找不到orc_types.h,是否缺失ARCH类型宏?
问题背景
你手里的这款光纤网卡驱动厂商在2.6内核后就停更了,之前在Fedora 28(4.x内核)能正常编译运行,但换到Fedora 31的5.8.18内核时,编译触发内核scripts/sorttable.c编译失败,报错找不到<asm/orc_types.h>——但这个文件明明存在于/usr/src/kernels/5.8.x/arch/x86/include/asm路径下,且你用的是原生x86架构机器,出现这个问题确实反常。
你的环境是全新安装的Fedora 31,已安装kernel-devel、gcc、elfutils-libelf-devel、make、flex、bison等依赖,驱动的Makefile结构较为复杂。
直接修复方案
1. 给驱动Makefile补全架构参数和头文件路径
找到驱动Makefile里调用内核编译的核心语句(一般是带有-C /usr/src/kernels/...的行),直接追加ARCH=x86参数和头文件搜索路径:
# 将原有编译行修改为如下内容 $(MAKE) ARCH=x86 -C /usr/src/kernels/$(shell uname -r) M=$(PWD) EXTRA_CFLAGS="-I/usr/src/kernels/$(shell uname -r)/arch/x86/include" modules
ARCH=x86用于明确告诉内核编译系统当前架构,避免自动识别异常;EXTRA_CFLAGS强制添加缺失的头文件搜索路径,确保编译器能定位到<asm/orc_types.h>。
2. 检查内核头文件软链接是否正常
Fedora下kernel-devel会在/lib/modules/$(uname -r)/build创建软链接指向内核源码目录,先验证该链接有效性:
ls -l /lib/modules/$(uname -r)/build
若链接损坏或指向错误版本,重新安装对应版本的kernel-devel修复:
sudo dnf reinstall kernel-devel-$(uname -r)
3. 手动预编译sorttable.c绕过错误
5.8内核的sorttable.c依赖ORC相关头文件,旧驱动的编译脚本未适配这个变化。可以先单独编译好该文件,再让驱动使用预编译后的版本:
cd /usr/src/kernels/$(uname -r)/scripts gcc -I/usr/src/kernels/$(uname -r)/arch/x86/include -I/usr/src/kernels/$(uname -r)/include -c sorttable.c -o sorttable.o
将生成的sorttable.o复制到驱动编译时生成的临时目录(通常是驱动源码下的.tmp_versions或scripts子目录),再重新编译驱动。
后续注意事项
- 由于驱动已停止更新,后续更换更高版本内核大概率还会出现其他兼容性问题,建议保留Fedora 28的备份环境用于应急。
- 编译前务必确认
uname -r输出的内核版本与安装的kernel-devel版本完全一致,版本不匹配也会引发各类头文件查找失败问题。
内容的提问来源于stack exchange,提问作者El Ronaldo

