场景 1:我正在尝试IBM
GPFS
使用 vanilla 内核 3.10(实际上kernel-lt
来自 Elrepo)将驱动程序安装到 RHEL6 上。GPL 部分由于以下原因无法编译:
- 传递给函数的参数太多/太少
- struct x 没有这样的成员
- 类型不匹配
他们的代码在比我的旧或新的 RHEL/Suse 内核上编译得很好,但在这里失败了。
场景 2:
我正在尝试使用股票内核编译开源softiwarp
驱动程序RHEL6
,但它失败并出现与场景 1 相同的错误。但是,它在 vanilla 内核上编译得很好。
这一切都是因为它们的功能检查标头如下所示:
#if LINUX_KERNEL_VERSION >= 2061300
#define FOO <newer variant>
#else
#define FOO <older variant>
#endif
但是 RHEL 和 Suse 有许多向后移植和错误修复,所以它们3.10.101
与 vanilla 不同3.10.101
。
如何编写将检查功能而不是版本号的代码?在用户空间程序中,我会使用 autoconf 宏AC_CHECK_MEMBER
/AC_CHECK_FUNC