Linux 内核头文件中的错误

Posted

技术标签:

【中文标题】Linux 内核头文件中的错误【英文标题】:Errors in Linux Kernel headers 【发布时间】:2011-08-29 11:51:40 【问题描述】:

我正在尝试编译一个库,其中包含来自 kernel-devel 包的一些头文件。我链接了适当的头文件,但现在我在这些头文件中遇到编译错误。

/usr/include/asm-generic/bitops/fls64.h: In function ‘int fls64(__u64)’:
/usr/include/asm-generic/bitops/fls64.h:10: error: ‘fls’ was not declared in this scope
/usr/include/asm-generic/bitops/fls64.h:11: error: ‘fls’ was not declared in this scope

还有,这里是来自 asm-generic/bitops/fls64.h 的代码

#ifndef _ASM_GENERIC_BITOPS_FLS64_H_
#define _ASM_GENERIC_BITOPS_FLS64_H_

#include <asm/types.h>

static inline int fls64(__u64 x)

        __u32 h = x >> 32;
        if (h)
                return fls(h) + 32;
        return fls(x);


#endif /* _ASM_GENERIC_BITOPS_FLS64_H_ */

您可以注意到“return fls(h)”,fls() 没有定义。我可以通过包含“fls.h”来解决这个问题,但是我想修复标准内核头文件中的此类错误吗??

任何可以解释为什么会这样以及我可以做些什么来解决这些问题的指针?顺便说一句,我在这里提到的错误只是冰山一角。多个此类标头中有很多此类(缺少声明)错误。

我们将不胜感激。谢谢!

rgds/R.

PS:一些系统细节:

Linux 发行版:CentOS (5.5)

[raj@localhost common]$ uname -a
Linux localhost.localdomain 2.6.18-238.9.1.el5 #1 SMP Tue Apr 12 18:10:56 EDT 2011 i686 i686 i386 GNU/Linux

[raj@localhost common]$ cat /proc/version 
Linux version 2.6.18-238.9.1.el5 (mockbuild@builder10.centos.org) (gcc version 4.1.2 20080704 (Red Hat 4.1.2-50)) #1 SMP Tue Apr 12 18:10:56 EDT 2011

【问题讨论】:

请发布更多编译器的输出。真正的错误可能在您引用的摘录之上。 Robin,我没有发布更多内容,因为我认为这无关紧要。我担心的是我认为标准的 Linux 头文件 fls64.h 正在使用一个没有定义的函数。这正常吗? 我认为这也取决于如何配置内核。代码是标准的,但配置可能有 1000 或更多的可能性。 【参考方案1】:

问题的根源在于您使用的是头文件&lt;asm-generic/fls64.h&gt;,它是内部内核实现的一部分,根本不打算由用户空间使用。事实上,即使在内核中,这个头文件也应该包含在像arch/XXX/include/bitops.h 这样的头文件中,以提供基于架构特定代码中定义的fls()fls64() 的通用实现。

换句话说,该库存在一个问题,即它依赖于内核内部,而这些内核内部并未真正导出到用户空间以供使用,因此可能会因各种内核版本而中断;该库很可能已针对某些较旧的内核构建良好,但这只是运气。

正确的解决方法是让库提供自己的 fls64 定义,而不是依赖于幸运地发现某些随机版本的内核头文件偶然定义了。

【讨论】:

Roland,你能告诉我如何确定哪个文件包含了整个嵌套包含中的某个 .h 文件吗?实际上,我的库并不直接包含这个 fls64.h。我想知道这包括在哪里。我正在使用 gcc。 gcc 报告错误时不告诉你包含链吗?就像“在 /a/b/c 中包含的文件中来自 /a/b/d 来自 /e/f/g...fls 未声明”

以上是关于Linux 内核头文件中的错误的主要内容,如果未能解决你的问题,请参考以下文章

linux 下的内核头文件放在哪里

如何在Linux上安装内核头文件

Linux如何查看内核版本并安装内核头文件linux-headers-generic

[第一节] WSL2 内核编译/安装内核头文件/驱动调试

[第一节] WSL2 内核编译/安装内核头文件/驱动调试

[第一节] WSL2 内核编译/安装内核头文件/驱动调试