1

场景 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

4

1 回答 1

0

如何编写检查功能而不是版本号的代码?在用户空间程序中,我会使用 autoconf 宏AC_CHECK_MEMBER/AC_CHECK_FUNC

标准预处理器的功能比某些人想象的要少得多。它没有能力直接做你想做的事。Autoconf 在这方面也没有提供任何魔法。它只是在配置时执行测试,通常只是通过检查编译器是否接受给定的代码片段,并且主要通过定义预处理器宏来将结果传达给编译器。(并且您负责在条件测试中根据需要使用这些宏,就像您的示例中的那样。)

然而,由于我们讨论的是 Autoconf,只要它针对与您正在构建的内核相对应的内核头文件运行,至少一些 Autoconf 宏应该适合您,并且您应该能够编写自定义 Autoconf 测试为他人。事实上,编译器可以在构建时检测到的任何问题,Autoconf 也应该能够测试。

当然,也可以选择让模块构建器在出现诸如此类的棘手问题时明确指出所需的配置细节。例如,调整特征选择宏以同时注意为构建器保留的符号以用于调整结果。

于 2016-06-22T13:14:38.753 回答