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/

10-10 01:01
查看更多