场景 1: 我正在尝试将 IBM
GPFS
驱动程序安装到带有 vanilla 内核 3.10(实际上,kernel -lt
来自 Elrepo)。由于以下原因,GPL 部分无法编译:
- 传递给函数的参数太多/太少
- struct x 没有这样的成员
- 类型不匹配
他们的代码在比我的旧或新的 RHEL/Suse 内核上编译得很好,但在这里失败了。
场景 2:
我正在尝试在 RHEL6
上使用标准内核编译开源 softiwarp
驱动程序,但它失败并出现与场景 1 相同的错误。但是,它在 vanilla 内核上编译得很好.
这一切都是因为他们的功能检查 header 看起来像这样:
#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
最佳答案
How to write code that will check features, not version number? In a user-space program I would use autoconf macros
AC_CHECK_MEMBER
/AC_CHECK_FUNC
标准预处理器的功能比某些人想象的要少得多。它没有能力直接做你想做的事。 Autoconf 在这方面也没有提供魔法。它只是在配置时执行测试,通常只是通过检查编译器是否接受给定的代码片段,并且主要通过定义预处理器宏来将结果传达给编译器。 (并且您有责任在条件测试中根据需要使用这些宏,就像您的示例中的那样。)
然而,由于我们谈论的是 Autoconf,只要它针对与您正在构建的内核相对应的内核头文件运行,至少一些 Autoconf 宏应该对您有用,并且您应该能够编写为其他人定制 Autoconf 测试。事实上,编译器可以在构建时检测到的任何问题,Autoconf 也应该能够测试。
当然,也可以选择让模块构建器能够在出现此类棘手问题时明确指示所需的配置详细信息。例如,调整特征选择宏以同时注意为构建器保留的用于调整结果的符号。
关于c - 对内核模块源代码进行适当的功能检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37968134/