TL; DR
我得到了具有正确版本号的Kernelheaders,但是后来在某些内核版本中才引入了函数定义。将来如何摆脱这些定义?
背景
我一直在编写一个kernelmodule,并注意到它没有在pci_bus_address
未定义的错误上在另一台机器上编译。快速调查表明,由于它运行的是3.10内核,所以它是should not be defined,并且此功能仅在3.14之后可用。
我认为快速的#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,14,0))
块应该可以解决此问题。但是,我的主机也正在运行3.10内核。
为什么我的内核头知道某个功能,而该功能只能在更高版本的内核中定义?如何获得不包含此功能的正确内核头文件?
我运行repoquery -i kernel-devel
来显示已安装的版本:
Name : kernel-devel
Version : 3.10.0
Release : 327.18.2.el7
Architecture: x86_64
Size : 34442356
Packager : None
Group : System Environment/Kernel
URL : http://www.kernel.org/
Repository : updates
Summary : Development package for building kernel modules to match the kernel
Source : kernel-3.10.0-327.18.2.el7.src.rpm
Description :
This package provides kernel headers and makefiles sufficient to build modules
against the kernel package.
但是运行
grep pci_bus_addr /usr/src/kernels/3.10.0-327.18.2.el7.x86_64/include/linux/pci.h
返回static inline dma_addr_t pci_bus_address(struct pci_dev *pdev, int bar)
最佳答案
@Ian Abbott指出了正确的方法。事实证明,Redhat打包移植补丁程序。绊倒他们的git仓库我可以pinpoint the change to a specific kernel version。
虽然变更日志中的规范显示了特定的发行版,但我很幸运,而且变更与RHEL_RELEASE_CODE
(由主要和次要厘泊数组成)相关(即,所讨论的变更是在7.1以后的内核中),而不是更改日志中的发布代码,只能在<linux/version.h>
中作为字符串找到(基于字符串的条件编译将是一场噩梦(调用额外的工具来解析字符串并基于此生成头文件)) 。
添加#if (RHEL_RELEASE_VERSION() <= RHEL_RELEASE_CODE)
可以解决问题(非Redhat发行依赖于undefined constants being 0)。
关于linux-kernel - Centos Kernelheaders包括对 future 内核的更改,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37972433/