错误:函数'rdtscl'的隐式声明[-Werror = implicit-function-declaration](但在较早的内核版本上运行时没有错误)

时间:2019-06-28 20:34:10

标签: c linux linux-kernel kernel

我是所有这些的新手,正在尝试在内核版本为3.10.0-957.el7.x86_64的虚拟机上编译程序。但是我得到这个错误:

/home/../../../isr_demux.c: In function 'demux0_isr':
/home/../../../ isr_demux.c: 782:3: error: implicit declaration of function 'rdtscl' [-Werror=implicit-function-declaration]`

我拉出isr_demux.c,发现它说是导致错误的代码片段是这样的: enter image description here

倒数第三行是第782行。有趣的是,该文件在具有较旧内核版本3.10.0-327.el7.x86_64的虚拟机上可以正常编译。

我在网上进行了很多搜索,但确实陷入困境。我看到了另一篇文章并检查了我的头文件,并包括了linux/proc_fs.h和许多其他文件。有人说我可能会缺少函数原型或定义,但是添加原型不能解决此问题,并且定义函数会导致重新定义错误。

关于我是否仍然缺少头文件的任何想法?或者,如果问题出在较新的内核本身上,而我可能需要找到某种补丁?谢谢!

1 个答案:

答案 0 :(得分:0)

网站elixir.bootlin.com对于这些事情非常有用。以下链接是在整个内核源代码树中搜索版本3.10.108中的符号rdtscl的信息。

https://elixir.bootlin.com/linux/v3.10.108/ident/rdtscl

rdtscl仅被定义为一个宏,因此看起来您在关于rdtscl的隐式声明时出错的地方似乎未定义该宏。

将rdtscl定义为宏的两个地方是: https://elixir.bootlin.com/linux/v3.10.108/source/arch/x86/include/asm/msr.h#L182 https://elixir.bootlin.com/linux/v3.10.108/source/arch/x86/include/asm/paravirt.h#L182

因此,解决方法是,如果要针对x86构建文件,则包括正确的头文件(定义那些宏的头在arch / x86中),或用其他方式替换对rdtscl的调用。